Tracing — отслеживание пути запроса через все сервисы. Каждый запрос получает уникальный trace ID, а каждая операция внутри — span. OpenTelemetry (OTel) — стандарт для сбора traces, metrics и logs.
tracer := otel.Tracer("my-service")
func handleRequest(ctx context.Context) error {
ctx, span := tracer.Start(ctx, "handleRequest")
defer span.End()
span.SetAttributes(attribute.String("user_id", "42"))
// вложенный span
ctx, dbSpan := tracer.Start(ctx, "db.query")
result := db.QueryContext(ctx, "SELECT ...")
dbSpan.End()
return nil
}
Trace ID передаётся между сервисами через заголовки (traceparent). В UI (Jaeger, Tempo) видишь waterfall — какой сервис сколько времени занял. Это незаменимо для дебага в микросервисах: запрос тормозит — открываешь trace и видишь, что 2 секунды ушло на запрос к payment-сервису. Без трейсинга дебаг распределённой системы — стрельба в темноте.