На главную

Справочники

Шпаргалка 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) взрывают число рядов и память.