Перейти к основному содержимому

Логирование, мониторинг и наблюдаемость систем

Разработчику Архитектору Инженеру

Логирование, мониторинг и наблюдаемость систем

Логирование и мониторинг в CI/CD необходимы для автоматизации процессов и обеспечения качества, позволяя отслеживать ход пайплайна и быстро выявлять проблемы. Логирование записывает все события, такие как сборка, тестирование и развертывание, а мониторинг непрерывно отслеживает состояние системы и её компонентов в реальном времени.

Мониторинг — это система, которая постоянно следит за вашим сервисом и отвечает на вопрос "Всё ли работает?". Как пульсометр у пациента, если что-то пошло не так — команда узнаёт об этом через минуту и может быстро отреагировать.

Представьте, что ваш сайт упал в 3 часа ночи. Без мониторинга вы узнаете об этом утром от злых клиентов. С мониторингом — получите смс, проснётесь и почините за 10 минут.

Основные задачи:

  • узнавать о проблемах раньше пользователей;
  • понимать, что именно сломалось (БД? память? сеть?);
  • видеть прогнозы (диск закончится через три дня, надо купить новый);
  • автоматически чинить.

Обычно смотрят:

  • железо (загрузка ЦП, память, место на диске);
  • приложение, его доступность, скорость ответа и ошибки;
  • базы данных (количество соединений, скорость запросов);
  • сеть (потеря пакетов и задержки);
  • бизнес (количество заказов в минуту, например).

Чтобы настроить, нужно:

  • поставить сборщик метрик, например, Prometheus;
  • подготовить сервисы к опросу;
  • настроить алерты;
  • нарисовать красивые дашборды в Grafana;
  • настроить оповещения.

Дашборд Grafana — метрики CPU, сети и производительности хоста

Play ITЗагрузка интерактивного демо…

Практикум

Пошаговая установка Prometheus, Grafana, Alertmanager, Loki, Tempo, Alloy, OpenTelemetry и k6 — Практикум Prometheus и Grafana. Теория метрик и сравнение стеков — мониторинг в sysadmin. Готовые PromQL-запросы — галерея Lab.

После деплоя вопрос один — "всё ли в порядке?" Мониторинг отвечает агрегированными цифрами (ошибки в секунду, latency), логи — конкретными строками ("timeout к payment-service на заказе 12345"), трассировки — путём запроса через десять микросервисов. В SRE-подходе без этих сигналов нельзя ни измерить SLO, ни безопасно катить canary.

Быстрый минимум для команды

Если времени мало, начните с трёх вещей — экспортируйте RED-метрики (rate, errors, duration), добавьте алерты на пользовательские симптомы (5xx, latency), и переведите логи в структурированный JSON с trace_id.


Мониторинг в автоматизированных системах

Мониторинг — это систематический процесс наблюдения за состоянием ИТ-инфраструктуры и приложений с целью обеспечения их доступности, производительности и стабильности. В условиях автоматизации мониторинг перестаёт быть пассивным инструментом диагностики и превращается в активный элемент обратной связи, управляющий адаптивным поведением системы — автоматическим масштабированием, перезапуском сервисов, оповещением инженеров и т.д.


Основные цели мониторинга

  1. Обнаружение проблем — своевременная идентификация сбоев, деградации производительности или аномального поведения системы.
  2. Диагностика — предоставление контекста и деталей для анализа корневых причин инцидентов.
  3. Проактивная защита — предупреждение инцидентов до их возникновения на основе трендов и предиктивных моделей.
  4. Отчётность и визуализация — формирование понятных представлений о состоянии системы для операторов, менеджеров и заинтересованных сторон.
  5. Поддержка принятия решений — предоставление объективных данных для планирования ёмкости, оптимизации ресурсов и архитектурных изменений.

Виды мониторинга

  • Системный мониторинг — отслеживание состояния физических и виртуальных узлов — загрузка CPU, потребление памяти, использование дискового пространства, температура и т.п. Этот уровень обеспечивает представление о "здоровье" хоста.
  • Прикладной мониторинг — контроль работоспособности бизнес-логики — время отклика API, частота ошибок 5xx, успешность транзакций, состояние очередей сообщений. Здесь в центре внимания — пользовательский опыт.
  • Инфраструктурный мониторинг — наблюдение за компонентами, лежащими между приложением и хостом — базы данных, кэши (Redis, Memcached), брокеры сообщений (Kafka, RabbitMQ), DNS и сетевые сервисы.
  • Удалённый (synthetic) мониторинг — эмуляция действий пользователя из внешней точки (например, проверка доступности веб-страницы раз в минуту из разных географических регионов). Позволяет выявлять проблемы, невидимые изнутри системы.
  • Профилирование производительности — глубокий анализ поведения приложения на уровне вызовов функций, распределения памяти, блокировок. Инструменты: PerfView (для .NET), Java Flight Recorder, perf в Linux.

Ключевые метрики мониторинга

КатегорияПримеры метрик
ПроцессорCPU Load, Idle Time, Context Switches
ПамятьMemory Usage, Swap Usage, Page Faults
ДискDisk I/O Operations, Read/Write Latency, Queue Depth
СетьNetwork Traffic, Packet Loss, TCP Retransmits
ПриложениеRequest Rate, Error Rate, Latency (p50, p95, p99)
ДоступностьUptime, Health Check Status

Метрики должны собираться с учётом принципа сигнального шума: избыток данных без аналитической ценности затрудняет поиск реальных проблем. Поэтому важна полнота сбора и семантическая значимость метрик в контексте конкретной системы.


Инструменты мониторинга

  • Prometheus — система с открытым исходным кодом для сбора и хранения временных рядов (time-series). Использует pull-модель: периодически опрашивает эндпоинты метрик (обычно /metrics в формате текста). Поддерживает мощный язык запросов (PromQL) и интеграцию с десятками экспортеров (Node Exporter, PostgreSQL Exporter и др.).
  • Grafana — платформа для визуализации метрик из различных источников (Prometheus, InfluxDB, Elasticsearch и др.). Позволяет строить дашборды с графиками, гистограммами, тепловыми картами и алертами.
  • Zabbix — комплексное решение для мониторинга, сочетающее сбор метрик, логирование событий, сетевой мониторинг и управление алертами. Поддерживает как агентскую, так и агентлесс-модели. Пошаговый стенд — Практикум Zabbix.
  • Nagios — один из первых и наиболее известных инструментов для обнаружения сбоев. Ориентирован на проверку доступности сервисов и уведомление при выходе параметров за пороги.
  • Datadog — коммерческая облачная платформа, объединяющая мониторинг инфраструктуры, приложений, логов и трассировок в единой панели. Особенно популярен в средах с микросервисами и serverless-архитектурами.

Мониторинг в автоматизированной системе должен быть интегрирован с процессами управления инцидентами: алерты — триггер для автоматических или ручных действий. В зрелых системах алерты сопровождаются контекстом (связанные метрики, логи, трассировки), что сокращает время Mean Time To Acknowledge (MTTA) и Mean Time To Resolve (MTTR).


Логирование

Play ITЗагрузка интерактивного демо…

Логирование представляет собой процесс записи структурированных или полуструктурированных событий, происходящих в программном обеспечении, операционной системе или инфраструктуре. В отличие от мониторинга, ориентированного на агрегированные метрики, логирование сохраняет контекстуальные детали отдельных операций, что делает его незаменимым инструментом для отладки, аудита, расследования инцидентов и анализа поведения системы.

В условиях автоматизации логирование не ограничивается лишь записью в файл. Оно становится элементом распределённой системы наблюдаемости (observability), интегрированной с мониторингом, трассировкой и системами управления инцидентами. Эффективное логирование требует чёткой стратегии — определения типов логов, уровней детализации, форматов, механизмов маршрутизации и политик хранения.


Типы логов

В зависимости от источника и назначения, логи делятся на следующие категории:

  • Системные логи — генерируются ядром операционной системы или системными демонами. Содержат информацию о загрузке, аппаратных событиях, сетевых подключениях, ошибках драйверов. В Unix-подобных системах такие логи традиционно управляются через syslog или journald (в systemd).
  • Операционные логи — фиксируют действия пользователей и операторов — вход в систему, выполнение команд, изменение конфигураций. Такие логи критически важны для аудита безопасности и соответствия требованиям регуляторов (GDPR, PCI DSS, HIPAA).
  • Логи ошибок — содержат диагностическую информацию о сбоях, исключениях, недоступных ресурсах, таймаутах. Включают stack trace, коды ошибок, входные параметры операций. Цель — ускорение локализации и устранения дефектов.
  • Производственные (business) логи — отражают ключевые бизнес-события — оформление заказа, оплата, изменение статуса заявки. Используются для ИТ-диагностики и для аналитики, построения воронок конверсии и выявления мошенничества.

В распределённых системах также выделяют трассировочные логи (tracing logs), которые связывают операции, проходящие через несколько сервисов, с помощью уникальных идентификаторов (trace ID, span ID). Это позволяет восстановить полный путь запроса и выявить узкие места.


Уровни логирования

Уровни логирования определяют приоритет и назначение записи. Стандартизированные уровни (в порядке возрастания серьёзности):

  • DEBUG — детальная техническая информация, полезная исключительно в процессе разработки или глубокой диагностики. В продакшене обычно отключается из соображений производительности и безопасности.
  • INFO — подтверждение нормального течения процессов — запуск сервиса, обработка запроса, завершение фоновой задачи. Используется для понимания последовательности операций.
  • WARNING — индикация потенциально проблемной ситуации, не приводящей к сбою — использование устаревшего API, неоптимальный запрос, временная недоступность внешнего сервиса.
  • ERROR — фиксация ошибки, нарушающей выполнение конкретной операции, но не приводящей к остановке всего приложения (например, сбой валидации входных данных).
  • CRITICAL (или FATAL) — катастрофическая ошибка, делающая дальнейшую работу компонента невозможной — исчерпание памяти, потеря соединения с основной БД, фатальное исключение.

Корректное использование уровней позволяет фильтровать поток логов, направлять критические события в каналы быстрого реагирования и избегать "шума" в рутинных ситуациях.


Способы использования логов

Логи служат нескольким ключевым целям:

  • Отладка и диагностика — восстановление последовательности событий, приведших к сбою, включая входные данные и состояние окружения.
  • Мониторинг состояния — на основе логов могут строиться метрики (например, частота ошибок 5xx) и триггеры (например, алерт при росте числа WARNING за минуту).
  • Анализ ошибок — агрегация и классификация исключений для выявления системных проблем, а не единичных сбоев.
  • Аудит и compliance — подтверждение выполнения операций уполномоченными субъектами, защита от репудиации.
  • Аналитика пользовательского поведения — при условии анонимизации и соблюдения политики конфиденциальности.

Важно, чтобы логи не содержали чувствительных данных (пароли, токены, персональные данные без маскировки), что требует применения фильтров и механизмов санитизации на этапе генерации.


Механизмы сбора логов

Сбор логов зависит от платформы и архитектуры приложения:

  • В JVM-экосистеме используются фреймворки — Logback, Log4j 2, java.util.logging. Они поддерживают гибкую конфигурацию аппендеров (файл, сеть, syslog), фильтрацию по уровням и форматированию в JSON.
  • В Unix-системах традиционно применяется протокол Syslog (RFC 5424), позволяющий централизованно собирать логи с множества хостов. Современные реализации (rsyslog, syslog-ng) поддерживают TLS, фильтрацию и маршрутизацию.
  • В облачных средах (Azure, AWS, GCP) рекомендуется использовать нативные сервисы — Azure Application Insights, AWS CloudWatch Logs, Google Cloud Logging, которые интегрируются с другими компонентами платформы.
  • В контейнеризованных средах (Docker, Kubernetes) логи приложений выводятся в stdout/stderr и перехватываются агентами (Fluentd, Fluent Bit), которые пересылают их в центральное хранилище.

Инструменты хранения и анализа логов

Современные системы логирования строятся по принципу ELT (Extract, Load, Transform) — сырые логи отправляются в хранилище, а обработка (парсинг, индексация, агрегация) происходит на стороне аналитической платформы.

Ключевые экосистемы и инструменты:

  • ELK Stack (Elasticsearch, Logstash, Kibana):

    • Logstash — агент для приёма, преобразования и маршрутизации логов.
    • Elasticsearch — распределённая поисковая система на основе Lucene, оптимизированная для индексации и поиска по текстовым данным.
    • Kibana — веб-интерфейс для визуализации, поиска и построения дашбордов. В последнее время Logstash часто заменяют на Filebeat или Fluentd для снижения потребления ресурсов.
  • Graylog — альтернатива ELK с более простой архитектурой. Включает встроенный веб-интерфейс, поддержку алертов, управления пользователями и интеграцию с LDAP. Хранит данные в Elasticsearch, но упрощает развёртывание и конфигурацию.

  • Splunk — коммерческая платформа с мощными возможностями поиска, корреляции событий и машинного обучения. Широко используется в enterprise-средах благодаря гибкости и поддержке compliance.

  • Grafana Loki — лёгкая альтернатива, разработанная Grafana Labs. Не индексирует полное содержимое логов, а строит индекс только по меткам (labels), что снижает стоимость хранения. Интегрируется с Grafana и Prometheus, формируя единый стек наблюдаемости.

  • Prometheus + Grafana — хотя изначально предназначены для метрик, могут дополняться логами через экспортеры или интеграцию с Loki.

Выбор инструмента зависит от масштаба системы, требований к задержке, объёма данных, бюджета и необходимости соответствия нормативным актам.


Дефекты наблюдаемости и эксплуатации

Наблюдаемость представляет собой способность системы раскрывать своё внутреннее состояние через внешние сигналы: метрики, логи и трассировки. Эксплуатационная надёжность зависит от полноты и достоверности этих сигналов. Дефекты наблюдаемости создают слепые зоны, в которых система продолжает функционировать, при этом инженеры утрачивают понимание происходящих внутри процессов.

Дефект наблюдаемости — нарушение в системе сбора, обработки или интерпретации телеметрических данных, приводящее к утрате видимости внутреннего состояния приложения или инфраструктуры.

Эксплуатационный дефект — отклонение в процессах развёртывания, конфигурирования или мониторинга, проявляющееся в виде скрытой деградации сервиса при сохранении формальной работоспособности.

Инженер по надёжности рассматривает наблюдаемость как фундаментальное свойство системы, закладываемое на этапе проектирования. Попытки добавить наблюдаемость постфактум приводят к появлению слепых зон и формированию ложного чувства контроля над системой.


Природа скрытой деградации наблюдаемости

Системы мониторинга и наблюдаемости развиваются вместе с приложением. На ранних этапах развития проекта хватает базовых проверок доступности и простых логов. По мере роста сложности системы количество компонентов, взаимодействий и состояний возрастает экспоненциально, а механизмы наблюдения остаются на прежнем уровне.

Процесс деградации наблюдаемости развивается по предсказуемому сценарию:

  1. Система расширяется новыми компонентами и интеграциями.
  2. Существующие механизмы мониторинга покрывают только исходный набор компонентов.
  3. Новые элементы работают без полноценного наблюдения.
  4. Логи теряют структурированность из-за отсутствия единых стандартов.
  5. Алерты настраиваются реактивно, после уже произошедших инцидентов.
  6. Накопление технического долга в области наблюдаемости достигает критической массы.
  7. Происходит инцидент, при котором инженеры обнаруживают полную слепоту в отношении затронутых компонентов.
Стадия деградацииПризнакПоследствия
ЛатентнаяНовые сервисы без метрикОтсутствие видимости новых компонентов
РанняяРост шума в логахЗатруднённый поиск значимых событий
АктивнаяЛожные срабатывания алертовИгнорирование предупреждений инженерами
КритическаяПропуск реальных инцидентовОбнаружение проблем через жалобы пользователей

Три столпа наблюдаемости

Классическая модель наблюдаемости опирается на три независимых источника данных, каждый из которых раскрывает определённый аспект поведения системы.


Метрики

Метрики — числовые измерения, агрегируемые во времени, отражающие количественные характеристики работы системы.

Метрики обеспечивают компактное представление данных и эффективное хранение за длительные периоды. Типичные метрики включают:

  • Количество обработанных запросов в секунду.
  • Процент ошибочных ответов.
  • Распределение времени отклика по перцентилям.
  • Использование процессора, памяти, дискового пространства.
  • Размер очередей и пулов соединений.
  • Количество активных потоков и горутин.

Метрики делятся на несколько типов:

Тип метрикиОписаниеПрименение
CounterМонотонно возрастающий счётчикОбщее число запросов, ошибок
GaugeМгновенное значениеТемпература, использование памяти
HistogramРаспределение значений по бакетамВремя отклика, размер ответа
SummaryКвантильные значенияПроцентили P50, P95, P99

Логи

Логи — дискретные записи событий, происходящих в системе, сопровождаемые временной меткой и контекстной информацией.

Логи предоставляют детализированную картину отдельных операций. Качественные логи содержат:

  • Точную временную метку с миллисекундной точностью.
  • Уровень значимости события (TRACE, DEBUG, INFO, WARN, ERROR, FATAL).
  • Идентификатор запроса для сквозной трассировки.
  • Имя компонента или модуля, породившего событие.
  • Структурированные данные о контексте операции.
  • Человекочитаемое описание произошедшего.

Трассировки

Трассировки — записи прохождения запроса через все компоненты распределённой системы, фиксирующие временные интервалы и причинно-следственные связи.

Трассировки незаменимы для анализа поведения запросов в микросервисных архитектурах. Каждый запрос получает уникальный идентификатор (trace_id), сопровождающий его через все сервисы. Отдельные операции внутри запроса представляются спанами (spans), образующими древовидную структуру.


Неэффективное логирование в горячих путях

Горячий путь — участок кода, выполняемый при обработке каждого входящего запроса или критически важной операции.

Логирование в горячих путях создаёт двойственную ситуацию. С одной стороны, инженерам необходима видимость происходящего для отладки и анализа. С другой стороны, каждая операция записи лога потребляет процессорное время, дисковый ввод-вывод и сетевые ресурсы.


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

Операция записи лога включает несколько этапов:

  1. Формирование текстового представления сообщения.
  2. Сериализация контекстных данных.
  3. Захват блокировки на общем ресурсе логирования.
  4. Запись в буфер или непосредственно в файл.
  5. При сетевой отправке — сериализация и передача по сети.

Каждый этап занимает определённое время. При обработке тысяч запросов в секунду суммарные затраты на логирование становятся существенными.


Антипаттерны горячего логирования

Подробное логирование каждого запроса. Запись всех параметров входящего запроса и исходящего ответа генерирует огромный объём данных:

Код ITЗагрузка примера кода…

Проблемы данного подхода:

  • Чтение тела запроса (request.body()) буферизует всё содержимое в памяти.
  • Запись полного тела ответа требует аналогичной буферизации.
  • Сериализация заголовков выполняется для каждого запроса.
  • Объём генерируемых логов растёт линейно с размером полезной нагрузки.

Синхронная запись без буферизации. Каждый вызов логгера блокирует поток выполнения до завершения операции ввода-вывода:

Код ITЗагрузка примера кода…

Каждый вызов logger.debug выполняет:

  • Проверку уровня логирования.
  • Форматирование строки с подстановкой аргументов.
  • Сериализацию JSON-представления объектов.
  • Захват блокировки аппендера.
  • Синхронную запись в файл.

Стратегии эффективного логирования

Семплирование логов. Запись только определённой доли событий сохраняет статистическую репрезентативность при снижении объёма:

Код ITЗагрузка примера кода…

Условное логирование. Подробная информация записывается только при возникновении аномалий:

Код ITЗагрузка примера кода…

Структурированное логирование. Запись логов в машиночитаемом формате ускоряет последующий анализ:

Код ITЗагрузка примера кода…

Результирующая запись:

{
"event": "order_processed",
"order_id": "ORD-12345",
"customer_id": "CUST-67890",
"item_count": 3,
"total_amount": 1599.99,
"currency": "RUB",
"duration_ms": 245,
"payment_method": "card",
"warehouse": "MSK-01",
"level": "info",
"timestamp": "2026-05-22T14:30:45.123456Z"
}

Взрыв объёма логов

Взрыв объёма логов — неконтролируемый рост количества генерируемых лог-записей, приводящий к исчерпанию дискового пространства, перегрузке систем агрегации и увеличению финансовых затрат.

Современные системы генерируют терабайты логов ежедневно. Каждый лог требует хранения, индексации и обеспечения возможности поиска. Финансовые затраты на системы управления логами (ELK Stack, Splunk, Datadog, Loki) часто превышают затраты на вычислительные ресурсы.


Источники взрывного роста

Массовые автоматические операции. Периодические задачи, обрабатывающие тысячи записей, генерируют лог для каждой итерации:

Код ITЗагрузка примера кода…

При каталоге в 100 000 товаров такая функция генерирует:

  • 1 запись INFO в начале.
  • 100 000 записей DEBUG для каждой итерации.
  • 100 000 записей INFO для каждой операции.
  • N записей ERROR при сбоях.
  • 1 запись INFO в конце.

Итого более 200 000 записей за один запуск задачи.

Диагностическое логирование в продакшене. Отладочные логи, добавленные для расследования конкретного инцидента, остаются включёнными после его завершения:

Код ITЗагрузка примера кода…

Множественные уровни логирования. Запись одного события на нескольких уровнях разными компонентами:

[INFO ] api.gateway - Входящий запрос POST /api/orders
[DEBUG] api.gateway - Тело запроса: {"customer_id": 123, "items": [...]}
[INFO ] api.auth - Проверка токена для пользователя 456
[DEBUG] api.auth - Токен валиден, роль: customer
[INFO ] order.service - Создание заказа для клиента 123
[DEBUG] order.service - Валидация 5 позиций заказа
[INFO ] inventory.service - Проверка наличия SKU-001
[DEBUG] inventory.service - Доступно: 42, запрошено: 2
[INFO ] inventory.service - Проверка наличия SKU-002
[DEBUG] inventory.service - Доступно: 15, запрошено: 1
... (повторяется для каждой позиции)
[INFO ] pricing.service - Расчёт стоимости
[DEBUG] pricing.service - Базовая цена: 5000, скидка: 10%
[INFO ] order.repository - Сохранение заказа ORD-78901
[DEBUG] order.repository - SQL: INSERT INTO orders ...
[INFO ] payment.service - Обработка платежа
[DEBUG] payment.service - Отправка запроса в платёжный шлюз
[INFO ] api.gateway - Ответ: 201 Created, 245 мс

Один пользовательский запрос порождает десятки внутренних лог-записей.


Стратегии контроля объёма

Политики уровней логирования. Каждый компонент имеет собственный уровень детализации, управляемый централизованно:

Код ITЗагрузка примера кода…

Динамическое управление уровнями. Изменение уровня логирования без перезапуска приложения:

Код ITЗагрузка примера кода…

Агрегация событий. Группировка похожих событий в одну запись:

Код ITЗагрузка примера кода…

Ротация и компрессия. Автоматическое управление жизненным циклом лог-файлов:

# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 appuser appgroup
sharedscripts
size 100M
maxsize 500M

postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}

Пропущенные метрики и алерты

Пропущенная метрика — отсутствие измерения критически важного показателя работы системы, делающее невозможным обнаружение деградации через автоматизированные механизмы.

Пропущенный алерт — отсутствие правила оповещения о выходе показателя за допустимые границы, приводящее к обнаружению проблемы только через внешние проявления.

Системы мониторинга создают иллюзию полного контроля. Дашборды с зелёными индикаторами формируют ложное чувство безопасности, пока система накапливает скрытые проблемы в областях, оставшихся без наблюдения.


Типичные слепые зоны

Отсутствие бизнес-метрик. Инфраструктурные метрики показывают нормальную работу, при этом бизнес-процессы деградируют:

# Недостаточный набор метрик - только инфраструктура
metrics:
- cpu_usage_percent
- memory_usage_bytes
- disk_free_bytes
- network_in_bytes
- network_out_bytes
- http_requests_total
- http_request_duration_seconds

Все инфраструктурные метрики остаются в норме, при этом:

  • Конверсия из корзины в покупку упала с 15% до 2%.
  • Средний чек снизился на 40% из-за ошибки расчёта скидок.
  • Время доставки выросло втрое из-за сбоя интеграции с логистом.
  • Количество успешных оплат упало из-за истёкшего сертификата платёжного шлюза.

Отсутствие метрик зависимостей. Приложение работает, но его зависимости деградируют:

Код ITЗагрузка примера кода…

Пропущенные алерты на тренды. Алерты на абсолютные значения пропускают постепенную деградацию:

Код ITЗагрузка примера кода…


Система классификации метрик

RED-метрики для микросервисов:

  • Rate — количество запросов в секунду.
  • Errors — количество ошибочных ответов в секунду.
  • Duration — распределение времени обработки запросов.

USE-метрики для инфраструктуры:

  • Utilization — степень использования ресурса.
  • Saturation — степень перегрузки ресурса (очереди).
  • Errors — количество ошибок ресурса.

Four Golden Signals от Google SRE:

  • Latency — задержка обслуживания запросов.
  • Traffic — уровень нагрузки на систему.
  • Errors — частота ошибочных ответов.
  • Saturation — степень заполненности ресурсов.

Код ITЗагрузка примера кода…


Усталость от алертов

Усталость от алертов — состояние команды, при котором инженеры начинают игнорировать оповещения из-за их избыточного количества, высокой частоты ложных срабатываний и низкой информационной ценности.

Усталость от алертов представляет собой одну из наиболее опасных форм деградации наблюдаемости. Команда получает сотни оповещений ежедневно, подавляющее большинство которых требуют простого подтверждения или не требуют действий вовсе. На этом фоне реальные инциденты теряются в потоке уведомлений.


Признаки усталости от алертов

Высокий процент ложных срабатываний. Более 50% алертов разрешаются без каких-либо действий:

# Пример шумного алерта
- alert: HighCPUUsage
expr: node_cpu_usage_percent > 80
for: 1m
labels:
severity: warning
annotations:
summary: "Высокое использование CPU на {{ $labels.instance }}"

Проблемы данного алерта:

  • Кратковременные пики CPU нормальны для многих рабочих нагрузок.
  • Порог 80% слишком низкий для современных многоядерных систем.
  • Длительность for: 1m слишком мала для принятия решения.
  • Алерт срабатывает при каждом сборе мусора или JIT-компиляции.

Отсутствие приоритизации. Все алерты имеют одинаковый уровень значимости:

Код ITЗагрузка примера кода…

Дублирование оповещений. Одна проблема порождает множество алертов:

[CRITICAL] api-gateway-01: High error rate (15%)
[CRITICAL] api-gateway-01: Increased latency P99 (5.2s)
[CRITICAL] api-gateway-01: Circuit breaker OPEN for payment-service
[CRITICAL] payment-service-01: Health check failed
[CRITICAL] payment-service-01: Connection pool exhausted
[CRITICAL] payment-service-01: High error rate (100%)
[WARNING ] order-service-01: Increased latency P95 (3.1s)
[WARNING ] order-service-01: Retry rate increased (45%)
[WARNING ] notification-service: Queue depth growing (15000)

Все девять алертов описывают одну проблему: падение сервиса платежей.


Принципы эффективного алертинга

Алерты на симптомы, а не на причины. Оповещение должно сообщать о проблеме, заметной пользователю:

Код ITЗагрузка примера кода…

Многоуровневая эскалация. Разные уровни серьёзности вызывают разные реакции:

Код ITЗагрузка примера кода…

Ингибирование и группировка. Подавление производных алертов при срабатывании корневого:

Код ITЗагрузка примера кода…


Слепые зоны health checks

Слепая зона health check — ситуация, при которой проверка работоспособности возвращает успешный результат, несмотря на фактическую неспособность компонента обслуживать запросы.

Механизмы оркестрации (Kubernetes, ECS, Nomad) и балансировщики нагрузки (Nginx, HAProxy, AWS ALB) используют health checks для определения пригодности инстанса к приёму трафика. Поверхностные проверки создают опасную иллюзию работоспособности.


Классификация проверок

Liveness Probe определяет, жив ли процесс приложения. Провал проверки приводит к перезапуску контейнера:

# Kubernetes liveness probe
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3

Readiness Probe определяет, готов ли инстанс принимать трафик. Провал проверки исключает инстанс из балансировки:

# Kubernetes readiness probe
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3

Startup Probe защищает медленно стартующие приложения от преждевременных liveness-проверок:

# Kubernetes startup probe
startupProbe:
httpGet:
path: /health/startup
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 60 # До 5 минут на старт

Антипаттерны health checks

Статический ответ. Проверка всегда возвращает успех без реальной диагностики:

# Антипаттерн — статический health check
@app.get("/health/live")
async def liveness():
return {"status": "ok"}

@app.get("/health/ready")
async def readiness():
return {"status": "ok"}

Такие проверки подтверждают только факт работы HTTP-сервера. Приложение может иметь:

  • Исчерпанный пул соединений с базой данных.
  • Заблокированные потоки из-за взаимной блокировки.
  • Переполненную память, вызывающую непрерывную сборку мусора.
  • Зависшую интеграцию с внешним сервисом.

Кэширование результатов. Проверка возвращает кэшированный результат вместо актуального состояния:

# Антипаттерн — кэширование health check
from functools import lru_cache

import time

@app.get("/health/ready")
@lru_cache(maxsize=1)
def readiness_cached():
# Результат кэшируется навсегда
return check_all_dependencies()

Тяжёлые проверки. Health check выполняет ресурсоёмкие операции:

Код ITЗагрузка примера кода…

Каждая такая проверка создаёт значительную нагрузку. При 30 инстансах и интервале проверки 10 секунд система выполняет 180 тяжёлых проверок в минуту.


Эффективные health checks

Глубокая проверка с таймаутами. Проверка всех критических зависимостей с ограничением времени:

Код ITЗагрузка примера кода…


Дрейф конфигураций между окружениями

Дрейф конфигураций — накопление различий в настройках между средами разработки, тестирования и промышленной эксплуатации, приводящее к появлению уникальных ошибок production-среды.

Каждая среда имеет собственный набор параметров — строки подключения, лимиты производительности, флаги функциональности, ключи шифрования. Со временем конфигурации расходятся, и приложение начинает вести себя по-разному в разных средах.


Источники расхождений

Ручные изменения в production. Администраторы вносят правки непосредственно на серверах для оперативного решения проблем:

# Опасная практика — ручное изменение конфигов в production
ssh prod-server-01
sudo vim /etc/myapp/config.yaml
# Изменение max_connections с 100 на 500
sudo systemctl restart myapp

Изменение остаётся неизвестным системе контроля версий. При следующем развёртывании конфигурация перезаписывается, и проблема возвращается.

Устаревшие значения по умолчанию. Код содержит значения по умолчанию, актуальные для разработки:

# Опасный паттерн — жёстко зашитые значения по умолчанию
class AppConfig:
# Значения для локальной разработки
DATABASE_URL: str = "postgresql://localhost:5432/myapp_dev"
REDIS_URL: str = "redis://localhost:6379/0"
LOG_LEVEL: str = "DEBUG"
MAX_CONNECTIONS: int = 10
REQUEST_TIMEOUT: int = 300 # 5 минут для отладки
ENABLE_PROFILING: bool = True
MOCK_EXTERNAL_APIS: bool = True

При развёртывании без явного переопределения приложение использует значения для локальной разработки.

Разные версии конфигурационных схем. Структура файлов конфигурации меняется между версиями:

Код ITЗагрузка примера кода…

Старые конфигурационные файлы остаются совместимыми, но новые функции недоступны.


Управление конфигурациями как код

Централизованное хранилище. Все конфигурации хранятся в системе контроля версий:

Код ITЗагрузка примера кода…

Валидация при старте. Приложение проверяет корректность конфигурации перед началом работы:

Код ITЗагрузка примера кода…

Сравнение конфигураций. Автоматическая проверка расхождений между средами:

Код ITЗагрузка примера кода…


Дефекты распределённой трассировки

Дефект распределённой трассировки — нарушение в механизме сквозного отслеживания запросов через компоненты распределённой системы, приводящее к потере видимости причинно-следственных связей.

Распределённая трассировка обеспечивает видимость прохождения запроса через десятки микросервисов, очередей и баз данных. Дефекты трассировки делают невозможным определение источника задержек или ошибок в сложных сценариях.


Типичные проблемы трассировки

Потеря контекста при асинхронных операциях. Идентификатор трассировки теряется при передаче задачи в фоновую очередь:

Код ITЗагрузка примера кода…

Некорректное именование спанов. Спаны имеют неинформативные имена, затрудняющие анализ:

// Проблема: неинформативные имена спанов
@WithSpan
public OrderResult processOrder(Order order) {
// Спан получит имя метода "processOrder" - слишком общее

validateOrder(order);
// Спан "validateOrder" - непонятно, что именно валидируется

calculatePrice(order);
// Спан "calculatePrice" - неясно, какие компоненты задействованы

return saveOrder(order);
}

Отсутствие контекстных атрибутов. Спаны фиксируют время выполнения, но не содержат бизнес-контекста:

Код ITЗагрузка примера кода…


Полноценная трассировка

Передача контекста через асинхронные границы:

Код ITЗагрузка примера кода…

Богатые атрибуты спанов:

Код ITЗагрузка примера кода…


Отказ системы мониторинга

Отказ системы мониторинга — ситуация, при которой сама инфраструктура наблюдаемости перестаёт функционировать, оставляя команду без инструментов диагностики.

Парадокс наблюдаемости заключается в необходимости наблюдения за самими системами наблюдения. Отказ Prometheus, Grafana, ELK-кластера или агентов сбора метрик создаёт полную слепоту в отношении состояния production-системы.


Сценарии отказа мониторинга

Переполнение хранилища метрик. База данных временных рядов исчерпывает дисковое пространство:

# Проверка использования дискового пространства Prometheus
du -sh /var/lib/prometheus/data/
# Результат — 450G /var/lib/prometheus/data/

# Проверка количества временных рядов
curl -s http://localhost:9090/api/v1/status/tsdb | jq .
# Результат — 25000000 активных временных рядов

Причины переполнения:

  • Высокая кардинальность метрик (уникальные комбинации лейблов).
  • Слишком долгий период хранения данных.
  • Частый интервал сбора метрик.
  • Динамические лейблы (IP-адреса, идентификаторы пользователей).

Кардинальность метрик. Добавление динамических значений в качестве лейблов порождает взрывной рост временных рядов:

# Опасный паттерн — высокая кардинальность
request_counter = Counter(
"http_requests_total",
"HTTP requests",
["method", "path", "status", "user_id", "session_id", "request_id"]
)

# Каждый уникальный request_id создаёт новый временной ряд
# 1000 запросов/сек * 86400 секунд = 86 400 000 рядов в сутки

Падение агентов сбора. Агенты (node_exporter, Prometheus agent, Datadog agent) прекращают отправку метрик:

# Алерт на отсутствие метрик от агента
- alert: MetricsAgentDown
expr: up{job="node-exporter"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Агент сбора метрик не отвечает на {{ $labels.instance }}"

Проблема: если сам Prometheus недоступен, этот алерт никогда не сработает.


Устойчивая архитектура мониторинга

Мета-мониторинг. Отдельная система наблюдает за основной:

Код ITЗагрузка примера кода…

Контроль кардинальности. Ограничение количества уникальных временных рядов:

Код ITЗагрузка примера кода…


Диагностика дефектов наблюдаемости

Выявление проблем в системах наблюдаемости требует систематического подхода и специализированных инструментов.


Аудит покрытия метриками

Инвентаризация всех компонентов и проверка наличия соответствующих метрик:

Код ITЗагрузка примера кода…


Проверка качества логов

Автоматическая валидация структурированности и информативности логов:

Код ITЗагрузка примера кода…


Сквозное тестирование наблюдаемости

Проверка работоспособности всей цепочки наблюдаемости:

Код ITЗагрузка примера кода…


Таблица дефектов и защитных механизмов

Дефект наблюдаемостиПризнакЗащитный механизм
Неэффективное логирование в горячих путяхРост P99-латентности при увеличении детализации логовСемплирование, условное логирование, асинхронная запись
Взрыв объёма логовИсчерпание дискового пространства, рост затрат на ELKРотация, агрегация, политики уровней
Пропущенные метрикиОбнаружение проблем через жалобы пользователейРеестр метрик, RED/USE, бизнес-метрики
Усталость от алертовИгнорирование оповещений инженерамиГруппировка, ингибирование, многоуровневая эскалация
Слепые зоны health checksТрафик на деградировавшие инстансыГлубокие проверки с таймаутами
Дрейф конфигурацийОшибки только в productionIaC, валидация при старте, сравнение сред
Дефекты трассировкиНевозможность найти источник задержкиПередача контекста через границы, богатые атрибуты
Отказ мониторингаПолная слепота при инцидентеМета-мониторинг, контроль кардинальности

Принципы устойчивой наблюдаемости

Эффективная наблюдаемость опирается на набор фундаментальных принципов, применяемых на этапе проектирования системы.


Принцип полноты

Каждый компонент системы имеет соответствующий набор метрик, логов и трассировок. Новые компоненты получают наблюдаемость одновременно с вводом в эксплуатацию.


Принцип структурированности

Логи и метрики следуют единым стандартам именования, формата и контекста. Сквозные идентификаторы (trace_id, request_id) проходят через все компоненты.


Принцип экономности

Объём генерируемых данных соответствует их ценности. Горячие пути используют семплирование и агрегацию. Подробная информация сохраняется при аномалиях.


Принцип действия

Каждый алерт имеет понятную инструкцию по реагированию, определённый уровень эскалации и ответственную команду. Алерты без действия устраняются.


Принцип мета-наблюдаемости

Системы наблюдения находятся под собственным наблюдением — отдельный Prometheus, synthetic check или meta-cluster следит за тем, что основной Prometheus, Loki и агенты на нодах живы. Отказ мониторинга обнаруживается независимой системой — иначе при падении ELK команда узнает о прод-инциденте только от пользователей.


Принцип проверяемости

Работоспособность всей цепочки наблюдаемости регулярно проверяется синтетическими тестами. Слепые зоны обнаруживаются до возникновения реальных инцидентов.


Практический плейбук по метрикам, Prometheus и Grafana

Ниже собран практический шаблон, который помогает выстроить мониторинг как рабочий процесс для команды. Термины раскрыты по месту, чтобы с материалом можно было работать с нуля.


1) Как именно собирать метрики

Базовая схема сбора в экосистеме Prometheus:

  1. Приложение публикует метрики на /metrics (или через Pushgateway для короткоживущих batch-задач).
  2. Exporter публикует метрики внешней системы (ОС, БД, брокер, балансировщик) в формате Prometheus exposition.
  3. Prometheus по расписанию (scrape_interval) опрашивает targets.
  4. Для масштабирования и долгого хранения используются federation, remote_write (VictoriaMetrics, Mimir, Thanos, Cortex и т.п.).

Коротко о терминах:

  • scrape — опрос endpoint метрик со стороны Prometheus.
  • target — любой источник метрик, который Prometheus опрашивает.
  • label — дополнительный признак метрики, например service="billing".
  • кардинальность — количество уникальных комбинаций labels.
  • remote_write — отправка метрик в внешнее долговременное хранилище.
  • federation — когда один Prometheus агрегирует данные из другого.

Ключевые практики:

  • Использовать стабильные имена метрик по шаблону domain_subsystem_metric_unit, например http_request_duration_seconds.
  • Использовать labels с низкой кардинальностью, например service, env, instance, region.
  • Фиксировать SLA телеметрии.
  • В SLA включать долю успешных scrape.
  • В SLA включать задержку доставки метрик.
  • В SLA включать задержку доставки алертов.
  • Разделять scrape-профили.
  • Для критичных сервисов применять короткий интервал, например 15 секунд.
  • Для менее критичных сервисов применять более длинный интервал, например 60 секунд.

2) Какие шаблоны метрик использовать

Рабочий минимум:

  • RED для API и микросервисов.
  • В RED входят запросы в единицу времени.
  • В RED входят ошибки в единицу времени.
  • В RED входят задержки ответа.
  • Для RED обычно используют *_requests_total, *_errors_total, *_duration_seconds_bucket.
  • USE для серверов и инфраструктуры.
  • В USE входят загруженность ресурса.
  • В USE входят признаки перегрузки.
  • В USE входят ошибки ресурса.
  • Four Golden Signals для общей картины сервиса.
  • Включают задержку, трафик, ошибки и насыщение ресурсов.

Типы метрик:

  • Counter — только растёт (запросы, ошибки).
  • Gauge — текущее значение (длина очереди, активные соединения).
  • Histogram — распределение (latency, payload size).
  • Summary — локальные квантили внутри конкретного инстанса.

Почему в распределённых системах чаще выбирают Histogram:

  • квантили можно считать по всем инстансам вместе через PromQL;
  • проще согласовать единый SLO между несколькими подами и регионами.

Правило выбора:

  • Нужно считать процент/скорость → Counter.
  • Нужно текущее состояние → Gauge.
  • Нужны p95/p99 и SLO по задержке → Histogram.

См. также:


3) Что и когда собирать с серверов

Серверный минимум через node_exporter или аналог:

  • CPU.
  • Загрузка по режимам.
  • Время ожидания ввода-вывода.
  • Показатель steal time для виртуализации.
  • RAM.
  • Доступная память.
  • Swap.
  • Крупные page faults.
  • Disk.
  • Свободное место и inode.
  • Задержка чтения и записи.
  • Глубина очереди диска.
  • Ошибки файловой системы.
  • Network.
  • Пропускная способность.
  • Потери пакетов.
  • Повторные TCP-передачи.
  • Количество dropped packets.
  • Process и runtime.
  • Рестарты.
  • Открытые файловые дескрипторы.
  • Потоки или goroutine.
  • Паузы GC.

Рекомендованная частота:

  • 15s.
  • Операционные сигналы, которые нужны для быстрой реакции.
  • Сюда обычно входят CPU, RAM, latency, error-rate, saturation.
  • 30s.
  • Сетевые метрики.
  • Дисковые метрики.
  • Пулы соединений.
  • 60s.
  • Метрики ёмкости.
  • Инвентарные показатели.
  • Медленные агрегаты.
  • 5m и больше.
  • Агрегированные бизнес-метрики через recording rules.
  • Данные для SLA-отчётов и долгих графиков.

Отдельно собирать метрики по событию для batch и pipeline:

  • старт/финиш джобы;
  • длительность этапов;
  • количество успешных/ошибочных элементов;
  • причина падения последнего запуска.

4) Как анализировать собранные метрики

Практический цикл анализа:

  1. Проверить симптом: рост 5xx, latency p95/p99, падение throughput.
  2. Проверить корреляцию по времени: сервис, БД, сеть, очереди.
  3. Отделить первичную причину от последствий.
  4. Подтвердить гипотезу логами/трейсами.
  5. Зафиксировать в postmortem: какой сигнал сработал/не сработал.

Техники анализа:

  • rate()/irate() для скоростей счётчиков.
  • histogram_quantile() для перцентилей latency.
  • Burn-rate алерты относительно SLO.
  • Recording rules для тяжёлых и часто используемых выражений.
  • Сравнение с baseline.
  • Сравнение текущего окна с аналогичным окном прошлого дня.
  • Сравнение текущего окна с аналогичным окном прошлой недели.

Коротко о терминах:

  • baseline — нормальный уровень системы в обычные дни.
  • burn-rate — скорость, с которой расходуется бюджет ошибок SLO.
  • postmortem — разбор инцидента после восстановления сервиса.

Признаки плохого анализа:

  • смотрят только среднее (avg) вместо хвостов p95/p99;
  • не учитывают деплой/релиз как фактор;
  • строят вывод по одной панели без cross-check по смежным слоям.

5) Что такое экспортеры и как их писать

Exporter — процесс-адаптер, который получает данные из внешнего источника и отдаёт их в формате Prometheus.

Типовые экспортеры:

  • инфраструктурные (node_exporter, blackbox_exporter);
  • data-layer (postgres_exporter, redis_exporter, kafka_exporter);
  • кастомные (внутренние API, лицензии, очередь в проприетарной системе).

Минимальные требования к своему exporter:

  • endpoint /metrics без авторизации внутри доверенной сети;
  • метрики с корректными типами и help-описанием;
  • таймауты и graceful degradation (ошибка источника не должна вешать exporter);
  • контроль кардинальности labels;
  • собственные self-metrics (scrape_duration_seconds, scrape_errors_total).

Что значит graceful degradation в этом контексте:

  • при недоступной БД exporter возвращает частичный результат и метрику ошибки;
  • endpoint /metrics остаётся доступным;
  • Prometheus продолжает получать сигнал о проблеме.

Антипаттерны exporter-ов:

  • label на user_id, request_id, email;
  • тяжёлые SQL на каждый scrape без кеша;
  • логика "бизнес-вычислений" внутри exporter вместо приложения/ETL.

6) Как подключать приложения к Prometheus + Grafana

Базовый путь подключения:

  1. Инструментировать приложение клиентской библиотекой (prom-client, prometheus-client, micrometer, promhttp).
  2. Открыть endpoint метрик (/metrics) и проверить вручную.
  3. Добавить target в prometheus.yml (static_configs или service discovery).
  4. Проверить статус scrape в Targets.
  5. Добавить Prometheus как datasource в Grafana.
  6. Создать дашборд + алерты, привязанные к SLI/SLO сервиса.

Для Kubernetes:

  • использовать ServiceMonitor/PodMonitor (Prometheus Operator);
  • стандартизировать labels и naming namespace/job;
  • задавать relabel_configs, чтобы не тащить "мусорные" series.

Коротко о терминах Kubernetes:

  • ServiceMonitor — объект, который описывает, какие сервисы и как опрашивать.
  • PodMonitor — объект, который настраивает опрос отдельных pod.
  • relabel_configs — правила преобразования labels до записи метрики в TSDB.

Для внешних/legacy систем:

  • использовать готовый exporter;
  • если протокол нестандартный — писать adapter-exporter;
  • для краткоживущих процессов — Pushgateway (осторожно, без превращения в "вечное хранилище").

7) Как строятся дашборды в Grafana

Рабочая структура дашборда (сверху вниз):

  1. Service health: uptime, request rate, error rate, latency p95/p99.
  2. Dependencies: БД, кеш, брокер, внешние API.
  3. Resources: CPU, RAM, disk, network.
  4. Business KPIs: успешные операции, конверсия, финансовые метрики.
  5. Operational context: версия релиза, деплой, feature flags.

Практики хорошего дашборда:

  • один дашборд = одна зона ответственности;
  • единые переменные (env, service, instance, region);
  • panel descriptions с расшифровкой "что считать нормой";
  • аннотации деплоев и инцидентов на графиках;
  • не перегружать: лучше 8-12 рабочих панелей, чем 40 декоративных.

Как новичку проверить качество дашборда:

  • открыть дашборд и ответить, видно ли состояние сервиса за 30 секунд;
  • проверить, что на каждой панели понятны единицы измерения;
  • проверить, что по каждой критичной панели есть ссылка на runbook;
  • проверить, что есть фильтры по env и service;
  • проверить, что время обновления и период графиков подходят для дежурства.

Удобно разделять:

  • обзорные dashboard-ы для on-call;
  • глубокие debug-dashboard-ы для конкретного сервиса;
  • executive/dashboard для SLA и бизнес-рисков.

8) Как настраиваются алерты

Устойчивый алертинг строится на симптомах и SLO:

  • Page (critical): влияет на пользователя здесь и сейчас;
  • Ticket (warning): требует плановой реакции;
  • Info: диагностический сигнал без эскалации.

Что обязательно для каждого алерта:

  • понятный summary и description с impact;
  • runbook-ссылка;
  • owner/team;
  • for-интервал против флаппинга;
  • порог, обоснованный baseline/SLO, а не "с потолка".

Коротко о терминах:

  • flapping — состояние, когда алерт часто переключается между firing и resolved.
  • runbook — инструкция с шагами диагностики и восстановления.
  • Alertmanager — компонент маршрутизации, группировки и отправки алертов.

Рекомендации по правилам:

  • алерты на burn-rate error budget (короткое + длинное окно);
  • группировка и ингибирование в Alertmanager;
  • дедупликация по ключевым labels;
  • маршрутизация по severity/командам/времени дежурства.

Минимальный стартовый набор алертов для сервиса:

  • высокий 5xx/error-rate;
  • деградация latency (p95/p99);
  • недоступность инстансов (up == 0);
  • saturation (очередь/пул/диск);
  • отсутствие метрик от сервиса (телеметрическая "тишина").

См. также:


См. также


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.

Содержание