Содержание
- Почему большинство систем мониторинга создаёт больше шума, чем сигнала
- Трёхуровневый подход
- Sentry: перестаньте получать вызов на каждое исключение в Python
- Prometheus и AlertManager: маршрутизация по уровню серьёзности
- AWS CloudWatch: SNS → Lambda → Echobell
- Маршрутизация оповещений как решение команды
- Тест на соотношение сигнал/шум
- По одному изменению за раз
- Читайте также
У этого есть название: усталость от оповещений. Так происходит, когда инструменты мониторинга шлют столько уведомлений, что мозг начинает автоматически их отфильтровывать — включая те, которые действительно важны.
Обычно всё начинается с малого. Вы настраиваете email-оповещения на каждую ошибку 5xx. Потом уведомления в Slack на каждую упавшую сборку. Потом пинги Datadog, письма Sentry, SMS от UptimeRobot. Через месяц телефон вибрирует 50 раз в день, и ничто из этого не воспринимается как срочное. Самое неприятное: когда что-то действительно ломается, вы уже приучили себя это игнорировать.
Усталость от оповещений убивает время реакции. А медленная реакция убивает продукты.
Почему большинство систем мониторинга создаёт больше шума, чем сигнала
Фундаментальная проблема в том, что большинство систем оповещения обрабатывает все события одинаково. Нестабильный тест, который падает в 10 % случаев, получает тот же формат уведомления, что и «платёжный API отдаёт 500 всем пользователям». Одно из этих событий требует звонка в два часа ночи. Второму место, скорее всего, в еженедельном дайджесте.
Когда со всем обращаются одинаково, люди начинают игнорировать всё.
Решение не в том, чтобы уменьшить количество оповещений, а в более разумной доставке. Одно и то же событие с разным уровнем серьёзности или с разной частотой должно давать разный уровень срочности на телефоне.
Трёхуровневый подход
Echobell даёт три режима доставки, и грамотное использование всех трёх — это и есть суть подхода:
- Обычное (Active): стандартное push-уведомление. Подходит для информационных событий, которые не требуют немедленных действий.
- Срочное: пробивается через «Фокусирование» в iOS. Подходит для того, чем нужно заняться в ближайший час-два.
- Звонок: телефон звонит как при входящем вызове. Приберегите этот режим для случаев «чините прямо сейчас, иначе будут реальные последствия».
Задача — сохранить уровень звонка для событий, где задержка реакции приводит к реальным последствиям: потеря выручки, каскадные отказы, риск для пользовательских данных. Всё остальное опускается до срочного или ниже.
Sentry: перестаньте получать вызов на каждое исключение в Python
Sentry — хрестоматийный пример усталости от оповещений. По умолчанию он присылает письмо на каждый новый тип issue. На активной кодовой базе за обычную неделю это поток из брандспойта.
Более разумная настройка:
- В Sentry откройте Alerts → Create Alert → Issue Alert
- Добавьте условие:
The issue is seen more than 10 times in 1 hour - Добавьте действие: Send a notification via webhook → вставьте URL вашего канала Echobell
- Задайте каналу тип уведомления
time-sensitive
Для по-настоящему критичных путей — необработанные исключения в платёжных сценариях, сбои аутентификации, повреждение данных — создайте отдельное оповещение с более низким порогом и канал Echobell уровня calling. Этот канал звонит только тогда, когда ломается что-то именно на этом пути.
Результат: рутинные issue тихо накапливаются в дашборде Sentry. Проблемы, ломающие продакшен, звонят вам на телефон.
Prometheus и AlertManager: маршрутизация по уровню серьёзности
Если у вас развёрнут Prometheus, маршрутизацией уже занимается AlertManager. Оповещения можно отправлять напрямую в Echobell, добавив его как получателя вебхуков.
В вашем alertmanager.yml:
receivers:
- name: echobell-critical
webhook_configs:
- url: https://hook.echobell.one/t/<channel-token>
send_resolved: true
- name: slack-warnings
slack_configs:
- api_url: YOUR_SLACK_WEBHOOK
route:
group_by: ['alertname', 'job']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: slack-warnings
routes:
- match:
severity: critical
receiver: echobell-critical
При такой настройке оповещения с severity: critical уходят в Echobell и звонят вам на телефон, а предупреждения идут в Slack, где могут подождать до утра. Менять правила Prometheus не нужно — достаточно добавить слой маршрутизации в AlertManager.
Сам канал Echobell переведите в режим Звонок. Если AlertManager помечает событие как critical, оно заслуживает настоящего звонка.
AWS CloudWatch: SNS → Lambda → Echobell
У CloudWatch нет встроенного вывода в вебхуки, но с помощью SNS и небольшой функции Lambda задача решается за несколько минут.
- Создайте SNS-топик и привяжите его к сигналу тревоги CloudWatch
- Создайте функцию Lambda, подписанную на этот топик:
import json
import urllib.request
def lambda_handler(event, context):
message = json.loads(event['Records'][0]['Sns']['Message'])
alarm_state = message.get('NewStateValue', 'UNKNOWN')
payload = {
"title": f"AWS: {message['AlarmName']}",
"body": message.get('NewStateReason', 'No details'),
"notificationType": "calling" if alarm_state == "ALARM" else "active"
}
req = urllib.request.Request(
'https://hook.echobell.one/t/<channel-token>',
data=json.dumps(payload).encode(),
headers={'Content-Type': 'application/json'},
method='POST'
)
urllib.request.urlopen(req)
Эта схема работает для любого сервиса AWS с поддержкой SNS: события RDS, отказы сервисов ECS, оповещения о превышении порога расходов, изменения состояния инстансов EC2. Добавьте одну функцию Lambda, свяжите её с SNS — и каждый сигнал тревоги CloudWatch превращается в телефонный звонок, когда действительно срабатывает.
Маршрутизация оповещений как решение команды
Главный выигрыш от многоуровневых оповещений в том, что решение о маршрутизации становится явным, а не остаётся тем, что кто-то один однажды настроил и чего теперь никто не может найти.
Рабочая схема для небольшой команды разработки:
| Канал | Тип | Кто подписан |
|---|---|---|
production-api-critical | Звонок | Дежурный инженер |
production-api-warnings | Срочное | Вся команда разработки |
staging-all | Обычное | Команда разработки (по желанию) |
background-jobs | Обычное | Все желающие |
Когда меняется дежурство, уходящий отписывается от критического канала, а заступающий подписывается. Это и есть вся передача смены — без конфигурационных файлов и админ-панелей.
Каналы Echobell можно передавать ссылкой, поэтому подписка занимает у каждого нового участника команды около 10 секунд.
Тест на соотношение сигнал/шум
Прежде чем добавлять новое оповещение, задайте один вопрос: если оно сработает в три часа ночи в пятницу, что я на самом деле сделаю?
- «Проснусь и сразу починю» → Звонок
- «Займусь этим первым делом утром» → Срочное или Обычное
- «Скорее всего, ничего, снова засну» → пересмотрите, нужно ли это оповещение вообще
В большинстве систем мониторинга слишком много всего в первой категории и слишком мало во второй. Для большинства событий правильный ответ — «разберусь завтра», и срочное уведомление, которое появляется на экране блокировки без звонка, — ровно тот инструмент, который для этого нужен.
По одному изменению за раз
Если ваша текущая конфигурация вызывает усталость от оповещений, быстрее всего помогает не полная перестройка. Выберите самый шумный источник — скорее всего, письма Sentry или канал в Slack, который все отключили, — и распределите каждый тип событий по уровням: звонок, срочное или обычное.
Один источник. Одна неделя. Посмотрите, упадёт ли шум без потери сигнала.
Затем возьмитесь за следующий.
Хорошо настроенные оповещения — из тех вещей, что незаметно улучшают рабочие будни, без всякого пафоса. Вы перестаёте бояться собственного телефона. И начинаете доверять ему: если он звонит, значит, это действительно важно.