Правила записи и алертинга
Урок про два вида правил Prometheus: предрасчёт метрик и описание алертов.
Правило (rule) в Prometheus — это заранее заданное PromQL-выражение, которое Prometheus периодически вычисляет: либо чтобы сохранить результат как новую метрику, либо чтобы поднять алерт.
Тяжёлые запросы на дашбордах тормозят, а условия алертов хочется описать декларативно. Обе задачи решают правила, которые подключаются в конфиг через rule_files.
Recording rules
Recording rule заранее вычисляет выражение и сохраняет его как новый ряд. Дашборд потом читает готовую метрику — быстро и без повторного тяжёлого расчёта.
groups:
- name: http.rules
rules:
- record: job:http_requests:rate5m
expr: sum by (job) (rate(http_requests_total[5m]))Alerting rules
Alerting rule описывает условие, при котором поднимается алерт. Ключевое поле for требует, чтобы условие держалось заданное время, — это гасит ложные срабатывания на мгновенных всплесках.
groups:
- name: availability.rules
rules:
- alert: HighErrorRate
expr: |
sum by (job) (rate(http_requests_total{status=~"5.."}[5m]))
/ sum by (job) (rate(http_requests_total[5m])) > 0.05
for: 10m
labels:
severity: critical
annotations:
summary: "Высокая доля ошибок в {{ $labels.job }}"
description: "5xx превышают 5% уже 10 минут"Состояния алерта
Алерт проходит через состояния: inactive (условие ложно), pending (условие истинно, но ещё не прошло время for) и firing (условие держится дольше for). Только firing-алерты уходят в Alertmanager.
inactive --условие истинно--> pending --держится for--> firing
^------------------ условие снова ложно ----------------+Как работает под капотом
Каждые evaluation_interval секунд Prometheus вычисляет все правила. Для recording rule результат записывается в TSDB как обычная метрика. Для alerting rule проверяется выражение: если оно вернуло ряды, для них стартует таймер for; когда он истекает, алерт переходит в firing и отправляется в Alertmanager. Метки и аннотации позволяют параметризовать сообщение через шаблоны {{ $labels.job }}.
Частые ошибки
- Алерт без
for. Сработает на любой одиночный пик и завалит дежурного шумом. - Сравнение, которое никогда не возвращает ряды. Если выражение пустое, алерт не сработает даже при реальной проблеме — тестируйте expr вручную.
- Тяжёлые запросы прямо в alerting rule. Лучше вынести расчёт в recording rule и алертить по готовой метрике.
Итог
- Recording rule предрассчитывает метрику для скорости дашбордов.
- Alerting rule описывает условие;
forотсекает короткие всплески. - Алерт идёт inactive → pending → firing; в Alertmanager уходит только firing.