Grafana OnCall: управление инцидентами и дежурствами команды админов
Я, Семёнов Евгений Сергеевич, директор АйТи Фреш. Знаете, когда в компании уже не один админ, а серверы пашут круглосуточно, вопрос дежурств встаёт ребром. Кто примет звонок посреди ночи? Кому эскалировать, если дежурный молчит десять минут? И кто подхватит, пока человек в отпуске? Долгие годы я сам мучился с самописными скриптами на bash и этими вечными Excel-таблицами. Но вот в 2024-м, к счастью, открыл для себя Grafana OnCall. Это бесплатный аналог PagerDuty, с открытым кодом, между прочим. Хочу рассказать вам, как я развернул его буквально за один день и избавил нашу команду от головной боли с алертами!
Зачем нужен отдельный инструмент для дежурств
Один админ? Тогда, честно говоря, вполне хватит Telegram-бота от Grafana или Alertmanager. Но как только команда разрастается до трёх человек и больше — вот тут и начинаются проблемы! Алерт летит в общий чат. И что? Все думают: «А, кто-нибудь да разберётся». В итоге, конечно, никто. Или дежурный спит крепко-крепко и просто не слышит уведомление. А может, он вообще в отпуске, и никто даже не подумал настроить подмену? Grafana OnCall решает все эти моменты системно. Раз и навсегда.
- Как насчет дежурств? Мы предлагаем гибкое расписание с любой ротацией, которая вам нужна: хоть еженедельной, хоть ежедневной. Или хотите свою, совсем кастомную схему? Без проблем – мы сделаем так, как удобно именно вам.
- Наша система эскалации действует четко и без промедлений: если дежурный не отвечает, уже через 5 минут мы звоним второму специалисту. А если и он молчит? Тогда через 10 минут звонок уходит руководителю. Ни один инцидент не останется без внимания, поверьте.
- Каждый получает уведомления так, как ему удобно. Хотите в Telegram? Пожалуйста. Предпочитаете старый добрый SMS? Не вопрос. Нужно, чтобы прямо позвонили? Сделаем. Главное, чтобы информация точно дошла до адресата.
- Мы храним полную историю всех инцидентов. Никаких обрывков информации в чатах! Разбор полетов (post-mortem) проводится строго по официальным документам. Это значит, что все выводы, причины и действия четко зафиксированы, и к ним всегда можно вернуться.
- Наши специальные кнопки ACK/Resolve гарантируют: каждый инцидент закрывается ответственным сотрудником, который его РЕШИЛ. А не так, что 'само рассосалось', как это часто бывает, правда? Мы за прозрачность и ответственность.
Я всегда советую OnCall командам, где работают от трёх человек. Если админ один, ему, поверьте, хватит Telegram и хорошего будильника.
Установка через Docker Compose
Официальный, и на наш взгляд, самый удобный способ развертывания — это Docker Compose. Мы готовим виртуалку на Debian 12, ставим Docker и compose plugin. А потом? Одной-единственной командой разворачиваем всё остальное.
sudo apt install -y docker.io docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker
mkdir -p ~/oncall && cd ~/oncall
curl -fsSL https://raw.githubusercontent.com/grafana/oncall/dev/docker-compose.yml -o docker-compose.yml
# Задаём секреты
cat > .env <<EOF
DOMAIN=http://oncall.corp.ru
SECRET_KEY=$(openssl rand -hex 32)
MIRAGE_SECRET_KEY=$(openssl rand -hex 32)
RABBITMQ_PASSWORD=$(openssl rand -hex 16)
MYSQL_PASSWORD=$(openssl rand -hex 16)
EOF
docker compose up -d
docker compose ps
Через 2-3 минуты поднимаются контейнеры: engine, celery, celery_beat, redis, rabbitmq, mysql, nginx. Первый admin создаётся командой docker compose exec engine python manage.py createsuperuser.
Интеграция с основной Grafana
OnCall очень легко «плагинится» в уже существующую Grafana, прямо через админку Plugins. Вам нужно просто установить плагин «Grafana OnCall», затем указать URL контейнера (например, http://engine:8080) и OnCall API token. Он берётся из CLI. И буквально через минуту в боковом меню Grafana у вас появится новый пункт OnCall со всеми его возможностями!
# Получение токена для плагина
docker compose exec engine python manage.py issue_invite_for_the_frontend \
--override --email admin@corp.ru
# Вывод: Invite Token: ey...
# Этот токен вставляем в Grafana → Apps → OnCall → Settings
Расписания дежурств
OnCall поддерживает три типа расписаний. Я всегда начинаю с простого weekly rotation на 2-3 человека. А потом уже подкручиваю под реальный график.
| Тип | Когда использовать | Настройка |
|---|---|---|
| Weekly | Команда 2-4 человека, равномерная нагрузка | Каждый дежурит неделю, смена в понедельник 9:00 |
| Daily | Большая команда, не хочется нагружать одного | Смена ежедневно в 9:00 |
| Custom | Работа 2/2, ночные смены, часовые пояса | iCal-импорт или вручную через календарь |
| Overrides | Отпуск, болезнь, подмена на день | Перекрытие основного расписания |
Настраиваем просто: идём в OnCall → Schedules → New Schedule → Rotation. Даём нашему расписанию имя, например, «Ops Weekly». Выбираем всех участников команды, ставим шаг «неделя», а старт — понедельник 9:00. Заглядываем в календарь. И что мы видим? Сразу понятно, кто из ребят будет дежурить в следующем месяце!
Эскалация: кого звать и через сколько
Эскалация — это, по сути, чёткая цепочка действий, которые мы предпринимаем при инциденте. На нашей практике для производственного клиента отлично работает вот такая схема:
Шаг 1 (immediate): Telegram → дежурный
Шаг 2 (+5 минут): SMS → дежурный
Шаг 3 (+10 минут): Telegram → второй дежурный
Шаг 4 (+10 минут): Звонок → руководитель отдела
Шаг 5 (+15 минут): Уведомление в канал #ops-critical
Настройка простая: OnCall → Escalation Chains → New. Добавляете шаги, между ними задержки, для каждого — свой получатель. В конце привязываете Escalation Chain к Integration (Alertmanager / Zabbix / Webhook).
Интеграция с Alertmanager
Используете связку Prometheus + Alertmanager? Тогда интеграция будет максимально простой. В OnCall создаёте Integration → Alertmanager, копируете webhook URL и просто прописываете его в свой alertmanager.yml.
receivers:
- name: oncall
webhook_configs:
- url: https://oncall.corp.ru/integrations/v1/alertmanager/abc123def456/
send_resolved: true
route:
receiver: oncall
group_by: ['alertname','instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
Через пару минут тестовый алерт падает в OnCall: создаётся Alert Group, срабатывает эскалация. Дежурный получает уведомление и жмёт ACK или Resolve.
Интеграция с Zabbix через webhook
Для Zabbix мы делаем всё наоборот. В OnCall создаём интеграцию Zabbix, копируем URL. А уже в самом Zabbix создаём медиа-тип Webhook.
// JavaScript для медиа-типа Zabbix
try {
Zabbix.log(4, 'OnCall webhook starting');
var params = JSON.parse(value);
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
var resp = req.post(params.url, JSON.stringify(params));
if (req.getStatus() != 200) {
throw 'Unexpected response code ' + req.getStatus();
}
return 'OK';
} catch (err) {
Zabbix.log(3, 'OnCall webhook error: ' + err);
throw err;
}
Параметры медиа-типа такие: url = webhook URL из OnCall, subject = {EVENT.NAME}, message = {EVENT.SEVERITY} + описание. Привязываете к пользователям через User media.
Кейс: переход с Telegram-бота на OnCall в банке
Помню, в октябре 2025 года к нам обратился один клиент — небольшой региональный банк. У них в команде было шесть админов, они круглосуточно мониторили критичные сервисы. До того, как мы пришли, они использовали обычный общий Telegram-чат. Алерты там частенько игнорировались, и ночные инциденты разбирались только к утру. Как-то раз они пропустили падение процессинга аж на 40 минут! Регулятор им выписал такой штраф, что, поверьте, мало не показалось.
Мы развернули Grafana OnCall на виртуальной машине в дата-центре МТС, подключили к нему уже имеющиеся Zabbix и Prometheus. Настроили расписание weekly rotation для пяти человек (шестой, руководитель, стал последним шагом эскалации). Разделили каналы: Telegram для некритичных уведомлений, а SMS + звонок — для critical. И что? Уже через две недели после внедрения мы увидели результаты:
- У нас впечатляющие цифры: среднее время реакции на инциденты сократилось с 18 минут до каких-то 4! Чувствуете разницу?
- А вот наш процент подтвержденных алертов: это же просто небо и земля! Раньше было 62%, а теперь — целых 98%. Это значит, что команда действительно работает, а не пропускает оповещения.
- И что самое главное: даже ночные инциденты мы теперь умудряемся решать в среднем всего за полчаса! Представляете, как спокойно спится?
- А чтобы не наступать на одни и те же грабли, мы сделали post-mortem встречи ЕЖЕНЕДЕЛЬНЫМИ. Это наше золотое правило: каждую неделю собираемся и разбираем все закрытые инциденты, данные по которым, конечно же, берем прямо из OnCall. Так мы постоянно учимся и совершенствуемся.
Знаете, всего за 6 дней и 185 000 рублей мы не просто запустили проект. В эту сумму, кстати, уже включили полноценное обучение вашей команды и все необходимые инструкции. Согласитесь, это очень быстро и выгодно!
Каналы уведомлений: что предпочесть
На нашей практике мы всегда строго разделяем каналы уведомлений по критичности. Это же аксиома, правда? Ну кто захочет поднимать дежурного посреди ночи из-за пустяка? Мы точно нет.
- Telegram — info/warning, доставка секундная, бесплатно, можно чат группы.
- Email — low priority, слабые предупреждения, дайджест.
- SMS — critical, через SMS.ru или собственный GSM-шлюз. У меня в офисе работает Teltonika TRB140 с SIM-картой.
- Звонок — disaster. Через Twilio (если разрешён) или Asterisk + российский SIP. Будит даже в беззвучном режиме.
- Mobile push — через приложение Grafana IRM, аналог PagerDuty.
Аналитика и post-mortem
OnCall – это, без преувеличения, наш спасательный круг. Он автоматически фиксирует КАЖДУЮ деталь по инцидентам: сколько заняло подтверждение (ACK), сколько до полного решения (резолва), кто вообще взялся, кто довел до конца, сколько раз пришлось эскалировать. Представляете, каждую неделю мы экспортируем эти бесценные данные в CSV. А потом, на наших планинг-митингах, все вместе глубоко копаем: почему был такой шквал алертов, есть ли смысл пересмотреть пороги или где именно наш мониторинг слишком 'шумит', отвлекая команду? Это дает нам полную картину.
# API для экспорта инцидентов
curl -H "Authorization: ${ONCALL_TOKEN}" \
"https://oncall.corp.ru/api/v1/alert_groups?started_at_gte=2026-04-01" \
> incidents_april.json
Настроим управление инцидентами под ключ
Разворачиваем Grafana OnCall на вашей инфраструктуре, интегрируем с Zabbix, Prometheus, Alertmanager. Настраиваем расписания, эскалации, каналы уведомлений под вашу команду. За 2-4 рабочих дня.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы по Grafana OnCall
- Чем Grafana OnCall отличается от PagerDuty?
- OnCall — open-source, разворачивается на собственной инфраструктуре, бесплатный и не зависит от зарубежных SaaS. Функционал приближен к PagerDuty: расписания дежурств, эскалации, интеграции с мониторингом, каналы уведомлений.
- Какие каналы уведомлений поддерживаются?
- Telegram, Slack, MS Teams, email, webhook, мобильное приложение Grafana IRM, звонок через Twilio или российский шлюз.
- Нужен ли отдельный сервер под OnCall?
- Для команды до 10 инженеров достаточно виртуалки 2 vCPU / 4 ГБ RAM / 40 ГБ диска. OnCall запускается через Docker Compose вместе с PostgreSQL и Redis.
- Как устроена эскалация?
- Цепочка шагов: сначала уведомить дежурного, через 5 минут если не принял — следующего, через 10 минут — руководителя, параллельно уведомить в канал Telegram. Последовательность и время настраиваются в UI.
- Можно ли интегрировать с Zabbix?
- Да, OnCall имеет встроенную интеграцию Zabbix: получаете webhook URL, в Zabbix создаёте медиа-тип webhook и привязываете к пользователю. Алерты сразу падают в OnCall.
