DevOps
Distributed Tracing
Uber запрос от пользователя проходит через 20+ микросервисов за 500ms. Когда запрос занимает 3 секунды, как найти где потеряно 2.5 секунды? До Jaeger - часы сравнения логов из разных сервисов. После - 10 секунд в UI: открыть медленный трейс, найти самый длинный span, открыть тикет в команду этого сервиса.
- **Shopify** использует OpenTelemetry для трейсинга платёжных транзакций через 30+ микросервисов - tail-based sampling гарантирует 100% сохранение каждого failed payment независимо от общего sampling rate
- **Twitter/X** интегрировал distributed tracing в свой ad serving pipeline - удалось обнаружить что 15% задержки было в одном legacy сервисе, который никто не подозревал, просто наблюдая aggregate метрики
- **Datadog APM** использует OTel SDK как основу своей инструментации - пользователи могут перейти с Datadog на другой backend без изменения кода приложения
Jaeger
Jaeger - open-source система distributed tracing, разработанная Uber. Собирает трейсы (записи о прохождении запроса через сервисы), хранит их (Elasticsearch, Cassandra или BadgerDB) и визуализирует в UI. Позволяет видеть полный путь запроса: frontend → API Gateway → Order Service → Payment Service → Database, с точными временными метками каждого шага.
Jaeger UI показывает waterfall-диаграмму вызовов: сразу видно где задержка - в сети, в БД или в бизнес-логике. Ключевые метрики: total duration, longest span, spans count. Поиск трейсов по service, operation, tag (`http.status_code=500`), duration (>1s). В production рекомендуют sampling 1-10% для баланса между покрытием и нагрузкой.
Что такое трейс в distributed tracing?
OpenTelemetry
OpenTelemetry (OTel) - CNCF-стандарт для сбора traces, metrics и logs из приложений. Единый SDK, который работает с любым backend: Jaeger, Zipkin, Datadog, Honeycomb, AWS X-Ray. Раньше переход с Jaeger на Datadog требовал переписать инструментацию; с OTel - меняется только экспортёр.
OTel Collector - агент/gateway, который принимает телеметрию (OTLP протокол), трансформирует и отправляет в несколько backend одновременно. Типичная схема: сервисы → OTel Collector (DaemonSet) → Jaeger (traces) + Prometheus (metrics) + Elasticsearch (logs). Collector также делает sampling, фильтрацию и обогащение данных.
Главное преимущество OpenTelemetry перед vendor-specific SDK (Datadog, Jaeger)?
Trace Context Propagation
Trace context propagation - механизм передачи trace_id и span_id между сервисами через HTTP заголовки. W3C Trace Context (`traceparent`, `tracestate`) - стандартный формат. Без propagation каждый сервис создаёт отдельный несвязанный трейс - нет возможности увидеть полный путь запроса.
Заголовок traceparent: `00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01`. Части: version (00) - trace-id (128 бит) - parent-span-id (64 бит) - flags (01 = sampled). OTel SDK автоматически читает и пишет эти заголовки при HTTP вызовах через авто-инструментацию.
Что произойдёт если один сервис в цепочке не поддерживает trace context propagation?
Spans и Sampling
Span - единица работы внутри трейса: HTTP запрос, SQL запрос, Redis call, внешний API вызов. Каждый span имеет: name, start/end timestamp, attributes (key-value), status (OK/ERROR), events (лог-сообщения с timestamp). Дерево spans составляет трейс - иерархическое отображение работы системы.
Sampling (выборка) - ключевое решение в production: записывать 100% трейсов нереалистично при высоком RPS. Head-based sampling (решение до начала трейса): 1% random. Tail-based sampling (решение в OTel Collector после завершения трейса): всегда записывать трейсы с ошибками или latency > 1s, остальные - 1%. Tail-based умнее но требует больше памяти в Collector.
100% трейсинг всех запросов даёт наилучшую видимость без недостатков
100% трейсинг при 10000 RPS генерирует ~10GB трейсов в час. Tail-based sampling 1% + 100% ошибок даёт практически ту же диагностическую ценность при 100x меньшем объёме данных
99% трейсов успешных запросов с нормальной latency не несут диагностической ценности - они просто подтверждают что всё работает
Чем tail-based sampling лучше head-based при одинаковом проценте выборки?
Ключевые идеи
- **Jaeger** хранит и визуализирует трейсы - waterfall-диаграмма показывает где именно теряется время в цепочке микросервисов
- **OpenTelemetry** - vendor-neutral стандарт: одна инструментация, любой backend; авто-инструментация HTTP/SQL/Express без написания кода
- **Trace Context + Tail Sampling** - propagation через traceparent заголовок связывает сервисы; tail-based sampling в OTel Collector гарантирует сохранение ошибок при 1% выборке
Связанные темы
Distributed tracing - один из трёх столпов observability:
- ELK Stack и логирование — trace.id в структурированных логах ELK связывает лог-записи с spans в Jaeger
- Service Mesh: Istio, Linkerd — Istio автоматически генерирует spans для каждого межсервисного вызова и propagate context через Envoy
Вопросы для размышления
- При каком RPS и сложности системы distributed tracing начинает окупаться по сравнению с traditional logging?
- Как tail-based sampling влияет на точность p99 latency метрик в Jaeger?
- Если БД является bottleneck по трейсам - какие действия следуют из этой информации?