· 16 мин чтения

Grafana OnCall: управление инцидентами и дежурствами команды админов

Grafana OnCall: управление инцидентами и дежурствами команды админов

Я, Семёнов Евгений Сергеевич, директор АйТи Фреш. Знаете, когда в компании уже не один админ, а серверы пашут круглосуточно, вопрос дежурств встаёт ребром. Кто примет звонок посреди ночи? Кому эскалировать, если дежурный молчит десять минут? И кто подхватит, пока человек в отпуске? Долгие годы я сам мучился с самописными скриптами на bash и этими вечными Excel-таблицами. Но вот в 2024-м, к счастью, открыл для себя Grafana OnCall. Это бесплатный аналог PagerDuty, с открытым кодом, между прочим. Хочу рассказать вам, как я развернул его буквально за один день и избавил нашу команду от головной боли с алертами!

Зачем нужен отдельный инструмент для дежурств

Один админ? Тогда, честно говоря, вполне хватит Telegram-бота от Grafana или Alertmanager. Но как только команда разрастается до трёх человек и больше — вот тут и начинаются проблемы! Алерт летит в общий чат. И что? Все думают: «А, кто-нибудь да разберётся». В итоге, конечно, никто. Или дежурный спит крепко-крепко и просто не слышит уведомление. А может, он вообще в отпуске, и никто даже не подумал настроить подмену? Grafana OnCall решает все эти моменты системно. Раз и навсегда.

Я всегда советую 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. И что? Уже через две недели после внедрения мы увидели результаты:

Знаете, всего за 6 дней и 185 000 рублей мы не просто запустили проект. В эту сумму, кстати, уже включили полноценное обучение вашей команды и все необходимые инструкции. Согласитесь, это очень быстро и выгодно!

Каналы уведомлений: что предпочесть

На нашей практике мы всегда строго разделяем каналы уведомлений по критичности. Это же аксиома, правда? Ну кто захочет поднимать дежурного посреди ночи из-за пустяка? Мы точно нет.

Аналитика и 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.

Подпишитесь на рассылку ITfresh

Что мы делаем каждую неделю? Выпускаем свежие, НАСТОЯЩИЕ практические гайды! Они специально для IT-руководителей и сисадминов. Там только мясо: как обеспечить безопасность, тонкости работы с 1С, безболезненные миграции, умные резервные копии и, конечно, проверенные лайфхаки прямо из наших реальных проектов. Никакой воды – только польза.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.