Образовательные платформы живут по своему расписанию. Студенты проходят тесты в 2 часа ночи перед дедлайном, преподаватели загружают видео-лекции в выходные, а пиковые нагрузки на серверы возникают за минуту до начала вебинара с тысячей участников. Стандартный мониторинг, который проверяет доступность раз в минуту и шлет алерт при загрузке CPU выше 80%, здесь не работает. Вы теряете студентов раньше, чем узнаете о проблеме. Эта статья дает рабочую схему алертинга, заточенную под EdTech: конкретные метрики, пороги, каналы доставки и стратегию подавления шума.
Система оповещений для образовательной платформы должна реагировать на три группы сигналов: технические сбои (5xx ошибки, отказы базы данных), ресурсные ограничения (диск, память) и пользовательские метрики (ACS-рейтинг, время загрузки страниц). Пропуск любого из них ведет к оттоку аудитории. Дальше разберем, как выстроить эту систему с нуля или пересобрать существующую, чтобы инженер получал ровно одно уведомление о реальном инциденте, а не сотню бессмысленных сообщений в 3 часа ночи.
Почему стандартный мониторинг не подходит для EdTech: 3 ночных кошмара DevOps
Первая ошибка при построении алертинга для LMS-платформы - копирование схем из e-commerce или корпоративных сервисов. У EdTech другая модель нагрузки и другие последствия отказов. Разберем три типовых сценария, которые гарантированно приведут к инциденту, если система оповещений не адаптирована.
Сценарий 1: Ночное обновление контента. Преподаватель загружает курс в 3 часа ночи. Процесс загрузки падает из-за внезапно закончившегося места на разделе с медиа-файлами. Если алерт настроен только на «диск заполнен на 95%», вы узнаете об этом утром, когда проснутся студенты и начнут жаловаться в поддержку. Решение - градиентные пороги с эскалацией: warning на 80% идет в Slack, critical на 90% будит дежурного через PagerDuty.
Сценарий 2: Предэкзаменационный шторм. За час до дедлайна 500 студентов одновременно открывают тест. База данных захлебывается в блокировках, 20% запросов возвращают 502 ошибку. Классический алерт «5xx > 5% за 5 минут» сработает, но слишком поздно - часть студентов уже не сможет завершить тест. Нужен алерт на тренд: если за 1 минуту количество 5xx выросло в 3 раза относительно скользящего среднего за час - это предвестник проблемы, а не ее констатация.
Сценарий 3: Скрытая деградация ACS-рейтинга. После очередного деплоя время ответа API выросло с 200 до 800 мс. Ошибок нет, CPU в норме, стандартный мониторинг молчит. Но студенты уже ставят низкие оценки за «тормозную платформу», ACS-рейтинг ползет вниз. Через неделю вы теряете 15% платящих пользователей. Единственный способ поймать такой инцидент - алерт на падение ACS-рейтинга на 10% за час относительно недельного среднего.
Эти сценарии объединяет одно: стандартные пороги срабатывают постфактум, когда пользователи уже страдают. Система алертинга для EdTech должна работать на опережение. Подробнее о базовых принципах превращения метрик в полезные оповещения читайте в руководстве по настройке алертинга в DevOps.
Ключевые метрики здоровья EdTech-платформы: что мониторить и какие пороги выставлять
Метрики для образовательной платформы делятся на три уровня: инфраструктурные (диск, память, CPU), сервисные (ошибки веб-сервера, latency базы данных) и бизнесовые (активность пользователей, удовлетворенность). Пропуск любого уровня делает картину неполной. Ниже - конкретные метрики с порогами, проверенные на production-среде.
ACS-рейтинг: как измерить удовлетворенность студентов и не пропустить падение
ACS (Average Customer Satisfaction) - это числовая оценка удовлетворенности пользователей, обычно по шкале от 1 до 5 или от 1 до 10. В EdTech она собирается через опросы после завершения урока, сдачи теста или просмотра видео. В отличие от NPS, ACS измеряет удовлетворенность конкретным взаимодействием, а не брендом в целом. Это делает его чувствительным индикатором технических проблем.
Как автоматизировать сбор. Встройте короткий опрос в интерфейс платформы: «Оцените качество урока» с кнопками 1-5. Результаты пишите в базу данных с меткой времени и ID контента. Раз в минуту агрегируйте среднее значение через SQL-запрос или экспортируйте метрику в Prometheus через custom exporter. Пример запроса для PostgreSQL:
SELECT AVG(rating) as acs_score
FROM lesson_feedback
WHERE created_at > NOW() - INTERVAL '5 minutes'
AND lesson_id = $1;
Пороги срабатывания. ACS-рейтинг стабилен в нормальных условиях. Резкое падение - всегда сигнал проблемы. Рекомендуемые пороги:
- Warning: падение среднего ACS на 5% за 15 минут относительно часового среднего. Отправляется в Slack, не будит дежурного.
- Critical: падение на 10% за 15 минут. Эскалация через PagerDuty, немедленная реакция.
Пример правила для Prometheus Alertmanager, если ACS экспортируется как метрика acs_score:
- alert: ACSDropWarning
expr: |
(avg_over_time(acs_score[15m]) - avg_over_time(acs_score[1h]))
/ avg_over_time(acs_score[1h]) < -0.05
for: 5m
labels:
severity: warning
annotations:
summary: "ACS-рейтинг упал на 5% за 15 минут"
5xx ошибки: когда сервер говорит «нет» вашим студентам
Ошибки 5xx - это отказы на стороне сервера. Для образовательной платформы потеря даже 1% запросов означает десятки студентов, которые не могут открыть урок или отправить ответ. Разные коды ошибок указывают на разные проблемы:
- 502 Bad Gateway: бэкенд-сервис недоступен. Часто - упал контейнер с API.
- 503 Service Unavailable: сервер перегружен или на обслуживании.
- 504 Gateway Timeout: бэкенд не ответил вовремя. Типично для долгих запросов к базе данных.
Источник данных. Nginx access-лог или метрики балансировщика. Рекомендуется парсить логи через Promtail и отправлять в Loki, затем настраивать алерты в Grafana. Альтернатива - exporter для Nginx, который отдает метрики nginx_http_requests_total с кодом ответа в label.
Пороги срабатывания. Абсолютное количество ошибок - плохой триггер, оно зависит от трафика. Используйте долю ошибок от общего числа запросов:
- Warning: доля 5xx > 0.5% за 5-минутное окно.
- Critical: доля 5xx > 1% за 5-минутное окно.
Пример запроса LogQL для Loki:
sum(rate({job="nginx"} |~ "HTTP/[0-9.]+\" 5[0-9]{2}" [5m]))
/
sum(rate({job="nginx"} [5m])) > 0.01
Этот запрос считает долю 5xx ответов от всех запросов и срабатывает при превышении 1%. Для глубокой настройки алертинга на основе логов используйте готовые конфигурации из руководства по мониторингу и алертингу на основе логов в Elasticsearch и Grafana Loki.
Дисковое пространство: почему закончившееся место на сервере - это потерянные студенты
EdTech-платформы потребляют дисковое пространство иначе, чем обычные веб-приложения. Видео-лекции, загружаемые преподавателями, студенческие работы, логи и резервные копии баз данных - все это растет непредсказуемо. Заполнение диска до 100% на сервере базы данных или файловом хранилище приводит к полной остановке сервиса.
Мониторинг. Node Exporter отдает метрику node_filesystem_avail_bytes для каждой точки монтирования. Отслеживайте разделы с данными (/var/lib/postgresql, /data/uploads) отдельно от системных.
Пороги срабатывания:
- Warning (80%): запускает автоматическую очистку логов старше 7 дней и уведомление в Slack. Дает время на ручную расчистку или расширение диска.
- Critical (90%): экстренная эскалация через PagerDuty. Требует немедленного вмешательства.
Пример правила Alertmanager:
- alert: DiskSpaceCritical
expr: |
(node_filesystem_avail_bytes{mountpoint="/data"}
/ node_filesystem_size_bytes{mountpoint="/data"}) < 0.10
for: 1m
labels:
severity: critical
annotations:
summary: "Диск /data заполнен на 90%"
Временное решение при срабатывании warning - скрипт очистки логов. Но это не замена плановому мониторингу и расширению хранилища. Если платформа развернута в облаке, настройте автоматическое расширение диска через API провайдера. Например, Timeweb Cloud позволяет гибко менять ресурсы сервера без остановки сервиса.
Стратегии борьбы с шумом: как не утонуть в бесполезных оповещениях
Главный враг алертинга - не отсутствие оповещений, а их избыток. Когда инженер получает 200 уведомлений за ночь, к утру он перестает на них реагировать. Это называется alert fatigue, и это прямая дорога к пропуску реального инцидента. Три техники решают эту проблему: дедупликация, агрегация и тэгирование.
Дедупликация: почему 100 одинаковых алертов - это один инцидент
Если упал под с API, система мониторинга может сгенерировать десятки алертов: на 5xx ошибки, на таймауты, на падение health-check. Все они указывают на одну проблему. Дедупликация объединяет их в одно уведомление.
В Alertmanager за дедупликацию отвечает параметр group_by. Он группирует алерты по набору меток перед отправкой. Пример конфигурации:
route:
group_by: ['alertname', 'severity', 'instance']
group_wait: 10s
group_interval: 5m
repeat_interval: 4h
Эта настройка означает: все алерты с одинаковыми alertname, severity и instance собираются в одну группу в течение 10 секунд, затем отправляются одним сообщением. Повторная отправка - не раньше чем через 4 часа, если алерт все еще активен. Так 50 срабатываний превращаются в одно уведомление.
Полное руководство по настройке правил группировки и подавления шума - в статье по настройке умного алертинга в Prometheus и Zabbix.
Агрегация и тэгирование: как собрать мозаику из разрозненных сигналов
Агрегация идет дальше дедупликации: она подавляет менее важные алерты, если сработал более критичный. В Alertmanager это делается через inhibition_rules. Пример: если упал весь ingress-контроллер, нет смысла слать отдельные алерты о недоступности каждого микросервиса за ним.
inhibit_rules:
- source_match:
alertname: 'IngressDown'
severity: 'critical'
target_match:
severity: 'warning'
equal: ['cluster', 'namespace']
Это правило подавляет все warning-алерты в том же кластере и namespace, если сработал critical-алерт о падении ingress. Инженер получает одно сообщение о корневой причине, а не лавину вторичных симптомов.
Тэгирование. Каждый алерт должен нести метки, по которым система маршрутизации понимает, кому и куда его отправлять. Минимальный набор меток:
severity: warning, critical, info.team: backend, infrastructure, content.component: api, database, frontend, storage.environment: production, staging.
На основе этих меток Alertmanager направляет алерты в разные каналы: warning - в Slack команды, critical - в PagerDuty дежурному, info - в общий лог без уведомлений. Настройка маршрутизации по меткам детально разобрана в руководстве по Prometheus и Alertmanager с готовыми конфигурациями.
Доставка оповещений: интеграция с Telegram, Slack и PagerDuty
Алерт, который никто не увидел, бесполезен. Выбор канала доставки зависит от критичности и размера команды. Для небольших команд (2-5 инженеров) достаточно Telegram или Slack. Для распределенных команд с формальным процессом дежурств нужен PagerDuty или Opsgenie.
Telegram и Slack: быстрые уведомления для дежурной команды
Telegram. Создайте бота через @BotFather, получите токен и ID чата. В Alertmanager настройте webhook-приемник:
receivers:
- name: 'telegram-critical'
webhook_configs:
- url: 'https://api.telegram.org/bot/sendMessage'
send_resolved: true
http_config:
headers:
Content-Type: 'application/json'
body: |
{
"chat_id": "",
"text": "{{ .CommonAnnotations.summary }}\n{{ .CommonAnnotations.description }}",
"parse_mode": "HTML"
}
Для форматирования сообщений используйте шаблоны Alertmanager. Добавьте в шаблон кнопку «Принял» через inline-клавиатуру Telegram - это даст быстрый способ подтвердить, что инженер начал разбираться с инцидентом.
Slack. Настройка аналогична: создайте Incoming Webhook в администрировании рабочего пространства Slack, скопируйте URL. В Alertmanager используйте встроенный приемник slack_configs:
receivers:
- name: 'slack-warning'
slack_configs:
- api_url: 'https://hooks.slack.com/services/T...'
channel: '#alerts-warning'
title: '{{ .CommonAnnotations.summary }}'
text: '{{ .CommonAnnotations.description }}'
send_resolved: true
Разделите каналы по severity: #alerts-critical для немедленной реакции, #alerts-warning для планового внимания. Это снижает шум в критическом канале.
PagerDuty: эскалации и дежурства для серьезных инцидентов
PagerDuty гарантирует, что критический алерт дойдет до ответственного, даже если тот спит. Система поддерживает эскалацию по цепочке: если дежурный не подтвердил алерт за N минут, оповещение уходит следующему в списке, затем - звонок тимлиду.
Настройка интеграции. В PagerDuty создайте сервис с типом интеграции «Prometheus». Скопируйте Routing Key (Integration Key). В Alertmanager добавьте приемник:
receivers:
- name: 'pagerduty-critical'
pagerduty_configs:
- routing_key: ''
severity: '{{ .CommonLabels.severity }}'
description: '{{ .CommonAnnotations.description }}'
client: 'Alertmanager'
client_url: 'https://alertmanager.example.com'
Политика эскалации настраивается на стороне PagerDuty:
- Уровень 1: дежурный инженер. Уведомление - push + SMS. Таймаут - 5 минут.
- Уровень 2: второй инженер в смене. Уведомление - push + звонок. Таймаут - 5 минут.
- Уровень 3: тимлид. Звонок на мобильный.
Такой каскад гарантирует, что алерт не останется незамеченным. Настройте расписание дежурств (on-call rotation) с учетом часовых поясов инженеров, чтобы ночные алерты приходили тому, кто бодрствует.
От алерта к решению: как построить процесс реагирования на инциденты
Алертинг без процесса реагирования - это просто шум. Инженер должен знать, что делать в момент получения оповещения. Жизненный цикл инцидента состоит из пяти шагов: получение, подтверждение, диагностика, устранение, постмортем. Каждый шаг требует заранее подготовленных инструкций.
Подтверждение (acknowledge). Инженер нажимает кнопку «Принял» в мессенджере или PagerDuty. Это останавливает эскалацию и сообщает команде, что кто-то уже работает над проблемой. Таймаут на подтверждение - 5 минут для critical, 15 минут для warning.
Диагностика. Инженер открывает runbook - документ с пошаговым алгоритмом действий для конкретного типа алерта. Runbook привязан к метке alertname и содержит ссылки на дашборды Grafana, логи в Loki и типовые команды для диагностики.
Устранение. Выполняются шаги из runbook. Если runbook не помогает - эскалация на более опытного инженера или тимлида.
Постмортем. После устранения инцидента команда проводит разбор: что случилось, почему не сработала профилактика, как улучшить алертинг. Постмортем - это не поиск виноватых, а улучшение системы. Подробный процесс от алерта до постмортема описан в руководстве по построению зрелой системы реагирования на инциденты.
Runbook для падения ACS-рейтинга: пошаговый план действий
Падение ACS-рейтинга - специфичный для EdTech инцидент. Вот готовый алгоритм, который можно адаптировать под свою платформу:
- Проверить последние деплои (2 минуты). Откройте CI/CD пайплайн, посмотрите, какие изменения были выкачены за последние 2 часа. Откатите последний деплой, если он совпадает по времени с началом падения ACS.
- Проверить latency API (2 минуты). Откройте дашборд Grafana с графиком p95 времени ответа. Если latency выросла более чем в 2 раза - ищите проблему в базе данных или внешних сервисах.
- Проверить логи ошибок (3 минуты). В Loki выполните запрос на поиск spike-ошибок за последние 15 минут. Обратите внимание на таймауты соединений с базой и ошибки внешних API.
- Опросить службу поддержки (параллельно). Напишите в чат поддержки: «Фиксируем падение ACS, есть ли всплеск жалоб? На что жалуются?» Ответ поддержки часто указывает на проблему быстрее, чем анализ логов.
- Временное решение (5 минут). Если причина не найдена за 10 минут, включите заглушку с извинениями на проблемных страницах. Это снижает поток негативных оценок, пока вы ищете корневую причину.
Этот runbook должен быть доступен по прямой ссылке из тела алерта. В Alertmanager ссылка добавляется через аннотацию runbook_url.
Заключение: ваш EdTech-алертинг за 7 дней - дорожная карта внедрения
Построение надежной системы оповещений для образовательной платформы укладывается в одну рабочую неделю. Главное - идти от критического к второстепенному и не пытаться охватить все метрики сразу.
День 1-2: базовые метрики и пороги. Настройте сбор трех ключевых метрик: ACS-рейтинг, доля 5xx ошибок, свободное место на диске. Выставите пороги warning и critical по рекомендациям из статьи. Подключите один канал доставки - Slack или Telegram.
День 3-4: борьба с шумом. Настройте группировку алертов в Alertmanager, добавьте inhibition rules. Проверьте, что одна проблема генерирует одно уведомление. Отключите алерты, которые срабатывают чаще раза в день без реальных инцидентов - это ложные срабатывания, их пороги нужно пересмотреть.
День 5-6: эскалации и дежурства. Подключите PagerDuty для критических алертов. Настройте политику эскалации и расписание дежурств. Проведите учебную тревогу: уроните тестовый сервис и проверьте, что алерт дошел до дежурного за заданное время.
День 7: runbook'и и постмортемы. Напишите runbook для трех самых частых алертов. Добавьте ссылки на них в аннотации Alertmanager. Проведите постмортем по последнему реальному инциденту и внесите улучшения в алертинг.
Проверьте текущую систему по чек-листу: все ли критические метрики покрыты алертами, приходят ли оповещения в нужный канал, знает ли команда, что делать при срабатывании. Если на любой из вопросов ответ «нет» - у вас есть план на ближайшие 7 дней.