Как рассчитать среднее время ответа бэкенда, используя данные логов Nginx Ingress в Grafana с помощью Loki?

Я пытаюсь рассчитать среднее время ответа от бэкенда, используя данные из логов ingress. Однако у меня не получается достичь желаемого результата. На данный момент мне удается получить время только по запросам. Можете помочь мне разобраться с этим? 

```javascript
{job="default/ingress-nginx"} 
|= `default-backend-dev-80` != `Blackbox Exporter` 
| pattern `<remote_addr> <_> <_> [<time_local>] "<metod> <url> <protocol>" <status> <body_bytes_sent> "<http_referer>" "<http_user_agent>" <request_length> <request_time> [<proxy_upstream_name>] [<proxy_alternative_upstream_name>] <upstream_addr> <upstream_response_length> <upstream_response_time> <upstream_status> <req_id>` 
| line_format `time={{.upstream_response_time}}` | logfmt
```
  • 24 сентября 2024 г. 14:43
Ответы на вопрос 2
Для того чтобы рассчитать среднее время ответа бэкенда с использованием логов Nginx Ingress в Grafana с помощью Loki, нужно правильно извлечь временные метрики из логов. В вашем случае, вы уже используете правильный начальный шаблон для фильтрации. 

Давайте я помогу вам улучшить ваш запрос чтобы вы могли получить среднее время ответа.

### Шаги для получения среднего времени ответа:

1. **Извлечение времени ответа от бэкенда**: Ваша строка `line_format` выглядит корректно, однако чтобы получить не только значения временных метрик, но и провести с ними дальнейшие вычисления, довольно эффективно будет использовать `rate`, `avg` или другие функции агрегации.

2. **Используйте агрегацию**: Подсчитаем среднее время ответа от бэкенда с помощью функции `avg()`, примененной к `upstream_response_time`.

Вот пример запроса, который вы можете использовать:

```prometheus
sum(rate({job="default/ingress-nginx"} 
|= `default-backend-dev-80` 
!= `Blackbox Exporter` 
| pattern `<remote_addr> <_> <_> [<time_local>] "<metod> <url> <protocol>" <status> <body_bytes_sent> "<http_referer>" "<http_user_agent>" <request_length> <request_time> [<proxy_upstream_name>] [<proxy_alternative_upstream_name>] <upstream_addr> <upstream_response_length> <upstream_response_time> <upstream_status> <req_id>` 
| line_format `time={{.upstream_response_time}}` | logfmt)[5m]) 
/
count(rate({job="default/ingress-nginx"} 
|= `default-backend-dev-80` 
!= `Blackbox Exporter` 
| pattern `<remote_addr> <_> <_> [<time_local>] "<metod> <url> <protocol>" <status> <body_bytes_sent> "<http_referer>" "<http_user_agent>" <request_length> <request_time> [<proxy_upstream_name>] [<proxy_alternative_upstream_name>] <upstream_addr> <upstream_response_length> <upstream_response_time> <upstream_status> <req_id>` 
| line_format `time={{.upstream_response_time}}` | logfmt)[5m])
```

### Объяснение:

- `sum(rate(...))`: Вычисляет общее время ответа за указанный период (5 минут) с помощью функции `rate()`.
- `count(rate(...))`: Подсчитывает общее количество запросов за тот же период, для того чтобы потом можно было разделить сумму времени ответа на количество запросов.
  
Если вы хотите получить значения за другой временной интервал, просто замените `5m` на желаемый период, например `1m` или `10m`.

### Результат:

В результате вы получите среднее время ответа от бэкенда. Если какую-то часть запроса нужно доработать или изменить основываясь на ваших специфических логах, просто подгоните соответствующее регулярное выражение или фильтры.
Как-то так: 
avg_over_time({job="default/ingress-nginx"}
|= `default-backend-dev-80`
!= `Blackbox Exporter`
| pattern `… <upstream_response_time> …`
| unwrap upstream_response_time
| __error__=`` [$__interval])

Вместо $__interval можно указать конкретное значение. Ещё пара примеров .
Похожие вопросы