Основы PromQL: селекторы и rate

Урок вводит язык запросов PromQL: как выбрать нужные ряды и посчитать скорость роста счётчика.

PromQL — язык запросов Prometheus, на котором вы выбираете временные ряды, фильтруете их по лейблам и применяете функции.

Дашборды и алерты — это, по сути, PromQL-запросы. Освоив язык, вы перестаёте зависеть от готовых панелей и можете спросить у системы что угодно.

Селекторы и лейблы

Простейший запрос — имя метрики: оно вернёт мгновенный вектор (instant vector) — по одному текущему значению на каждый ряд. Фильтр по лейблам пишут в фигурных скобках.

http_requests_total{job="web", status="200"}

Поддерживаются операторы сопоставления лейблов: = (равно), != (не равно), =~ (регулярка), !~ (не подходит под регулярку).

# все ряды, где статус начинается на 5 (5xx-ошибки)
http_requests_total{status=~"5.."}

Диапазоны и rate

Чтобы посчитать скорость роста counter, нужен range-vector — данные за интервал в квадратных скобках, например [5m]. Функция rate() делит прирост счётчика на время и устойчива к рестартам.

# запросов в секунду, усреднённо за 5 минут
rate(http_requests_total[5m])

Есть похожая irate() — мгновенная скорость по двум последним точкам, она «нервнее» и хороша для коротких всплесков.

Сравнения и фильтрация

PromQL умеет фильтровать ряды по значению. Сравнение возвращает только подходящие ряды — это удобно для поиска проблемных целей.

# цели, где скорость ошибок больше 0.5 в секунду
rate(errors_total[5m]) > 0.5

Как работает под капотом

Любой запрос PromQL возвращает один из типов: instant vector (по точке на ряд), range vector (серия точек за интервал), скаляр или строка. Функции вроде rate() принимают range vector и отдают instant vector. Поэтому нельзя написать rate(metric) без диапазона — функции нужны точки за интервал, чтобы посчитать наклон.

metric           -> instant vector  (текущее значение)
metric[5m]       -> range vector     (точки за 5 минут)
rate(metric[5m]) -> instant vector   (скорость роста)

Частые ошибки

  • Применять rate() без диапазона. Без [5m] запрос невалиден — нужен range vector.
  • Брать слишком короткий интервал. rate(metric[15s]) при scrape_interval 15s часто даёт пропуски — берите минимум 4 scrape-интервала.
  • Считать rate() от gauge. Имеет смысл только для counter.

Итог

  • Голое имя метрики даёт instant vector; фильтр по лейблам — в фигурных скобках.
  • rate(counter[5m]) считает скорость роста счётчика устойчиво к рестартам.
  • Сравнение через >/< фильтрует ряды по значению.
Проверьте себя
1. Зачем в rate(http_requests_total[5m]) нужны квадратные скобки [5m]?
AЭто комментарий
BЧтобы передать функции range vector — точки за интервал
CЧтобы задать имя метрики
DЧтобы ограничить число лейблов
2. Как выбрать ряды, где статус начинается на 5 (5xx)?
Astatus=5
Bstatus=~"5.."
Cstatus!=200
Dstatus>500
3. К какому типу метрик корректно применять rate()?
Agauge
Bcounter
Csummary-квантили
Dстроковые метрики