Распределённый трейсинг: trace context, W3C traceparent, проброс через gRPC и HTTP
↑ 7.2 Observability: логи, метрики, трейсинг, OpenTelemetry · ← Предыдущая · → Следующая
Зачем это на собесе
Как трейс проходит через границы сервисов и очередей.
Объяснение
Trace — дерево span-ов одного запроса. Каждый span: имя, время, родитель, атрибуты, события, статус.
Контекст передаётся между процессами заголовком W3C:
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
ver trace-id (128 бит) parent span-id flags (sampled)
tracestate: vendor=value
baggage: tenant=acme,userTier=gold (сквозные метки, осторожно)| Транспорт | Как пробрасывается |
|---|---|
| HTTP | заголовок traceparent автоматически инструментацией HttpClient/ASP.NET Core |
| gRPC | metadata traceparent, инструментация Grpc.Net.Client/AspNetCore |
| Kafka/RabbitMQ | заголовки сообщения: продюсер вставляет, консьюмер извлекает и создаёт span с Link/родителем |
| Фоновые задачи | явная передача контекста при постановке задачи |
// Извлечение контекста из сообщения Kafka
var parent = Propagator.Extract(default, headers, (h, k) => h.TryGetLastBytes(k, out var v) ? [Encoding.UTF8.GetString(v)] : []);
using var activity = Source.StartActivity("process orders", ActivityKind.Consumer, parent.ActivityContext);Виды span: Server, Client, Producer, Consumer, Internal.
Нюансы и подводные камни
- Потерянный заголовок на границе (прокси, шлюз, очередь) обрывает трейс.
- Baggage передаётся всем downstream-сервисам и попадает в сеть: не кладите секреты.
- Семплирование должно быть согласованным (
ParentBased), иначе трейсы неполные. - Пакетная обработка сообщений порождает один span на много входящих: используйте
Link. - Часы разных серверов расходятся: порядок span-ов определяют по связям, а не по времени.
Практика
- Пробросьте трейс через HTTP, gRPC и Kafka и посмотрите его в Jaeger/Tempo.
- Найдите, где обрывается цепочка, и исправьте.
- Добавьте
trace_idв ответ об ошибке.
Вопросы с ответами
Что содержит заголовок traceparent?
Версию,
trace-id,parent span-idи флаги (например, sampled).
Как проследить запрос через брокер?
Записывать контекст в заголовки сообщения и восстанавливать его в потребителе.