Трассировки и мониторинг. Траблшутинг
В production-системах неизбежно возникают инциденты: ошибки, деградация производительности, нестабильность сетей и внешних зависимостей. Чтобы быстро находить первопричину и подтверждать гипотезы данными, применяют стек наблюдаемости: трассировки, метрики, логи (часто дополняют профилированием). В этом топике мы последовательно разберём архитектуру наблюдаемости и роль OpenTelemetry, Jaeger, Prometheus и Grafana в траблшутинге.
Картина в целом: три столпа наблюдаемости и как их связать
Наблюдаемость состоит из трёх основных потоков данных: трассировки (кто, когда и что вызвал), метрики (числа и временные ряды для трендов и порогов), логи (подробные события и текст для контекста). Эффективный траблшутинг требует корреляции: из алерта по метрике перейти к связанным трейсам и логам той же операции с тем же trace_id
.
SLO/SLI/SLA: определите целевые уровни качества (например, P95 latency ≤ 300 мс, ошибки ≤ 1%).
Golden signals: latency, traffic, errors, saturation (перегрузка).
Инструментирование: добавьте SDK/агенты, чтобы сервисы отдавали трейсинг и метрики.
Хранилища: временные ряды (Prometheus), распределённые трейс-хранилища (Jaeger/Tempo и др.), системы логов.
Дашборды и алерты: визуализация (Grafana), правила алертинга (Prometheus Alertmanager или Grafana Alerting).
OpenTelemetry: единый язык данных наблюдаемости
OpenTelemetry (OTel) — открытый стандарт и набор SDK/агентов для сбора трейсов, метрик и логов с едиными семантическими соглашениями. OTel отделяет сбор (SDK, автоподключаемые инструменты, Collector) от доставки (экспортеры) и хранилищ (Jaeger/Tempo, Prometheus/OTLP-метрики, лог-системы).
Ключевые понятия OTel
Span: атомарная операция (RPC, запрос к БД, вызов очереди) со временем начала/окончания, атрибутами, статусом.
Trace: дерево/граф
span
-ов, отражающее путь запроса через сервисы.Context propagation: перенос
trace_id/span_id
через заголовки (W3Ctraceparent
,baggage
).Sampler: политика отбора (always_on/off, parentbased, вероятностная, tail-based через Collector).
OTLP: бинарный протокол/формат доставки (gRPC/HTTP) для трёх типов сигналов (traces/metrics/logs).
OpenTelemetry Collector: централизованный приём, обработка, экспорт
Collector — отдельный сервис, принимающий данные по OTLP, делающий парсинг/фильтрацию/семплинг и отправку в хранилища. Его удобно деплоить как sidecar/agent на узел или как централизованный gateway.
Jaeger: просмотр и анализ распределённых трасс
Jaeger — система хранения и визуализации трейсингов. Позволяет видеть путь запроса через микросервисы, длительность каждого этапа, ошибки и узкие места. Компоненты: agent
(приём), collector
(агрегация), query
и UI
. Хранение: Elasticsearch, Cassandra или встроенные варианты для dev.
Поиск по сервису, операции, тегам (атрибутам), временному окну.
Service map и сравнение трейсов (baseline vs regression).
Root cause: быстро выявляйте самый долгий/ошибочный span.
Prometheus: метрики и алертинг
Prometheus — TSDB и движок запросов PromQL c pull-моделью (он опрашивает /metrics у таргетов). Поддерживает Counter, Gauge, Histogram, Summary. Для кастомных сервисов используйте клиентские библиотеки; для системных метрик — экспортеры (например, node_exporter
).
Мини-конфиг Prometheus (scrape targets)
Примеры PromQL для траблшутинга
Ошибки RPS по статусам
P95 латентность (Histogram)
Доля ошибок 5xx
Насыщение CPU
Alerting (Alertmanager) — пример
Grafana: дашборды, корреляция и алерты
Grafana — платформа визуализации и оповещений. Поддерживает источники данных Prometheus, Loki (логи), Tempo/Jaeger (трейсы) и др. Хорошая практика — строить "runbook-дашборды": от верхнего уровня SLI к деталям (узкие места CPU/IO, внешние API, БД).
Вариабельность: переменные (service, instance, namespace) для быстрой фильтрации.
Аннотации: помечайте релизы и инциденты — коррелируйте скачки метрик с событиями.
Exemplars: показывайте ссылки на конкретные трейсы в точках графика гистограммы.
Unified Alerting: централизуйте правила и маршрутизацию уведомлений.
Корреляция логов, метрик и трейсов на практике
Логи выводите в структурированном виде (JSON) и добавляйте поля
trace_id
иspan_id
.Передавайте заголовки
traceparent
во все исходящие HTTP/RPC вызовы и в ответы клиентам.Используйте exemplar-ы в гистограммах, чтобы из точки латентности перейти к трейсу.
Методики траблшутинга: RED, USE, чек-листы
RED (Rate, Errors, Duration) — для пользовательских сервисов: следите за RPS, ошибками и длительностью.
USE (Utilization, Saturation, Errors) — для ресурсов: CPU, память, диск, сеть.
Чек-лист инцидента: верифицируйте алерт, оцените blast radius, зафиксируйте таймлайн, включите фича-флаги/откаты, соберите трейсы/метрики/логи, оформите postmortem с действиями.
Производительность и стоимость: семплинг, бакеты, ретеншн
Семплинг трейсов: снижает объём, оставляет репрезентативную картину. Tail-based в Collector выбирает интересные трейсы (ошибки, высокую латентность).
Гистограммы: заранее продумайте бакеты (например, 10, 25, 50, 100, 250, 500, 1000 мс). Слишком мелкие бакеты => рост кардинальности.
Ретеншн: разные сроки хранения для "сырых" и агрегированных данных. Используйте recording rules.
Безопасность и соответствие требованиям
Санитизируйте атрибуты спанов и поля логов (удаляйте токены, номера карт, персональные данные).
Ограничьте доступ к UI и API наблюдаемости (SSO, RBAC, сетевые политики).
Шифруйте трафик OTLP и хранение, если требуется по политике.
Типовые ошибки и их исправление
Трейсы рвутся: не передаётся
traceparent
. Проверьте прокси/балансировщики, включите автоинструментирование HTTP-клиентов/серверов.Пустые дашборды: Prometheus не видит таргеты. Проверьте
scrape_configs
, сетевые политики, TLS.Большие счета за хранение: высокая кардинальность метрик/атрибутов. Пересмотрите лейблы, бакеты, ретеншн и семплинг.
Шумные алерты: нет гистерезиса/задержки
for:
, пороги не привязаны к SLO. Настройте дедупликацию и маршрутизацию алертов.
FAQ и лучшие практики
С чего начать? — Инструментируйте один критичный путь (например, "создание заказа"), подключите OTel и Jaeger, затем добавляйте метрики и алерты.
Как измерять пользовательские SLI? — Введите явные бизнес-метрики (время ответа ключевых операций, доля успешных платежей).
Как связать логи и трейсы? — Добавляйте
trace_id
в контекст логгера; используйте middleware для авто-обогащения.