Что такое 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
- В Source выбирается Prometheus.
- В поле запроса пишется PromQL-выражение.
- Переменные ($instance, $job, $interval) можно использовать для фильтрации и масштабирования.
- Для логов (Loki) используется LogQL — это другой язык.
Советы
- Для счётчиков всегда используйте rate() или increase().
- Для метрик gauge (например, температура, RAM) — avg_over_time(), max_over_time().
- Старайтесь не использовать irate() без необходимости — это шумная метрика.
- Используйте recording rules, если запрос тяжёлый и часто повторяется.
- В алертах указывайте for: 1m или больше — это исключает ложные срабатывания.
Заключение
PromQL — мощный инструмент анализа и диагностики, особенно в связке с Grafana. Он требует привыкания, но даёт полный контроль над данными и мониторингом.