Привет, хабр! С удивлением обнаружил, что здесь нет ни одного упоминания Grafana OnCall, Incident Response Tool с открытым исходным кодом от Grafana Labs. И это нужно исправлять, ведь мы бурно растем как по звездочкам на гитхабе, так и как часть Grafana Cloud, а в issues на гитхабе, в основном, встречаются техлиды из FAANG.
![](https://habrastorage.org/getpro/habr/upload_files/f0c/12f/fb0/f0c12ffb0f74193c9cc970085e0270e3.png)
Если кратко, OnCall — это инструмент, который поможет организовать надежные оповещения/реагирование на инциденты в команде, соблюдать SLA и не просыпаться ночью от звонков.
OnCall — новичок в мире Open Source, но уже совсем не новичок как продукт. Он начался как отдельный SaaS под названием Amixr.IO несколько лет назад. Потом Amixr.IO приобрела Grafana Labs и интегрировала в свою экосистему. И вот недавно, наконец, мы смогли выложить исходный код OnCall в открытый доступ ? А это значит, что он стал доступен большему кругу пользователей — и тем, кто работает в инфраструктуре без интернета, и тем, кто просто любит Open Source.
Что умеет Grafana OnCall?
Фич достаточно много, опишу основные.
Собирать алерты со всех источников
Каждая интеграция — это набор шаблонов, которые применяются к данным, пришедшим от мониторинга по webhook. Из коробки доступны несколько, мы работаем над тем, чтобы увеличить список и покрыть все опенсорсные системы мониторинга. Даже, если вашего источника нет, ничего не мешает принять алерты на вебхук и отредактировать шаблоны. Самое важное — в OnCall можно собрать алерты со всего зоопарка мониторингов от Prometheus до PRTG в едином месте.
![](https://habrastorage.org/getpro/habr/upload_files/36f/6f1/09b/36f6f109b0819fef24447e169e8bb833.png)
Форматировать алерты в шаблонами
Внутри OnCall с помощью шаблонов можно творить много магии. Например, можно менять внешний вид алертов, прицеплять к ним ссылки на ранбуки, вырезать ненужный хлам и так далее. Можно сделать алерты приятными. Например, они могут выглядеть так:
![](https://habrastorage.org/getpro/habr/upload_files/f99/9d5/0cc/f999d50cc1cfa179e205b93427f40480.png)
Или еще аккуратнее:
![](https://habrastorage.org/getpro/habr/upload_files/06a/80b/f03/06a80bf030bf905564bc67e1e2ea6e80.png)
Доступно мощное форматирование при помощи Jinja 2, есть условные операторы, есть итераторы. Все поля можно форматировать по-отдельности:
![](https://habrastorage.org/getpro/habr/upload_files/56a/6b8/96e/56a6b896eba2a9be5eeba6dc9bfb6087.png)
Группировать
Одна из задач OnCall — бороться со штормом алертов в чатиках. Группировка работает на основе вот этого шаблона:
![](https://habrastorage.org/getpro/habr/upload_files/efc/3b8/9f6/efc3b89f6224a6b72d90a7d02191437f.png)
Все алерты, результат выполнения этого шаблона которых, будет одинаковым, будут сгруппированы. Например, можно группировать по всем лейблам: "{{ payload.labels }}", или по сервису: "{{ payload.labels['service'] }}", или по сервису и региону: "{{ payload.labels['service'] }}_{{ payload.labels['region'] }}".
Интегрироваться со Slack и Telegram
Интеграция с мессенджерами — это то, чем мы гордимся по-настоящему. Посмотрите на скрин:
![](https://habrastorage.org/getpro/habr/upload_files/47d/dfb/6f8/47ddfb6f8618d6a26cd7a5e6d155c077.png)
Здесь есть несколько классных деталей:
В общий канал ушло всего одно сообщение, 1069! алертов было сгруппировано. Мы спрятали весь этот "мусор".
OnCall аккуратно тегнул дежурного в тредике.
OnCall добавил в тредик лог эскалации (об этом дальше). Когда инцидент был открыт, в логе отображались будущие шаги.
OnCall регулярно проверяет, не забыл ли дежурный про инцидент, который от не закрыл, но пометил как Acknowledged. Если дежурный куда-то пропадет, OnCall заново переэскалирует инцидента.
Эскалировать
"Эскалатор" — сердце OnCall. Мало принять инцидент, нам нужно оповестить кого-то об этом инциденте, да еще так, чтобы быть уверенным в соблюдении SLA. В OnCall есть такой вот редактор эскалаций:
![](https://habrastorage.org/getpro/habr/upload_files/296/a0c/d1f/296a0cd1f079c61e6f5182379f0eb13a.png)
Можно эскалировать дежурному по расписанию (об этом дальше), можно создавать многоуровневую систему защиты, когда если один человек пропустил -> инцидент уходит другому, можно придерживать эскалации на ночь и так далее... Главное — это помогает точно удостовериться, что инцидент будет взят дежурным в работу и вы соблюдете SLA.
Назначать дежурных по расписанию
Одна из основных фич Grafana OnCall для распределенных команд. Например, в нашей команде расписание выглядит вот так:
![](https://habrastorage.org/getpro/habr/upload_files/a6d/7a7/0d8/a6d7a70d828300e164a015f4e37488af.png)
И да, мы редактируем расписание дежурств прямо в Google Calendar, а Grafana OnCall подтягивает обновления к себе и именно так узнаёт, кому отправить уведомление об инциденте.
Для вдумчивых, мы подготовили Terraform Provider, благодаря которому можно хранить расписание дежурств в Git и конфигурировать очень-очень-очень сложные ротации, а изменения принимать через Pull/Merge Request: https://grafana.com/blog/2022/08/29/get-started-with-grafana-oncall-and-terraform/
Что под капотом
Система оповещений — то, что должно, в первую очередь, доставить оповещение, а уже потом все остальное. Из-за этого, мы используем то, что называем: "скучный стек", что зарекомендовало себя годами и то, что мы очень хорошо знаем: Django, Celery, MySQL, RabbitMQ, Redis.
Когда мы аннонсировали Open Source на Hackernews, то получили ушат критики. Комментатором показалось, что OnCall требует слишком много зависимостей. Хоть он и упакован в Helm и Docker-compose, и в большинстве случаев запускается парой команд, всех напрягают "лишняя" база данных, очередь и кеш.
С одной стороны, они действительно лишние, если вы хотите запустить OnCall для "игр", с другой стороны под капотом у OnCall наш 3-летний опыт эксплуатации на несколько тысяч клиентов. За эти три года каждый недоставленный или задержанный инцидент был расследован и повлек за собой какое-то улучшение. Сейчас OnCall умеет и правильно частично деградировать, и корректно рейтлимитить, когда один из нескольких источников взбесился, и не падать, когда чудит API Slack, и мгновенно восстанавливаться. Думаю, все эти детали — хорошая тема для отдельной статьи.
Для тех случаев, когда стабильность не так важна, мы готовим миниатюрную версию.
Как поставить
Мы подготовили три основных окружения — окружение разработчика, прод. окружение (пока только helm для kubernetes) и окружение для "потыкать". Если вам не хватает окружения, пожалуйста, немедленно дайте нам об этом знать в Issues на GitHub.
Как поучаствовать
Grafana OnCall — Open Source проект и мы неверноятно радуемся каждый раз, когда получаем PR от коммьюнити. Если вы хотите добавить интеграцию с новой системой мониторинга, или новым мессенджером, или просто пофиксить что-то простенькое, добро пожаловать к нам в гитхаб: https://github.com/grafana/oncall
У нас есть русскоязычный чатик в телеграме, где сидят разработчики: https://t.me/amixr_ru
А еще у нас есть ежемесячные Zoom звонки, следующий будет 28-го сентября, там мы покажем секретную фичу, над которой работали почти 2 месяца ?, а еще соберем рабочую группу для работы над интеграцией с Mattermost, чтобы закрыть самый популярный Issue. Приходите на звонок, это отличный шанс влиться в Open Source разработку! : https://github.com/grafana/oncall/discussions/451