Практикум Prometheus — типы метрик и PromQL
Четыре типа метрик
| Тип | Смысл | Пример | Запрос |
|---|---|---|---|
| Counter | Монотонно растёт (сброс при рестарте) | http_requests_total | rate(...[5m]) |
| Gauge | Может расти и падать | node_memory_MemAvailable_bytes | значение как есть |
| Histogram | Распределение по bucket | http_request_duration_seconds_bucket | histogram_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 |
|---|---|
| Доступность target | up{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)
Ошибки новичков
rateна Gauge — бессмысленно или вводит в заблуждение.- Слишком короткое окно
[1m]при scrape 30s — шум и пропуски. - Агрегация без
by— случайное суммирование разных label sets. - Игнор
_bucket— перцентиль только черезhistogram_quantile.
Готовые запросы с разбором — галерея PromQL и Grafana. В UI Prometheus (:9090) выполните также упражнения из workshop.md (раздел PromQL). Добавьте node_exporter на шаге 5 и постройте график CPU и disk.
Чек-лист
- Объяснить разницу Counter и Gauge на примере
- Написать
rate()для counter иhistogram_quantileдля latency - Отфильтровать метрики по label через regex
Дальше — Grafana.