Наблюдаемость и надежность: мониторинг, логи, алерты и SRE
Наблюдаемость (observability) и надежность (reliability) — это практики, которые позволяют понимать, что происходит в системе прямо сейчас, почему это происходит и как быстро вернуть сервис в норму.
Связь с предыдущими темами курса:
После Git и CI/CD мы научились управлять изменениями и доставлять их предсказуемо.
После Docker/Kubernetes мы получили стандартизированный рантайм и механизм выката.
После IaC (Terraform/Ansible) мы научились воспроизводимо создавать и настраивать окружения.Теперь добавляем обязательный слой для продакшена: как измерять качество работы, как замечать деградации, как реагировать на инциденты и как улучшать систему на основе данных.
!Как телеметрия связывает путь запроса с мониторингом и реакцией
Что такое наблюдаемость
Наблюдаемость — это способность по внешним сигналам понять внутреннее состояние системы.
Практически это означает:
вы можете ответить, что сломалось (симптомы)
вы можете ответить, почему сломалось (причины)
вы можете сделать это быстро и воспроизводимо (процессы и инструменты)Часто наблюдаемость описывают через три основных типа телеметрии:
Метрики: числовые ряды во времени (например, RPS, ошибки, задержки).
Логи: события (например, ошибка подключения к БД с контекстом).
Трассировка: путь конкретного запроса через компоненты системы.Терминология и современные стандарты часто обсуждаются в экосистеме OpenTelemetry:
OpenTelemetryМониторинг и наблюдаемость: в чем разница
Мониторинг обычно отвечает на вопрос: система работает в пределах нормы или нет?
Наблюдаемость отвечает на вопрос: почему она вышла из нормы, и где искать причину?
На практике это выглядит так:
мониторинг дает графики и алерты по заранее известным проблемам
наблюдаемость помогает разбирать новые и сложные ситуации, когда заранее не было готового алертаВажно: мониторинг почти всегда строится на метриках, а наблюдаемость почти всегда требует связки метрик, логов и трассировки.
Что такое надежность и как ее измеряют
Надежность — это способность сервиса стабильно выполнять обещанную функцию: быть доступным, отвечать достаточно быстро, не ошибаться выше допустимого уровня.
В инженерных командах надежность часто формализуют через SLI, SLO и SLA.
SLI (Service Level Indicator): измеряемый показатель качества (например, доля успешных запросов).
SLO (Service Level Objective): цель по SLI (например, 99.9% успешных запросов за 30 дней).
SLA (Service Level Agreement): внешнее обязательство перед клиентом (часто с компенсациями).Классический источник по подходу SRE:
Site Reliability Engineering (книга Google)Error budget: почему он нужен
Если у вас есть SLO, то появляется бюджет ошибок (error budget): сколько деградаций качества вы можете позволить в выбранный период.
Частая простая модель для доступности:
Разбор обозначений:
— целевой уровень, например 0.999 (это 99.9%).
— окно измерения, например 30 дней.
— сколько времени в этом периоде сервис может быть недоступен и все еще укладываться в SLO.Зачем это в DevOps:
если бюджет ошибок почти исчерпан, команда временно снижает темп рискованных изменений и инвестирует в надежность
если бюджет ошибок расходуется мало, можно смелее выпускать измененияЭто связывает надежность с CI/CD: релизы перестают быть спором мнений и становятся управлением риском на основе измерений.
Метрики: что измерять и как не сломать мониторинг
Типы метрик, которые чаще всего встречаются
Counter: только растет (например, число запросов, число ошибок).
Gauge: может расти и падать (например, использование памяти).
Histogram/Summary: распределение значений (например, задержки по квантилям и бакетам).Эти типы особенно важны, если вы работаете с Prometheus-экосистемой:
PrometheusЗолотые сигналы и быстрые модели для сервисов
Чтобы не тонуть в сотнях графиков, используют компактные наборы сигналов.
Four Golden Signals (часто применяются для HTTP/API сервисов):
Latency: задержка ответа.
Traffic: нагрузка (например, запросы в секунду).
Errors: ошибки (например, 5xx).
Saturation: насыщение ресурсов (CPU, память, пул соединений).Также распространены практические схемы:
RED для сервисов: Rate, Errors, Duration.
USE для ресурсов: Utilization, Saturation, Errors.Лейблы и кардинальность: типичная ловушка
Метрики часто имеют лейблы (например, method=GET, status=200).
Ошибка новичков: добавлять лейблы с большим числом уникальных значений (например, user_id, request_id). Это называется высокой кардинальностью и может:
резко увеличить объем хранения
замедлить запросы к метрикам
сделать мониторинг дорогим и нестабильнымПравило по умолчанию:
в метриках оставляйте лейблы с ограниченным набором значений
детализацию до конкретных запросов выносите в логи и трассировкуДашборды: зачем они нужны, но почему они не спасают
Дашборды полезны, когда:
у команды есть единый способ быстро понять состояние сервиса
есть несколько стандартных панелей для инцидентов и релизовНо дашборд не заменяет:
корректные SLI/SLO
качественные алерты
runbook с действиямиПопулярный инструмент для визуализации:
GrafanaЛоги: как сделать их полезными в продакшене
Логи — это события с контекстом. Главная ценность логов в том, что они помогают объяснить, почему произошла ошибка и в каких условиях.
Структурированные логи
Практически полезный стандарт: писать логи в структурированном виде (часто JSON), чтобы потом фильтровать по полям.
Что обычно кладут в поля логов:
уровень (info, warn, error)
имя сервиса и окружение (service, env)
сообщение
контекст запроса (например, trace_id)
код ошибки и тип исключенияУровни логов и шум
Типовые уровни:
debug: только для диагностики, часто выключают в prod
info: важные события потока
warn: подозрительные ситуации, но сервис продолжает работать
error: ошибка выполнения запроса или операцииЧастая проблема: слишком много info и warn, из-за чего реальные ошибки теряются.
Централизация логов
Если логи лежат на отдельных VM или нодах Kubernetes, искать инцидент сложно. Поэтому логи обычно собирают в централизованную систему.
Распространенные варианты:
стек Elastic (Elasticsearch и Kibana): Elastic Stack
Grafana Loki: Grafana LokiТрассировка: как найти узкое место в распределенной системе
Распределенная трассировка показывает путь запроса через несколько сервисов.
Базовые термины:
Trace: цепочка обработки одного запроса.
Span: один шаг в trace (например, запрос к БД или внешний HTTP вызов).
Context propagation: передача идентификаторов между сервисами, чтобы связать trace.Зачем это нужно:
понять, где именно теряется время (API, БД, очередь, внешний сервис)
увидеть, какие зависимости реально участвуют
связать конкретный медленный запрос с логами и ошибкамиСтандарт де-факто для инструментирования:
OpenTelemetryКорреляция: как связать метрики, логи и трассировку
Когда начинается инцидент, полезный рабочий путь выглядит так:
Алерт или жалобы пользователя показывают симптом, часто через метрики (рост 5xx, рост задержки).
Дашборд подтверждает масштаб и время начала.
Логи дают сообщения об ошибках и контекст.
Трассировка показывает конкретное место деградации.Чтобы это работало, нужен общий ключ корреляции, чаще всего:
trace_id в логах
trace_id в заголовках запросов между сервисамиАлертинг: как сделать так, чтобы алерты помогали
Алерт должен требовать действия
Хороший алерт:
означает проблему, важную для пользователя или бизнеса
имеет понятную срочность
подразумевает конкретные действияПлохой алерт:
часто срабатывает ложноположительно
не объясняет, что делать
срабатывает на причину без понимания влияния (например, краткий всплеск CPU без влияния на задержку)Это приводит к alert fatigue: команда начинает игнорировать сигналы.
Symptom-based alerting
Сильная практика: алертить на симптомы, а не на каждую возможную причину.
Примеры алертов по симптомам:
доля 5xx выше порога
задержка на 95 перцентиле выше порога
доля успешных запросов (SLI) падает ниже SLO-траекторииАлерты по причинам полезны как дополнительные сигналы, но обычно не как единственная линия защиты.
Paging и ticket: разные уровни реакции
Чтобы не будить людей без необходимости, разделяют:
paging: срочно, требует реакции сейчас (обычно on-call)
ticket: несрочно, задача в бэклог (например, рост логов или постепенная деградация)Runbook: что должно быть у каждого алерта
Runbook — короткая инструкция, что делать при срабатывании алерта.
Минимально полезный runbook содержит:
что означает алерт
где посмотреть метрики и логи
быстрые проверки (команды, ссылки на дашборды)
варианты mitigation (например, откат релиза, выключение фичи)
критерий завершения инцидентаRunbook связывается с темами Linux и сети: часто первые действия включают curl, ss, проверку логов и DNS.
SRE как инженерный подход к надежности
SRE (Site Reliability Engineering) — это практика, которая применяет инженерные методы к надежности.
Ключевые идеи SRE, которые полезны в DevOps с самого начала:
надежность измеряется через SLI/SLO, а не через субъективное чувство
error budget помогает балансировать скорость изменений и стабильность
автоматизация важнее ручных героических действий
постмортемы делаются без поиска виноватых, чтобы улучшать системуОфициальный материал:
Site Reliability Engineering (книга Google)Toil: что автоматизировать в первую очередь
В SRE важен термин toil: повторяющаяся, ручная, не приносящая долгосрочной ценности операционная работа.
Примеры toil:
ручные рестарты сервисов
ручная чистка дисков
однотипная диагностика без автоматизированных проверокСвязь с DevOps культурой:
автоматизация снижает человеческий фактор
улучшения делаются системно, а не только во время пожараИнциденты: базовый жизненный цикл
Инцидент — это нарушение SLO или реальное ухудшение пользовательского опыта.
Практический жизненный цикл:
Детекция: алерт, мониторинг, обращение пользователя.
Триаж: быстро понять масштаб, затронутые компоненты, приоритет.
Митигирование: остановить ухудшение (откат, отключение фичи, масштабирование).
Восстановление: вернуть сервис к нормальным SLI.
Постмортем: разобрать причины и добавить улучшения (тесты, алерты, лимиты, guardrails в CI/CD).Постмортем в DevOps делается в логике обучения на ошибках без поиска виноватых.
Как встроить наблюдаемость в ваш DevOps-процесс
Практический минимум, который стоит внедрять рано:
в каждый сервис добавить health endpoint (например, /health) и базовые метрики
в CI/CD после деплоя запускать smoke-check через curl
в Kubernetes настроить readiness и liveness probes
стандартизировать формат логов и добавить trace_id
описывать алерты и дашборды как код, хранить в Git и ревьюить через PRТак наблюдаемость становится частью системы поставки, а не ручной активностью после проблем.
Мини-чеклист: что должно быть у продакшен-сервиса
| Область | Минимум | Почему важно |
|---|---|---|
| Метрики | трафик, ошибки, задержки, насыщение | быстро понять состояние и масштаб |
| Логи | структурированные, уровни, контекст | быстро найти причину |
| Трассировка | trace/span, распространение контекста | находить узкие места и зависимости |
| Алерты | симптомные, с runbook | реакция без хаоса |
| SLO | измеримые цели | управлять надежностью и риском |
| Постмортемы | действия по улучшению | уменьшать повторение инцидентов |
!Три опоры наблюдаемости и как они используются при инциденте
Что дальше по курсу
После наблюдаемости логично углубляться в практики, которые делают систему еще более управляемой:
безопасные стратегии релизов и откатов (blue/green, canary)
управление зависимостями и таймаутами, лимитами, ретраями
GitOps для инфраструктуры и Kubernetes
безопасность в эксплуатации (аудит, управление секретами, политики доступа)Наблюдаемость дает данные, SRE дает рамку надежности, а DevOps-практики доставки превращают улучшения в регулярный процесс.