Правило записи Prometheus для сохранения максимального значения (скорости счетчика)

#linux #kubernetes #devops #prometheus

#linux #kubernetes #devops #prometheus

Вопрос:

Я столкнулся с одной диллемой. По соображениям производительности я создаю правила записи для своих показателей запроса / секунды Nginx.

Исходный запрос

 sum(rate(nginx_http_request_total[5m]))
  

Правило записи

     rules:
    - expr: sum(rate(nginx_http_requests_total[5m])) by (cache_status, host, env, status)
      record: job:nginx_http_requests_total:rate:sum:5m
  

В исходном запросе я вижу, что мой максимальный трафик составляет 6,6тыс., а в правиле записи — 6,2 тыс. Это разница в 400 TPS.

Это показатель за последнюю неделю

Последние 7 дней

Вопрос :

Есть ли какой-либо способ получить максимальное значение исходного запроса и сохранить его как правило записи. Поскольку это TPS, меня интересует только max, а не min.

Комментарии:

1. Вы когда-нибудь узнали, как этого избежать? Сталкиваюсь с аналогичными проблемами и не могу принять разницу в стоимости.

Ответ №1:

Я думаю, что наличие разницы в 6% по значению в каком-то очень коротком пакете вполне нормально.

В вашем запросе вы получаете (и записываете) среднее значение TPS за последние 5 минут. Там не выполняется «max». Значение будет меняться в зависимости от точного времени вычисления запроса — возможно, поэтому вы видите разницу между необработанным запросом и значениями, сохраненными правилом записи. Prometheus будет экстраполировать некоторые данные при выполнении таких функций, как rate() . Если у вас есть последняя точка данных в момент времени t, но запрос выполняется через t 30 секунд, тогда Prometheus попытается экстраполировать значение через t 30 секунд (часто это замечается, поскольку счетчик для дискретных событий показывает дробные значения)

Возможно, вы захотите использовать функцию irate (), если вам действительно нужны пиковые значения. При каждой оценке будут использоваться две самые последние точки для вычисления наибольшего текущего увеличения, в отличие от среднего значения за X минут, которое обеспечивает rate() .