Агрегация: 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 и считайте квантиль после агрегации.
Проверьте себя
1. Что делает sum by (status) (...) ?
AУдаляет лейбл status
BСуммирует ряды, сохраняя разбивку только по лейблу status
CСортирует по status
DФильтрует ряды по значению
2. Почему доля ошибок может вернуть пустой результат?
AИз-за слишком большого интервала
BЧислитель и знаменатель агрегированы по разным наборам лейблов и не матчатся
Crate() не работает с делением
DНужно использовать irate
3. Что обязательно сохранить при агрегации перед histogram_quantile?
AЛейбл instance
BЛейбл le (границы корзин)
CЛейбл job
DИмя метрики