4. Noise vs signal
Соотношение сигнала и шума: культура устойчивого мониторинга
«Умение упрощать — значит устранять ненужное, чтобы необходимое заговорило в полный голос».
— Ханс Хофман
В предыдущей статье мы настроили инфраструктуру алертинга: связали Prometheus с Alertmanager и научились писать правила оповещений. Однако здесь системную инженерию подстерегает тонкая грань, отделяющая надежную систему телеметрии от назойливого генератора спама.
Если дежурный инженер получает за ночную смену пятьдесят оповещений в мессенджер, а утром механически смахивает их все в корзину — ваша Observability полностью сломана. Команда оказывается во власти тяжелейшей инженерной патологии — Alert Fatigue (Усталости от уведомлений).
Фундаментальная задача зрелой Observability — не собрать максимум терабайтов сырых данных, а максимизировать отношение Сигнала к Шуму (Signal-to-Noise Ratio, SNR).
Проблема информационного шума
В теории информации Клода Шеннона сообщение полезно лишь в той степени, в которой оно уменьшает неопределенность получателя. Если система непрерывно шлет однотипные сообщения о нормальных колебаниях нагрузки, неопределенность не уменьшается — она многократно возрастает. Инженеры теряют способность отличать штатные переходные процессы от надвигающейся катастрофы.
Сигнал vs Шум: Определения
- Сигнал (Signal): Информация, требующая действия. Это аномалия, которая влияет на бизнес или пользователей, и требует вмешательства инженера.
- Шум (Noise): Информация, не требующая действий. Это нормальная вариативность работы системы, известные проблемы или просто лишние данные.
Источники шума
В распределенных бэкенд-системах шум возникает по трем главным причинам:
1. Нормальная вариативность (Flapping)
Метрики в реальном мире "скачут". CPU может кратковременно подпрыгнуть до 100% при сборке мусора или старте приложения. Если вы поставите алерт cpu > 80%, вы получите бесконечный шум.
Это явление называется флаппингом (Flapping) — значение колеблется вокруг пороговой границы, вызывая каскад открытий и закрытий алерта.
Решение: Использование функций сглаживания (rate(), avg_over_time()) и задержки (for: 5m).
2. Мониторинг "Причин" вместо "Симптомов"
Алерт "CPU High" сам по себе — это шум. Это техническая метрика. Пользователь не видит CPU.
Алерт "High Latency" (высокая задержка) — это сигнал. Это симптом.
Правило: Алерты должны строиться вокруг того, что чувствует пользователь (SLO), а не вокруг того, что "чувствует" сервер.
Сервер с 95% утилизацией процессора может великолепно справляться с потоком запросов, отдавая их за 15 миллисекунд. Будить инженера из-за того, что процессор честно выполняет свою работу — абсурд.
3. High Cardinality в неправильном месте
Мы обсуждали кардинальность. Миллионы уникальных метрик — это шум для вашей базы данных мониторинга. Вы не можете построить осмысленный график по миллиону линий. Вы теряете возможность видеть общие тренды.
Инженерные методы фильтрации
Как превратить сырой поток данных в чистый сигнал?
flowchart TD
A["Raw Telemetry<br>Сырые данные"] --> B["Sampling & Filtering<br>Семплирование"]
B --> C["Aggregation<br>Агрегация"]
C --> D["Threshold & SLO<br>Пороги и цели"]
D --> E["Signal<br>Уведомление"]
subgraph "Noise Sources"
N1["Network Blips<br>Микро-сбои сети"]
N2["GC Pauses<br>Сборка мусора"]
N3["Known Issues<br>Известные баги"]
end
A --> N1
N1 -.->|"Filtered"| B
style A fill:#1e293b,stroke:#38bdf8,stroke-width:2px,color:#fff
style E fill:#881337,stroke:#f43f5e,stroke-width:2px,color:#fff
style Noise Sources fill:#0f172a,stroke:#475569,stroke-width:1px,color:#fff
1. Семплирование (Sampling) в Трейсинге
Вам не нужно сохранять 100% трейсов, чтобы понять, что система работает медленно.
- Head-based Sampling: Решение о записи трейса принимается в начале запроса (например, записываем 1% запросов).
- Tail-based Sampling: (Продвинутый уровень) Записываем 100% запросов в память, но сохраняем в базу только те, которые:
- Длились дольше N секунд.
- Закончились ошибкой (Status Code 500).
- Содержат конкретный
errorтег.
Это позволяет видеть "сигнал" (ошибки и тормоза) и игнорировать "шум" (успешные быстрые запросы), экономя деньги на хранении.
В OpenTelemetry Collector компонент tail_sampling буферизует спаны в оперативной памяти до завершения всего трейса и сохраняет только проблемные ветви.
2. Окна агрегации (Time Windows)
Никогда не алертуйте на мгновенное значение (cpu_now). Всегда используйте окно.
# Шумно: Среагирует на любую секундную вспышку
rate(http_requests_total[10s])
# Чисто: Сглаживает пики и показывает реальный тренд
rate(http_requests_total[5m])
Оконная функция работает как цифровой фильтр низких частот (Low-Pass Filter), отсекая высокочастотный дребезг и пропуская истинный направленный тренд.
3. Дедупликация и Группировка
Когда падает кластер из 50 подов, вам не нужно получать 50 алертов в Slack.
Alertmanager (который мы обсуждали в прошлой статье) должен сгруппировать их в один:
Alert: ServiceDown. Instances: 50. Это сигнал. 50 отдельных сообщений — это шум.
Mechanical Sympathy: CPU и "Счастливые ушки"
Существует когнитивная ошибка, называемая "Happy Ears" (Счастливые ушки). Мы склонны настраивать мониторинг так, чтобы графики были зелеными и красивыми, игнорируя реальные проблемы.
Например, вы можете настроить for: 30m, чтобы алерт срабатывал очень редко. Шума нет, "уши счастливы". Но в это время пользователи могут страдать от периодических 5-секундных задержек, которые "прыгают" и не держатся 30 минут.
Баланс: Настройка порогов — это итеративный процесс.
- Начните с чувствительных настроек.
- Если приходит шум — анализируйте.
- Если шум не важен — поднимите порог или добавьте
ignoreправило. - Повторяйте, пока поток алертов не станет равен количеству реальных инцидентов.
Итог
- Цель Observability — доставить сигнал, а не данные.
- Шум убивает доверие к мониторингу. Лучше один пропущенный алерт, чем 100 ложных срабатываний.
- Используйте SLO-based alerting (алерты по целям), чтобы фокусироваться на проблемах пользователей, а не серверов.
- Tail-based sampling — мощный инструмент для сбора полезного сигнала (ошибок) в трейсинге без захламления базы.
В следующей статье мы рассмотрим специфику запуска всех этих систем в среде Kubernetes: 5. Observability в Kubernetes.