Справочники
Шпаргалка PromQL
Селекторы, rate и increase, агрегации, процентили по гистограммам, сопоставление векторов, готовые запросы и правила алертов — с объяснением частых ошибок.
Показано 68 из 68 запросов.
Селекторы
Мгновенный вектор — последнее значение каждого ряда. Диапазон в квадратных скобках превращает его в набор точек за период: такой вектор нельзя нарисовать, его передают в функции вроде rate().
http_requests_total
Все ряды метрики с любыми метками.
http_requests_total{job="api", method="GET"}
Точное совпадение меток; условия объединяются через И.
http_requests_total{status!="200"}
Метка не равна значению.
http_requests_total{status=~"5.."}
Совпадение с регуляркой: все пятисотые. Регулярка привязана к началу и концу строки целиком.
http_requests_total{path!~"/health|/metrics"}
Исключить ряды по регулярке.
{__name__=~"node_cpu.*"}
Выбрать метрики по шаблону имени.
http_requests_total[5m]
Диапазонный вектор: все точки за последние 5 минут.
http_requests_total offset 1h
Значение час назад — для сравнения «сейчас против прошлого».
http_requests_total @ 1735689600
Значение на конкретный момент (unix-время).
rate(http_requests_total[5m])[1h:1m]
Подзапрос: вычислить выражение за час с шагом в минуту и получить диапазонный вектор.
5m, 1h30m, 2d, 1w
Длительности: ms, s, m, h, d, w, y; единицы можно сочетать по убыванию.
Счётчики: rate и increase
Счётчик только растёт и сбрасывается при рестарте процесса. Сырой счётчик на графике бесполезен — почти всегда нужен rate() или increase(), которые умеют пережить сброс.
rate(http_requests_total[5m])
Среднее число событий в секунду за 5 минут. Главная функция для счётчиков.
irate(http_requests_total[5m])
Скорость по двум последним точкам: реагирует мгновенно, но дёргается. Для алертов не годится.
increase(http_requests_total[1h])
Прирост за час. Это rate × длительность, поэтому результат бывает дробным.
sum(rate(http_requests_total[5m]))
Сначала rate по каждому ряду, потом сумма. Наоборот нельзя: сумма счётчиков прячет их сбросы.
resets(process_cpu_seconds_total[1h])
Сколько раз счётчик сбрасывался — косвенно, сколько было рестартов.
rate(x[$__rate_interval])
В Grafana: окно, которое сама Grafana подбирает под интервал опроса.
Датчики и функции по времени
Датчик (gauge) может расти и падать: память, температура, длина очереди. К нему применяют *_over_time и delta, а не rate.
delta(node_memory_Active_bytes[1h])
Изменение датчика за час: последнее значение минус первое.
deriv(queue_length[15m])
Скорость изменения датчика в секунду по линейной регрессии.
predict_linear(node_filesystem_avail_bytes[6h], 24 * 3600)
Сколько места останется через сутки при текущем темпе.
avg_over_time(temperature_celsius[10m])
Среднее за 10 минут; есть также min_, max_, sum_, count_, last_over_time.
quantile_over_time(0.95, response_time_seconds[1h])
95-й процентиль значений ряда за час.
changes(kube_deployment_status_observed_generation[1d])
Сколько раз значение менялось за сутки.
absent(up{job="api"})
Вернёт 1, если ни одного ряда нет. Для алерта «метрика пропала».
absent_over_time(up{job="api"}[15m])
Вернёт 1, если ряда не было весь период.
Агрегации
by (…) оставляет перечисленные метки, without (…) выбрасывает перечисленные и оставляет остальные.
sum by (job) (rate(http_requests_total[5m]))
Запросов в секунду по каждому сервису.
sum without (instance) (rate(http_requests_total[5m]))
Сложить по всем экземплярам, сохранив прочие метки.
avg by (instance) (node_load1)
Среднее по группе; есть также min, max, count, stddev, stdvar.
count by (version) (app_build_info)
Сколько экземпляров работает на каждой версии.
topk(5, sum by (path) (rate(http_requests_total[5m])))
Пять самых нагруженных адресов; bottomk — наоборот.
quantile(0.9, rate(http_requests_total[5m]))
90-й процентиль среди рядов в один момент (не по времени).
count_values("version", app_version)
Посчитать ряды с одинаковым значением и вынести значение в метку.
group by (job) (up)
Уникальные сочетания меток, значение всегда 1.
Гистограммы и процентили
Классическая гистограмма — это набор счётчиков _bucket с меткой le (верхняя граница корзины). Процентиль считается по корзинам приближённо: точность зависит от их границ.
histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
95-й процентиль времени ответа по всему сервису. Метку le в by оставлять обязательно.
histogram_quantile(0.99, sum by (le, path) (rate(http_request_duration_seconds_bucket[5m])))
99-й процентиль отдельно для каждого адреса.
sum(rate(http_request_duration_seconds_sum[5m])) / sum(rate(http_request_duration_seconds_count[5m]))
Среднее время ответа из _sum и _count.
sum(rate(http_request_duration_seconds_bucket{le="0.3"}[5m])) / sum(rate(http_request_duration_seconds_count[5m]))
Доля запросов быстрее 300 мс — основа SLO по задержке. Граница должна совпадать с существующей корзиной.
Операторы и сопоставление
Арифметика между двумя векторами сопоставляет ряды с одинаковым набором меток. Если наборы разные, нужны on() / ignoring(), а для связи «многие к одному» — group_left или group_right.
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
Деление рядов с одинаковыми метками.
up == 0
Сравнение фильтрует: остаются только ряды, где условие истинно.
up == bool 0
С bool сравнение не фильтрует, а возвращает 1 или 0.
a and b · a or b · a unless b
Множественные операции по наборам меток: пересечение, объединение, разность.
rate(errors_total[5m]) / on (job) rate(requests_total[5m])
Сопоставлять только по метке job.
rate(errors_total[5m]) / ignoring (code) rate(requests_total[5m])
Сопоставлять по всем меткам, кроме code.
rate(http_requests_total[5m]) * on (instance) group_left (version) app_build_info
Приклеить метку version из другой метрики («многие к одному»).
label_replace(up, "host", "$1", "instance", "(.*):.*")
Новая метка host из instance без порта.
clamp_min(x, 0) · clamp_max(x, 100) · round(x, 0.1)
Ограничить значение снизу, сверху и округлить до шага.
sum(rate(x[5m])) or vector(0)
Показать 0 вместо пустоты, когда рядов нет.
Готовые запросы
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
Доля ошибок 5xx.
100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
Загрузка процессора в процентах (node_exporter).
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
Занятая память в процентах.
(1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) * 100
Заполненность дисков без временных ФС.
predict_linear(node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}[6h], 4 * 3600) < 0
Диск закончится в ближайшие 4 часа.
count by (job) (up == 0)
Сколько целей каждого сервиса Prometheus не смог опросить.
increase(kube_pod_container_status_restarts_total[1h]) > 3
Контейнеры, перезапускавшиеся больше трёх раз за час.
sum by (pod) (rate(container_cpu_usage_seconds_total{container!=""}[5m]))
Процессор по подам в Kubernetes (cAdvisor).
rate(http_requests_total[5m]) / rate(http_requests_total[5m] offset 1w)
Нагрузка относительно того же времени неделю назад.
time() - process_start_time_seconds
Сколько секунд процесс работает без рестарта.
Правила алертов и записи
Файл правил подключается в prometheus.yml через rule_files. Проверить синтаксис — promtool check rules rules.yml.
groups: - name: base rules: - alert: InstanceDown expr: up == 0 for: 5m labels: severity: critical annotations: summary: "{{ $labels.instance }} не отвечает"
Алерт срабатывает, только если условие держится 5 минут подряд (for).
- record: job:http_requests:rate5m expr: sum by (job) (rate(http_requests_total[5m]))
Правило записи: заранее посчитанный ряд для тяжёлых дашбордов. Имя принято писать как уровень:метрика:операции.
promtool check rules rules.yml
Проверить файл правил до перезагрузки Prometheus.
curl -X POST http://localhost:9090/-/reload
Перечитать конфиг; работает, только если Prometheus запущен с --web.enable-lifecycle.
promtool query instant http://localhost:9090 'up == 0'
Выполнить запрос из консоли.
Ловушки
rate(x[1m]) при опросе раз в 30 с
Окно должно вмещать хотя бы 4 опроса, иначе точек не хватит и ряды будут пропадать.
rate(sum(x)[5m:])
Сумма перед rate теряет сбросы счётчиков — всегда rate, потом sum.
rate(memory_bytes[5m])
rate на датчике даёт бессмыслицу: у датчика нет сбросов, есть падения.
histogram_quantile(0.95, rate(x_bucket[5m]))
Без sum by (le) процентиль считается по каждому экземпляру отдельно — обычно это не то, что нужно.
avg(histogram_quantile(...))
Среднее процентилей не равно процентилю: складывать нужно корзины, а не результаты.
http_requests_total{user_id="…"}
Метки с неограниченным числом значений (id, email, полный URL) взрывают число рядов и память.