Silence в Alertmanager съедает resolved и алерт зависает открытым
Что происходит с закрывающими событиями, если заглушить уже горящий алерт в Alertmanager.
Если заглушить горящий в Alertmanager алерт и он при этом закроется под действующим сайленсом, то закрывающее событие до получателя не дойдет. В дежурной системе, тикетнице или чате алерт так и останется висеть открытым.
Проверили это на стенде
Взяли Alertmanager 0.34 с вебхуком send_resolved: true. Собрали приемник на коленке, чтобы он логировал каждый запрос. Алерты слали напрямую в API. Для окна повторов прикрутили Prometheus 3.15 с опросом и вычислением правил раз в 5 секунд.
Resolved во время silence не отправляется
Алерт загорелся, ушел в вебхук-приемник, затем на него поставили silence и после этого смоделировали закрытие алерта. Вебхук за весь прогон получил один запрос и это был лишь первый firing. В debug-логе Alertmanager закрывающее событие активного алерта глушится точно также, как и загорающиеся алерты:
Сайленс сопоставляется только с лейблами и состояние алерта не проверяется. На ближайшем тике group_interval Alertmanager считает заглушённое закрывающее событие обработанным и удаляет его из группы, хотя по факту ничего не отправил.
После окончания silence resolved не возвращается
За 90 секунд после конца закрывающее событие не пришло ни в одном случае.
| Как закончился silence | Resolved в вебхуке |
|---|---|
| истёк по сроку | не пришёл |
| снят досрочно через API | не пришёл |
Механизма отложенного resolved в Alertmanager нет, ведь из группы он уже удалён. Хотя в целом было бы логично отправлять закрывающие события для тех алертов, которые закрылись под сайленсом, но этого не происходит.
Разумеется если silence заканчивается раньше ближайшего тика после закрывающего события, то оно уходит штатно. Если хотя бы один тик пришёлся на активный silence, он потерян.
Prometheus даёт около 15 минут, чтобы снять сайленс
Если алерты в Alertmanager шлёт Prometheus, закрывающее событие ещё можно спасти. Прометей около 15 минут после закрытия алерта повторяет его в Alertmanager. Каждый повтор Alertmanager обрабатывает заново. Пришедший после конца сайленса повтор доходит до получателя штатно.
| Сайленс закончился | Закрывающее событие в вебхуке |
|---|---|
| через 5 минут после закрытия алерта | пришло через 33 секунды, с ближайшим повтором |
| через 17 минут после закрытия алерта | не пришло никогда |
Длина самого сайленса при этом роли не играет. Считать надо от закрытия алерта и до конца сайленса. Запас не больше 15 минут.
У источника, который шлёт закрывающее событие в Alertmanager один раз (скрипт, curl в API), такого запаса нет.
Примечание: в лабе повторы шли раз в 65 секунд, последний через 14 минут 05 секунд после закрытия. Частота повторов зависит от интервала вычисления правил, а 15 минут это предел самого Prometheus.
Сайленс на часть группы прячет алерт от получателя
Если заглушить один алерт из группы, получатель перестаёт о нём что-либо узнавать. Alertmanager просто убирает его из уведомлений группы без пометки. Получатель не может отличить заглушённый алерт от закрытого.
В группе из a, b и c заглушили b. С этого момента в уведомлениях группы были только a и c, хотя b ещё горел:
Закрытие b под сайленсом не пришло ни тогда, ни после снятия сайленса. Когда закрылись a и c, группа пришла со статусом resolved, а судьбу b получатель так и не узнал. Такие дела.
Сайленс, поставленный заранее, ничего не теряет
Проблема только у сайленса поверх алерта, который уже ушёл получателю. Если сайленс создан до срабатывания, всё работает штатно:
- алерт загорелся и закрылся под сайленсом, получатель не увидел ничего и висеть открытым нечему;
- алерт ещё горит к концу сайленса, первое уведомление приходит на ближайшем тике
group_interval, а закрывающее событие потом доходит как обычно.
Пока сайленс действует, Alertmanager не шлёт и напоминаний по repeat_interval. После конца сайленса пропущенные напоминания не досылаются, приходит одно уведомление на ближайшем тике и дальше обычный ритм.
Рекомендации
- Для плановых работ создавайте сайленс до того, как алерт загорится. Тогда терять нечего, получатель либо ничего не увидит, либо получит алерт после конца сайленса целиком, с закрытием.
- Чтобы перестать звонить дежурному по горящему алерту, подтверждайте его в дежурной системе, а не глушите в Alertmanager. Подтверждение закрывающее событие не трогает, а сайленс поверх отправленного алерта его отрезает.
- Если горящий алерт всё же заглушили, после снятия сайленса сверьте открытые алерты у получателя с источником. Алерт, который в источнике уже закрыт, а у получателя открыт, придётся закрыть вручную.
- Не считайте пропажу алерта из группы его закрытием. Заглушённый алерт исчезает из уведомлений, пока ещё горит.
Incident Garden закрывает алерт только по закрывающему событию от Alertmanager или вручную дежурным. Потерянное событие оставляет алерт открытым и эскалация идёт дальше по своим шагам. Если поставить сайленс в самом Incident Garden, а не в Alertmanager, Alertmanager продолжает отправлять всё как раньше и пришедшее закрывающее событие закрывает алерт, даже пока он на паузе. Подключение описано в руководстве по Alertmanager.