Короткий ответ
Когда выражение правила впервые становится истинным, алерт переходит в состояние pending; если оно остаётся истинным дольше времени, указанного в for, алерт переходит в firing и фактически отправляется в Alertmanager; если условие перестаёт выполняться до истечения for, алерт возвращается в inactive без отправки уведомления.
Как это работает подробнее
Prometheus проверяет alerting rules с интервалом evaluation_interval; на каждой проверке, если выражение истинно, он либо создаёт новый алерт в pending (если его не было), либо проверяет, не истекло ли время for с момента первого срабатывания. Только после непрерывного истинного состояния на протяжении for алерт реально "отправляется" — до этого никакого уведомления дежурному не приходит.
Пример кода
config.yaml
- alert: HighLatency
expr: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 1
for: 5m
labels:
severity: warningЧто использовать на практике
- Практика.
for— это основной встроенный механизм защиты от кратковременных всплесков и шумных алертов; значение подбирают исходя из того, насколько быстро реально нужно реагировать (для критичных пользовательских алертов — несколько минут, для менее срочных — 15–30 минут) и насколько метрика "дёргается" в норме. Слишком большоеforувеличивает время до реального уведомления (MTTD), слишком маленькое — возвращает проблему шумных алертов. - Практика. В Prometheus UI на вкладке
/alertsсразу после превышения порога алерт появится со статусомPENDING(жёлтый), и только через 5 минут непрерывного превышения перейдёт вFIRING(красный) и будет отправлен в Alertmanager — это поведение можно воспроизвести, искусственно вызвав нагрузочный всплеск и наблюдая за переходами статуса.
Подводные камни
- Частые ошибки. путать
pendingс реально отправленным алертом и удивляться, почему уведомления нет, хотя в UI Prometheus алерт уже "горит оранжевым"; ставить одинаковыйforдля всех алертов независимо от критичности, не различая "разбудить дежурного ночью" и "создать тикет на следующий день"; не учитывать, чтоevaluation_intervalсам по себе добавляет задержку — если он равен 1 минуте, аfor: 1m, то фактическая задержка обнаружения может быть ближе к 2 минутам.