Агрегация: sum, by и продвинутые запросы
Урок учит сворачивать множество рядов в осмысленные числа: агрегация и группировка в PromQL.
Агрегация в PromQL — это свёртка многих временных рядов в меньшее число с помощью операторов вроде
sum,avg,maxи группировки по лейблам.
После rate() у вас часто десятки рядов: по инстансам, статусам, методам. Чтобы получить «общую нагрузку сервиса», их нужно сложить. Этим занимается агрегация.
Операторы агрегации
Базовые операторы: sum (сумма), avg (среднее), min, max, count. Без уточнений они сворачивают все ряды в один.
# суммарная нагрузка по всем инстансам, запросов в секунду
sum(rate(http_requests_total[5m]))Группировка by и without
Чтобы сохранить разбивку, добавляют by(...) — оставить только эти лейблы — или without(...) — убрать только эти.
# нагрузка с разбивкой по статусу ответа
sum by (status) (rate(http_requests_total[5m]))
# то же, но "схлопнуть" различия по инстансу
sum without (instance) (rate(http_requests_total[5m]))Полезные составные запросы
Доля ошибок — классический RED-запрос: ошибки делим на весь трафик.
# доля 5xx-ошибок по сервису
sum by (service) (rate(http_requests_total{status=~"5.."}[5m]))
/
sum by (service) (rate(http_requests_total[5m]))Процентиль задержки по гистограмме — через histogram_quantile поверх агрегированных корзин.
# p99 задержки
histogram_quantile(
0.99,
sum by (le) (rate(http_request_duration_seconds_bucket[5m]))
)Как работает под капотом
Деление и другие бинарные операции в PromQL сопоставляют ряды по совпадающим лейблам. Поэтому в числителе и знаменателе доли ошибок важно агрегировать по одному и тому же набору лейблов (by (service)): иначе ряды не «сматчатся» и результат окажется пустым. При работе с гистограммой обязательно сохраняйте лейбл le (границы корзин) — без него histogram_quantile не сможет восстановить распределение.
Частые ошибки
- Забыть
by (le)в histogram_quantile. Без границ корзин запрос вернёт мусор или пустоту. - Несовпадающие лейблы в делении. Если числитель и знаменатель агрегированы по разным
by, доля ошибок будет пустой. - Сначала квантиль, потом сумма. Правильный порядок — сперва
sum by (le), потомhistogram_quantile.
Итог
sum,avg,maxсворачивают ряды;by/withoutуправляют разбивкой.- Доля ошибок — деление двух одинаково сгруппированных
rate. - Для процентилей сохраняйте лейбл
leи считайте квантиль после агрегации.