Перейти к основному содержимому

Практикум Prometheus — типы метрик и PromQL

Инженеру Разработчику

Практикум, шаг 3 из 9. Назад — установка. Дальше — Grafana.


Четыре типа метрик

ТипСмыслПримерЗапрос
CounterМонотонно растёт (сброс при рестарте)http_requests_totalrate(...[5m])
GaugeМожет расти и падатьnode_memory_MemAvailable_bytesзначение как есть
HistogramРаспределение по buckethttp_request_duration_seconds_buckethistogram_quantile
SummaryКвантили на клиентеrpc_duration_secondsреже в новых SDK

Туториал — Understanding metric types.


Counter — скорость событий

Counter фиксирует «сколько раз произошло». Для графика «запросов в секунду»:

rate(http_requests_total[5m])
  • rate — средняя скорость за окно, учитывает сброс counter.
  • [5m] — lookback; должно быть ≥ 2 * scrape_interval.

Сумма по всем instance:

sum(rate(http_requests_total[5m])) by (job)

Фильтр по статусу 5xx:

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

Gauge — текущее значение

Загрузка CPU (idle — доля простоя):

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

Свободная память:

node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100

Gauge не оборачивают в rate без необходимости.


Histogram — latency и перцентили

Histogram создаёт ряды _bucket, _sum, _count. P99 latency:

histogram_quantile(
0.99,
sum by (le, job) (rate(http_request_duration_seconds_bucket[5m]))
)

le — upper bound bucket; обязателен в sum by.


Селекторы и операторы

# точное совпадение
http_requests_total{job="api", method="GET"}

# regex
http_requests_total{status=~"5.."}

# отрицание
http_requests_total{status!="200"}

# арифметика между рядами (одинаковые labels!)
node_filesystem_avail_bytes / node_filesystem_size_bytes * 100

Recording rules (предвычисление) — в rules/*.yml, подключаются в prometheus.yml:

groups:
- name: example
rules:
- record: job:http_requests:rate5m
expr: sum by (job) (rate(http_requests_total[5m]))

Типовые запросы для инфраструктуры

ВопросPromQL
Доступность targetup{job="node"}
Диск заполнен >90%(1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 90
Ошибки HTTP доляsum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
Scrape тормозитscrape_duration_seconds > 1

PromQL в Grafana

Те же выражения копируются в панели Grafana (шаг 4). Переменные:

sum(rate(http_requests_total{job="$job"}[5m])) by (status)

Ошибки новичков

  1. rate на Gauge — бессмысленно или вводит в заблуждение.
  2. Слишком короткое окно [1m] при scrape 30s — шум и пропуски.
  3. Агрегация без by — случайное суммирование разных label sets.
  4. Игнор _bucket — перцентиль только через histogram_quantile.
Практика

В UI Prometheus (:9090) выполните запросы из workshop.md (раздел PromQL). Добавьте node_exporter на шаге 5 и постройте график CPU и disk.


Чек-лист

  • Объяснить разницу Counter и Gauge на примере
  • Написать rate() для counter и histogram_quantile для latency
  • Отфильтровать метрики по label через regex

Дальше — Grafana.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").