Grafana 4 alerting: когда дашборд умеет звонить, и зачем это нужно рядом с Alertmanager
Grafana 4 добавила alerting прямо в дашборды. Переносим часть правил из Prometheus Alertmanager в Grafana и разбираемся, кто за что отвечает.
Grafana 4.x (декабрь 2016) - встроенный alerting с notification channels прямо в дашбордах
В декабре вышла Grafana 4.0 с тем, чего раньше принципиально не было: alert-правилами прямо в панелях дашборда. Не отдельный сервис, не интеграция через вебхук - буквально вкладка Alert рядом с вкладкой Metrics в редакторе панели. Мы потратили несколько недель, чтобы понять когда это полезно, а когда лучше не трогать.
Как устроен alerting в Grafana 4
Механика простая. Берёшь любую панель типа Graph, открываешь вкладку Alert, задаёшь условие: «если значение метрики выше N на протяжении M минут - срабатывает алерт». Grafana периодически сама выполняет запрос к datasource (в нашем случае Prometheus) и проверяет порог. При срабатывании - отправляет уведомление в один или несколько notification channels.
Channels - это и есть второе большое дополнение в 4.x. Поддерживаются Slack, PagerDuty, Email, OpsGenie, VictorOps, webhook. Настраиваются один раз в разделе Alerting -> Notification channels, затем выбираются в любом правиле. На панели появляются вертикальные полосы: серая - pending, красная - alerting, зелёная - OK. Дежурный смотрит на дашборд и сразу видит когда и что сработало.
Почему мы вообще стали это трогать
К февралю у нас уже был рабочий стек: Prometheus + Alertmanager + Grafana для managed-проектов. Alertmanager получал правила из Prometheus, группировал, отправлял в Slack. Всё работало. Но у дежурных была одна проблема: Alertmanager шлёт текстовое сообщение, и чтобы понять масштаб инцидента - нужно открыть Grafana, найти нужный дашборд, посмотреть графики. Лишний шаг, особенно в три ночи.
Grafana alerting решает именно это: уведомление в Slack содержит скриншот графика в момент срабатывания. Не просто «CPU на host-prod-03 выше 90%», а картинка с трендом за последний час. Для дежурного это другой уровень контекста сразу.
Что перенесли, что оставили
После нескольких экспериментов пришли к рабочему разделению.
Grafana Alert - для того, что видно на графике. Правила вида «метрика вышла за порог» работают хорошо именно потому, что в Grafana уже есть визуализация этой метрики. CPU, память, latency, error rate - всё, у чего есть понятный threshold и осмысленный график за последний час. Уведомление со скриншотом объясняет само себя.
Alertmanager - для всего остального. Правила с absent() (метрика пропала совсем - то есть сервис упал или exporter не работает) в Grafana работают плохо: если datasource недоступен, Grafana сама по себе не знает пришло ли отсутствие данных от упавшего сервиса или от проблемы со связью между Grafana и Prometheus. Alertmanager это различает. Сложные PromQL-выражения с rate() поверх нескольких метрик - тоже в Alertmanager: Grafana 4 поддерживает ограниченный набор функций в условиях алертов, и это реальный предел.
Ещё один момент: Alertmanager умеет в маршрутизацию и silences на уровне всего стека. Если объявили maintenance-окно - заглушили целую группу правил одной записью. В Grafana каждое правило нужно отключать отдельно.
Технический момент с образами для скриншотов
Grafana 4 делает скриншоты через headless Phantomjs. Это надо явно учесть при развёртывании: либо ставить Phantomjs рядом с Grafana, либо использовать официальный Docker-образ grafana/grafana который идёт уже с ним. Мы изначально собирали Grafana из пакета и час потратили на то, почему уведомления приходят без картинки - ошибка в логах была неочевидной.
Текущий расклад
Картина у нас сейчас такая:
- Prometheus собирает метрики, Alertmanager держит правила для
absent(), сложных выражений и maintenance silences - Grafana держит правила для порогов по CPU, памяти, latency - там где контекст графика важен дежурному
- Уведомления из обоих каналов идут в один Slack-канал, только из разных sources
Дублирования стараемся избегать: если правило живёт в Grafana, в Alertmanager его нет. Иначе в три ночи получаешь два сообщения об одном и том же с разницей в несколько секунд.
Месяц эксплуатации показал: дежурные действительно быстрее ориентируются когда уведомление приходит со скриншотом. Насколько это изменит время реакции в цифрах - пока не мерили, но субъективно заметно. Продолжаем смотреть.
- Prometheus 1.5 в продакшне: node-exporter, cAdvisor и первые alert-правила · 14 февраля 2017
- Terraform 0.9: единый remote backend для всей команды · 6 апреля 2017