Grafana OnCall: управление инцидентами и дежурствами команды админов
Семёнов Евгений Сергеевич, директор АйТи Фреш. Когда в компании больше одного админа и серверы работают круглосуточно — возникает вопрос дежурств. Кто принимает звонок ночью? Кому эскалация, если человек не отвечает 10 минут? Кто заменяет дежурного, когда он в отпуске? Я много лет использовал самописные скрипты на bash и Excel-таблицы с графиками, но в 2024 нашёл Grafana OnCall — бесплатный аналог PagerDuty с открытым кодом. Расскажу, как развернуть его за один день и избавить команду от головной боли с алертами.
Зачем нужен отдельный инструмент для дежурств
Если у вас один админ — хватает Telegram-бота от Grafana или Alertmanager. Как только команда вырастает до 3+ человек — начинаются проблемы. Алерт падает в общий чат, все думают «кто-то разберётся», никто не разбирается. Или дежурный спит и не слышит уведомление. Или он в отпуске, а никто не настроил подмену. Grafana OnCall решает это системно:
- Расписание дежурств с ротацией — недельной, ежедневной, свою кастомную.
- Эскалация по цепочке: не ответил дежурный — через 5 минут звоним второму, через 10 минут руководителю.
- Каналы уведомлений под каждого — кому-то Telegram, кому-то SMS, кому-то звонок.
- История всех инцидентов — разбор полётов post-mortem по документу, а не по чатам.
- ACK/Resolve кнопки — инцидент закрывается тем, кто его решил, а не «само рассосалось».
Я всегда рекомендую OnCall командам от 3 человек. Одному админу достаточно 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 обратился клиент — небольшой региональный банк, команда 6 админов, круглосуточный мониторинг критичных сервисов. До нас использовали общий Telegram-чат, алерты часто игнорировались, ночные инциденты разбирали к утру. Один раз пропустили падение процессинга на 40 минут, регулятор выписал штраф.
Мы развернули Grafana OnCall на виртуальной машине в дата-центре МТС, подключили существующие Zabbix и Prometheus, настроили расписание weekly rotation на 5 человек (шестой — руководитель как последний шаг эскалации), каналы Telegram для некритичных и SMS + звонок для critical. Через две недели после внедрения:
- Среднее время реакции упало с 18 минут до 4.
- Процент подтверждённых алертов — 98% против прежних 62%.
- Ночные инциденты стали решаться за 30 минут в среднем.
- Post-mortem стали регулярными — еженедельная встреча по закрытым инцидентам из OnCall.
Стоимость проекта 185 000 руб за 6 дней, включая обучение команды и написание инструкций.
Каналы уведомлений: что предпочесть
Я всегда раскладываю каналы по критичности, чтобы не разбудить дежурного из-за маленькой проблемы:
- 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 и разбираю на planning-митинге — почему был всплеск алертов, можно ли оптимизировать пороги, где шумит мониторинг.
# 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.