Рабочая система алертов должна отправлять срочное уведомление только тогда, когда есть риск нарушения работы бизнес-критичного сервиса и дежурному нужно выполнить конкретное действие. Остальные сигналы направляют в информационные каналы, дашборды, тикеты или журналы событий.
Подход SRE рассматривает эксплуатацию как инженерную задачу. Мониторинг постоянно отслеживает availability, latency, performance и capacity, то есть доступность, задержку, производительность и запас ресурсов. Его задача не требует ручного наблюдения за каждым сервером, контейнером или строкой лога. Она требует понятной связи между сигналом, влиянием на пользователей и реакцией команды.
Дедупликация, группировка, задержки срабатывания, подавление зависимых событий и эскалация помогают поддерживать управляемый поток уведомлений. Для серверов, HTTP API и Kubernetes действует единый принцип: один реальный инцидент должен создавать понятную цепочку действий, а не десятки одинаковых сообщений.
Принцип полезного алертинга: уведомление должно означать риск инцидента
Событие, симптом, алерт и инцидент: рабочее разделение
Событие фиксирует факт изменения. Например, контейнер перезапустился, pod был пересоздан, у процесса изменился статус или на сервере завершилась плановая задача.
Симптом показывает возможную деградацию. К нему относятся рост доли ответов 5xx, увеличение latency, отсутствие ready endpoint или снижение количества доступных реплик. Симптом еще не всегда означает подтвержденный инцидент, однако он дает материал для оценки состояния сервиса.
Алерт представляет собой сообщение, которое требует реакции по заранее определенному правилу. Инцидентом считают подтвержденное нарушение или устойчивый риск нарушения работы сервиса. Например, единичный перезапуск контейнера остается событием, десять перезапусков за пять минут становятся симптомом, а недоступность пользовательского API после этих перезапусков превращается в инцидент.
Такое разделение убирает одну из главных причин alert fatigue. Каждое техническое изменение не обязано будить дежурного. Срочное уведомление оправдано, когда инженер понимает, зачем открыл сообщение и какое действие выполнит первым.
Проверка перед созданием алерта: кто и что должен сделать после сообщения
Перед добавлением правила ответьте на шесть вопросов:
- Какой сервис или пользовательский сценарий затронут?
- Кто владеет сервисом и кто принимает первый сигнал?
- Какое влияние уже возникло или ожидается?
- Какое действие выполняет дежурный после получения сообщения?
- Есть ли ссылка на дашборд, логи и runbook?
- Как система поймет, что проблема устранена?
Если на последний вопрос нет ответа, правило не готово. Сигнал можно оставить в журнале или информационном канале, пока для него не появится понятная процедура.
Алерт без действия создает нагрузку на команду и постепенно снижает доверие к мониторингу. После нескольких бесполезных сообщений дежурный начинает пропускать и действительно опасные события. Поэтому каждое правило должно быть связано с сервисом, владельцем, уровнем severity и ожидаемым результатом реакции.
Начните мониторинг серверов и сервисов с карты критичности
Составьте паспорт сервиса и его зависимостей
Сервер или pod редко представляет самостоятельную ценность для бизнеса. В центре карты должен находиться сервис: авторизация, API заказов, DNS, база данных, CI/CD, файловое хранилище или другой пользовательский сценарий.
Минимальный паспорт сервиса содержит:
- название и назначение;
- пользовательский сценарий;
- команду или владельца;
- компоненты и экземпляры;
- внешние зависимости;
- ссылку на дашборд;
- ссылку на runbook;
- основной и резервный канал эскалации;
- допустимый уровень деградации.
Зависимости нужно описывать явно. К ним относятся DNS, сеть, балансировщик, база данных, очередь, хранилище и внешний API. Если база данных недоступна, одновременно изменятся метрики приложения, очереди и HTTP API. Карта зависимостей помогает связать эти сигналы в один инцидент.
Определите критичность по влиянию на пользователей и бизнес
Приоритет нельзя назначать только по типу метрики. Заполненный диск на тестовом сервере и недоступность основного API требуют разной реакции, даже если оба события выглядят как превышение порога.
Удобная классификация выглядит так:
- Критический уровень: сервис недоступен или заметно деградирует, влияние уже затрагивает пользователей, требуется немедленная реакция.
- Предупреждающий уровень: обнаружен устойчивый риск, запас ресурса сокращается, проблему нужно разобрать в рабочее время.
- Информационный уровень: произошло изменение или зафиксировано состояние, срочное действие не требуется.
- Плановое событие: уведомление связано с согласованными работами и должно попасть в журнал или рабочий канал.
При оценке учитывайте число затронутых пользователей, финансовый или операционный ущерб, наличие обходного пути и допустимое время реакции. Один и тот же сигнал получает разный severity в production, staging и тестовой среде.
Выберите сигналы состояния: доступность, задержки, производительность и емкость
Четыре группы сигналов дают базовую модель наблюдения:
- Availability: отвечает ли сервис на запросы и доступен ли пользовательский путь.
- Latency: сколько времени занимает ответ, включая p95 или p99 для чувствительных операций.
- Performance: справляется ли сервис с обработкой запросов, очередей и фоновых задач.
- Capacity: сколько свободной емкости осталось у дисков, памяти, CPU, сетевых каналов и других ресурсов.
Для пользователя важнее внешнее поведение сервиса. Технические метрики сервера помогают найти причину, но высокая загрузка CPU сама по себе еще не доказывает инцидент, если API отвечает в пределах SLO. Практическая схема выбора метрик и порогов описана в руководстве по мониторингу производительности автоматических систем.
SLO, Service Level Objective, задает целевой уровень сервиса. Например, команда может определить, что 99,9% запросов API должны завершаться успешно, а p95 latency критичного маршрута не должна превышать согласованное значение. Порог алерта выбирают с учетом этого обязательства, исторической нагрузки и времени, необходимого для реакции.
Правила срабатывания алертов: от метрики к однозначному действию
Шаблон правила: сигнал, условие, длительность, охват, приоритет и действие
Рабочее правило можно описать как контракт из шести частей:
- сигнал и источник данных;
- условие срабатывания;
- длительность нарушения;
- охват, то есть сервис, окружение и затронутые экземпляры;
- severity;
- ожидаемое действие.
В карточку алерта добавьте владельца, ссылку на дашборд, runbook и идентификатор зависимости. Абстрактная запись «CPU выше 90%» дает мало пользы. Практичный вариант выглядит так: api-orders / production / p95 latency выше SLO 10 минут / затронуты 30% запросов / critical / открыть диагностику API и проверить базу данных.
Временное окно защищает от кратковременных колебаний. Условие без длительности может срабатывать на единичный неудачный запрос или короткий всплеск нагрузки. Порог выбирают по baseline конкретного сервиса, а не копируют из чужой конфигурации. Для batch-задачи, веб-сервиса и базы данных нормальный профиль нагрузки различается.
Критический, предупреждающий и информационный уровень уведомлений
Critical означает заметное влияние на сервис или высокий риск ущерба в ближайшее время. Такое сообщение попадает дежурному инженеру и требует подтверждения получения.
Warning показывает устойчивое отклонение, которое пока не нарушило SLO. Примеры: ускорившийся рост диска, снижение запаса памяти, увеличение времени выполнения фоновой задачи. Получатель разбирает предупреждение в рабочее время и устраняет причину до перехода в critical.
Info фиксирует изменение без срочной реакции. Это может быть завершение работ, изменение конфигурации, перезапуск после планового обновления или появление нового экземпляра сервиса.
Уровень выбирают по последствиям и времени до ущерба. Универсальные числа для severity не подходят: 80% заполнения диска опасны для быстро растущей базы данных и безопасны для архива с неизменяемым объемом.
Алертируйте симптомы деградации, а причины используйте для диагностики
Симптом описывает то, что видит пользователь: недоступность страницы, рост ошибок API, увеличение задержки или отсутствие результата операции. Причина может находиться в CPU, памяти, сети, очереди, базе данных или внешнем сервисе.
Симптомы обычно подходят для page-уведомлений. Причинные метрики полезны как warning, аннотации и элементы диагностики. Высокий CPU не всегда требует немедленного вмешательства, если очередь запросов стабильна, ошибки отсутствуют, а latency остается в пределах SLO.
Связь между причиной и симптомом нужно проверять на реальных сценариях. Если рост CPU стабильно предшествует отказу API, его можно включить в маршрут эскалации. Если корреляция случайна, сигнал лучше оставить в дашборде и не будить им дежурного.
Как убрать шум: дедупликация, группировка, задержки и подавление
Дедупликация повторных алертов по стабильному идентификатору
Дедупликация объединяет повторные срабатывания одного правила. Для fingerprint используйте имя правила, сервис, окружение и значимые метки. В идентификатор не включайте текущее значение метрики, timestamp и другие поля, которые меняются при каждом цикле проверки.
Если fingerprint стабилен, повторная проверка обновляет уже открытый инцидент, а не создает новое сообщение. Напоминания отправляйте с обоснованным интервалом, например раз в 30 минут для critical-события, если команда еще не подтвердила получение. После подтверждения частоту можно уменьшить или прекратить до изменения состояния.
Дедупликация не должна скрывать новый объект воздействия. Недоступность одного экземпляра и недоступность всего сервиса требуют разных групп. Состав меток выбирайте так, чтобы одна группа соответствовала одной задаче дежурного.
Группировка связанных сигналов и подавление дочерних симптомов
При отказе базы данных одновременно могут сработать правила приложения, очередей, API и фоновых задач. Без группировки дежурный получает каскад сообщений, хотя первичная проблема одна.
Общую зависимость показывают как основной алерт, а дочерние симптомы объединяют в тот же инцидент или временно подавляют. Для этого нужна заранее описанная зависимость: приложение использует конкретный кластер базы данных, а очередь зависит от определенного брокера.
Подавление безопасно только при ясной связи. Если база данных доступна, а API продолжает возвращать 5xx, дочерний сигнал должен пройти отдельно. Слишком широкое правило подавления может скрыть вторую независимую проблему.
В Prometheus и Alertmanager такие механики обычно настраивают через группы, маршруты и условия подавления. Готовые примеры конфигурации собраны в практическом руководстве по Prometheus и Alertmanager.
Задержки срабатывания, окна восстановления и режим обслуживания
Задержка срабатывания требует, чтобы условие сохранялось заданное время. Это отфильтровывает единичный неудачный запрос, краткий сетевой сбой и короткий всплеск нагрузки. Для критичного synthetic-check допустимо короткое окно, для capacity-алерта полезнее оценивать устойчивый тренд.
Окно восстановления фиксирует, когда состояние вернулось в норму. Уведомление о recovery должно содержать имя исходного алерта, время восстановления и длительность нарушения. Без этой информации дежурному сложно понять, закрылась проблема сама или после его действий.
Maintenance-окно отключает ожидаемые уведомления на период согласованных работ. У него должны быть владелец, причина, список затронутых сервисов, начало и окончание. Обязательный срок действия защищает от ситуации, когда мониторинг забыли включить после завершения работ.
Мониторинг инцидентов и уведомления: маршрутизация, эскалация и контекст
Маршрутизируйте алерты по владельцу сервиса, а не по имени метрики
Имя метрики не определяет ответственного. Метрика http_requests_total может относиться к нескольким командам, окружениям и приложениям. Для маршрутизации используйте метки:
service;environment;teamилиowner;severity;component;- регион или кластер, если это влияет на реакцию.
Critical-событие направляют дежурному инженеру по основному каналу и в резервный канал при отсутствии подтверждения. Warning попадает в рабочий чат или тикет. Info остается в журнале либо на дашборде.
Отправка всех событий в общий чат не формирует процесс реагирования. Инженеру приходится вручную определять владельца, приоритет и масштаб проблемы, поэтому время до первого действия растет.
Эскалация: когда напоминать, подключать следующую линию и объявлять инцидент
Эскалация должна описывать последовательность, а не зависеть от памяти дежурного:
- система отправляет первичное critical-уведомление;
- дежурный подтверждает получение;
- при отсутствии подтверждения система повторяет сообщение через заданный интервал;
- после нескольких безуспешных попыток подключается резервный инженер;
- при затрагивании зависимости подключается ее владелец;
- при превышении согласованного времени объявляется инцидент с отдельным руководителем.
Интервалы выбирают по критичности сервиса, SLO и допустимому времени реакции. Для API с коротким RTO и для внутреннего отчета ночная схема будет разной.
Сквозной процесс доставки, тикетинга, on-call и эскалации разобран в руководстве по интеграции мониторинга с уведомлениями и тикетингом.
Что должно быть в сообщении об инциденте
Одно сообщение должно дать дежурному исходные данные для диагностики:
- заголовок с severity;
- сервис и окружение;
- время начала;
- условие срабатывания и текущее значение;
- масштаб, регион и затронутые объекты;
- ссылка на дашборд;
- ссылка на runbook;
- последние релевантные изменения;
- вероятная причина, если она известна;
- текущий статус подтверждения.
Для изменений конфигурации полезно показывать источник: панель управления, API-ключ, Telegram-бот или автоматика. Такой контекст помогает отличить техническую неисправность от ожидаемого изменения. В журнале действий полезно хранить автора и источник каждой операции.
Заголовок должен отвечать на три вопроса: что случилось, где это произошло и насколько срочно. Формат вроде [CRITICAL] api-orders production: p95 latency выше SLO, 42% запросов, 10 минут полезнее сообщения «Alert firing».
Примеры алертов для серверов, веб-сервисов и Kubernetes
Сервер или виртуальная машина: недоступность, ресурсы и дисковая емкость
Для сервера обычно нужны несколько независимых групп сигналов:
- узел не отвечает на проверку доступности;
- закончилась память или начался устойчивый swap;
- CPU долго работает в режиме saturation;
- файловая система возвращает ошибки;
- диск приближается к заполнению с учетом скорости роста данных;
- заканчиваются inodes;
- критичный системный сервис остановлен.
Алерт на заполнение диска должен учитывать прогноз, а не только текущий процент. 85% заполнения на диске, который получает 20 ГБ в час, требует более быстрой реакции, чем такой же показатель на архиве без роста. Для capacity-алерта полезно показывать текущий объем, скорость изменения и расчетный запас в днях.
Высокий CPU не всегда означает проблему. Сравните его с latency, длиной очереди, количеством ошибок и пропускной способностью. Если API продолжает отвечать в пределах SLO, сигнал может получить warning. Если задержки растут и пользователи получают ошибки, правило должно перейти в critical.
HTTP API и веб-сервис: доступность, ошибки и задержки пользовательского пути
Проверяйте сервис с внешней точки наблюдения и изнутри инфраструктуры. Синтетический сценарий может выполнять запрос к авторизации, созданию заказа или чтению объекта каждые 30-60 секунд. Интервал зависит от стоимости проверки и допустимой задержки обнаружения.
Базовый набор включает:
- доступность endpoint;
- долю ответов 5xx и отдельно 4xx, если они отражают ошибку клиента или конфигурации;
- p95 и p99 latency ключевых маршрутов;
- результат синтетического пользовательского сценария;
- число доступных экземпляров;
- ошибки и задержки зависимых сервисов.
Отделяйте проблему одного экземпляра от отказа всего API. Один pod с ошибками требует проверки балансировщика и состояния workload. Рост 5xx на всех экземплярах указывает на общую проблему приложения или зависимости.
Если API обращается к внешнему AI-сервису, в уведомлении указывайте отдельный компонент зависимости, лимит запросов и статус ключа. Для проектов, которым нужен единый доступ к моделям через API, можно связать диагностику с используемым шлюзом AiTunnel, сохраняя в алерте конкретный маршрут и источник ошибки.
Kubernetes и распределенные сервисы: проверяйте доступную нагрузку, а не только состояние pod
Статус Running не доказывает, что приложение обслуживает запросы. Pod может работать, но не проходить readiness probe, не получать трафик или постоянно перезапускаться.
Для Kubernetes отслеживайте:
- разницу между desired и available replicas;
- отсутствие ready endpoint;
- устойчивые перезапуски и рост
restart count; - pod в статусе Pending из-за нехватки ресурсов или проблем планировщика;
- превышение CPU и memory limits;
- ошибки ingress и балансировщика;
- latency и ошибки приложения за пределами кластера;
- доступность зависимой базы данных, очереди или хранилища.
Связывайте сигналы кластера с пользовательским сервисом. Отсутствие одной реплики может быть безопасным при наличии запаса, а отсутствие ready endpoint для единственного экземпляра сразу означает недоступность приложения.
Для тестового Kubernetes-кластера или временной среды с виртуальными серверами подойдет облачная инфраструктура Timeweb Cloud. В алертах такой среды отдельно указывайте окружение, чтобы тестовые события не попадали в production-канал.
| Объект | Сигнал | Условие | Задержка | Уровень | Получатель | Действие |
|---|---|---|---|---|---|---|
| Виртуальная машина | Доступность узла | Проверка не проходит устойчиво | По профилю сети | Critical | Дежурный инфраструктуры | Проверить сеть, гипервизор и сервисы |
| Файловая система | Емкость и скорость роста | Запас меньше допустимого окна | Несколько проверок | Warning или critical | Владелец платформы | Освободить место или расширить том |
| HTTP API | Ошибки и p95 latency | Нарушен SLO на ключевом маршруте | Заданный интервал | Critical | Владелец API | Проверить релиз, зависимость и нагрузку |
| Kubernetes workload | Available replicas и ready endpoint | Доступных экземпляров недостаточно | Несколько минут | Critical | Дежурный команды | Проверить rollout, ресурсы и планирование |
Условия в таблице служат шаблоном. Их проверяют на исторической нагрузке, архитектуре, SLO и времени восстановления конкретного сервиса. Универсальный порог без этих данных создает ложную точность.
Проверьте систему алертов до production-инцидента
Проведите контролируемые сценарии отказа
Проверяйте полный путь уведомления в тестовой среде или в согласованное окно. Подходящие сценарии:
- остановка одного экземпляра;
- недоступность базы данных или очереди;
- устойчивый рост latency;
- заполнение тестового диска;
- ошибка маршрута API;
- недоступность части реплик;
- потеря сетевой связи с зависимостью.
Для каждого сценария измеряйте время обнаружения, число сообщений, корректность группы, маршрут, полноту контекста, работу эскалации и уведомление о восстановлении. Отдельно проверьте, что подавление дочерних сигналов не скрывает самостоятельную проблему.
Проверяйте новые правила через наблюдение и последующую настройку
Новое правило сначала оставляйте в неэскалирующем режиме. Сопоставьте его с историческими инцидентами, нормальной нагрузкой и ручными проверками. После этого включите рабочий канал и наблюдайте за результатом.
Изменяйте по одному параметру: порог, длительность, группировку или маршрут. Так проще понять, почему изменилась частота срабатывания. Если одновременно поменять несколько настроек, причина эффекта потеряется.
После первого production-срабатывания проверьте, получил ли дежурный понятный контекст, смог ли открыть runbook и совпал ли фактический масштаб с описанием алерта.
Подготовьте runbook для каждого алерта, который будит дежурного
Минимальный runbook содержит:
- значение алерта простым языком;
- способ подтвердить влияние на пользователей;
- ссылки на нужные дашборды и логи;
- частые причины;
- безопасные действия по восстановлению;
- условия подключения владельца зависимости;
- критерии закрытия инцидента.
Алерт считается готовым после проверки метрики, правила, задержки, дедупликации, группировки, доставки, подтверждения, эскалации и восстановления. Постоянное ручное спасение системы маскирует повторяющиеся дефекты и делает результат зависимым от опыта конкретного инженера.
Поддерживайте качество алертов: аудит, метрики и чек-лист
Какие показатели качества алертинга отслеживать
Оценивать систему нужно по нескольким показателям:
- число уведомлений на один инцидент;
- доля алертов с конкретным действием;
- частота ложных срабатываний;
- число пропущенных инцидентов;
- время до подтверждения;
- время до начала диагностики;
- доля уведомлений без владельца или runbook;
- доля инцидентов с корректно указанной причиной.
Низкое количество алертов само по себе не говорит о качестве. Оно может означать, что система пропускает важные события. Сопоставляйте частоту уведомлений с пропущенными инцидентами, временем реакции и результатами разборов.
Аудит владельцев, источников изменений и устаревших правил
Для каждого правила проверяйте действующего владельца, сервис, окружение, канал доставки, severity, ссылку на runbook и причину существования. Правила храните как код или в другой системе с историей изменений.
Фиксируйте источник каждой правки: пользователь из панели управления, API-ключ, бот или автоматика. Такая запись помогает понять, кто изменил маршрут, порог или окно обслуживания. Устаревшие правила удаляйте после проверки зависимостей, а не оставляйте как фоновой шум.
Чек-лист перед включением нового алерта
- Описано ли влияние на сервис или пользовательский сценарий?
- Есть ли действующий владелец?
- Определены ли severity и канал доставки?
- Задана ли длительность нарушения?
- Настроена ли дедупликация?
- Определена ли группировка связанных сигналов?
- Учтены ли зависимости и maintenance-окна?
- Есть ли runbook с первым действием?
- Проверены ли сценарии срабатывания и восстановления?
- Не дублирует ли новое правило существующий алерт?
- Понятно ли, кто получает эскалацию без подтверждения?
После каждого заметного инцидента проверяйте, был ли алерт своевременным, понятным и полезным. После ложного срабатывания меняйте условие, длительность или маршрут. История таких изменений показывает, какие правила действительно помогают поддерживать доступность, latency, производительность и емкость сервисов.