PromQL — руководство для использования с Prometheus и Grafana

Что такое PromQL

PromQL (Prometheus Query Language) — язык запросов, позволяющий извлекать, фильтровать, агрегировать и обрабатывать временные ряды метрик. Он используется в:

  • веб-интерфейсе Prometheus (/graph);
  • правилах алертинга (alert.rules.yml);
  • панелях Grafana (графики, таблички, алерты);
  • скриптах и CLI-утилитах (promtool, curl).

Типы запросов

1. Instant Query (один момент времени)

Показывает значение метрики на определённое время (по умолчанию — “сейчас”).

Примеры:

node_memory_MemAvailable_bytes
node_cpu_seconds_total{mode="user"}

2. Range Query (временной интервал)

Позволяет обработать метрику за интервал времени с помощью функции.

Примеры:

rate(http_requests_total[5m])
avg_over_time(node_load1[1h])

Работа с метками (labels)

Фильтрация по меткам:

http_requests_total{job="nginx", status="500"}

Поддержка регулярных выражений:

http_requests_total{status=~"5.."}
node_cpu_seconds_total{mode!="idle"}

Арифметика

PromQL поддерживает базовые операторы:

  • +, -, *, /, %, ^
  • сравнение: ==, !=, >, <, >=, <=
  • логические: and, or, unless

Примеры:

100 * (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
rate(errors_total[5m]) / rate(requests_total[5m])

Агрегации

Формат:

sum(metric) by (label)
avg(metric) without (label)

Примеры:

sum(rate(http_requests_total[1m])) by (job)
avg_over_time(cpu_load_1m[30m])
count(node_cpu_seconds_total) by (mode)

Полезные операторы:

  • sum, avg, min, max, count, stddev, stdvar
  • topk(k, …), bottomk(k, …)

Часто используемые функции

ФункцияНазначение
rate()Скорость роста счётчика (пример: RPS)
irate()Более “острая” версия rate, точнее для алертов
increase()Общее увеличение счётчика за интервал
avg_over_time()Среднее значение метрики за период
max_over_time()Максимум значения метрики за период
count_over_time()Количество значений метрики за период
abs(), clamp_max(), deriv() и другие — есть множество полезных функций

Примеры практических запросов

Загрузка CPU (без idle):

avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)

Процент использования оперативной памяти:

100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))

Ошибки HTTP 5xx:

sum(rate(http_requests_total{status=~"5.."}[5m])) by (instance)

Наиболее активные юниты systemd (через node-exporter):

topk(5, rate(node_systemd_unit_start_time_seconds[5m]))

Температура или hwmon:

node_hwmon_temp_celsius{chip=~".*", sensor="temp1"}

Использование в Grafana

  1. В Source выбирается Prometheus.
  2. В поле запроса пишется PromQL-выражение.
  3. Переменные ($instance, $job, $interval) можно использовать для фильтрации и масштабирования.
  4. Для логов (Loki) используется LogQL — это другой язык.

Советы

  • Для счётчиков всегда используйте rate() или increase().
  • Для метрик gauge (например, температура, RAM) — avg_over_time(), max_over_time().
  • Старайтесь не использовать irate() без необходимости — это шумная метрика.
  • Используйте recording rules, если запрос тяжёлый и часто повторяется.
  • В алертах указывайте for: 1m или больше — это исключает ложные срабатывания.

Заключение

PromQL — мощный инструмент анализа и диагностики, особенно в связке с Grafana. Он требует привыкания, но даёт полный контроль над данными и мониторингом.