RousselTMLEARNING

Article · OpenTelemetry: From Discovery to Expertise

Distributed tracing and context propagation

This article is available in French.

1. Le problème à résoudre #

Relier des spans créés dans des processus différents.

Pourquoi propager ? #

Chaque service crée ses propres spans, mais pour obtenir une seule trace il faut transmettre l'identité de la trace (TraceID) et du span parent à chaque appel. Cette transmission s'appelle la propagation de contexte : l'appelant injecte le contexte dans le message, l'appelé l'extrait.

Propagation du contexte entre trois services
Sans propagation, chaque service produit une trace isolée.

2. Le standard W3C Trace Context #

traceparent, tracestate et baggage.

Les en-têtes #

traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
#            |  |                                |                |
#            |  trace-id (16 octets, hex)         span-id parent   flags (01 = échantillonnée)
#            version

tracestate: vendor1=valeur,vendor2=autre          # informations propres à des fournisseurs
baggage: user.tier=gold,region=eu                 # paires clé/valeur métier propagées à tous les services
En-têteContenuAttention
traceparentTraceID, SpanID parent, flagsIndispensable pour relier les spans
tracestateDonnées spécifiques à un fournisseurPeu utilisé en pratique
baggageContexte métier (client, région...)Visible de tous les services et tiers : jamais de secret

3. Configurer les propagateurs #

Variables d'environnement.

OTEL_PROPAGATORS #

export OTEL_PROPAGATORS=tracecontext,baggage        # valeur par défaut : W3C
export OTEL_PROPAGATORS=tracecontext,baggage,b3multi  # compatibilité avec des services Zipkin/B3
export OTEL_PROPAGATORS=jaeger,tracecontext             # migration depuis Jaeger

Tous les services d'une même chaîne doivent partager au moins un format commun : c'est la première chose à vérifier quand une trace est coupée en deux.

# Tester à la main : forcer un TraceID connu et le retrouver dans Tempo
curl -H 'traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01' http://localhost:8080/commande
curl -s http://localhost:3200/api/traces/4bf92f3577b34da6a3ce929d0e0e4736 | jq '.batches | length'

4. Propager manuellement #

Messagerie, jobs et clients HTTP non instrumentés.

Injecter et extraire (Python) #

from opentelemetry import trace, propagate, context

tracer = trace.get_tracer("orders")

# Producteur : injecter le contexte dans les en-têtes du message
def publier(message):
    with tracer.start_as_current_span("publier_commande", kind=trace.SpanKind.PRODUCER):
        headers = {}
        propagate.inject(headers)                    # ajoute traceparent / baggage
        kafka_producer.send("commandes", value=message, headers=[(k, v.encode()) for k, v in headers.items()])

# Consommateur : extraire et continuer la trace
def consommer(record):
    carrier = {k: v.decode() for k, v in record.headers}
    ctx = propagate.extract(carrier)
    with tracer.start_as_current_span("traiter_commande", context=ctx, kind=trace.SpanKind.CONSUMER) as span:
        span.set_attribute("messaging.destination.name", "commandes")
        traiter(record.value)

Dépanner une trace coupée #

SymptômeCause probableAction
Deux traces au lieu d'unePropagateurs différents entre servicesAligner OTEL_PROPAGATORS
En-tête absent côté appeléProxy / gateway qui supprime les en-têtesAutoriser traceparent et baggage dans la configuration du proxy
Trace perdue après une file de messagesContexte non injecté dans les en-têtes du messageInjecter/extraire manuellement ou activer l'instrumentation du client
Spans orphelins en tâche de fondContexte perdu entre threads/coroutinesUtiliser context.attach() / run_in_executor instrumenté
Une partie seulement des traces est complèteÉchantillonnage head différent entre servicesUtiliser parentbased_traceidratio partout
# nginx : laisser passer / générer le contexte
proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate  $http_tracestate;
proxy_set_header baggage     $http_baggage;
Erreur Courante : Ne placez jamais de données sensibles dans le baggage : il est propagé à tous les services en aval, y compris les services tiers.

📄 Tracing distribué : la propagation du contexte (W3C Trace Context et baggage) →

My progress

  • ⏱ Estimated time : ≈ 8 min

Sign in to track your progress and take notes. Sign in

💬 Ask a question

Recommended Articles

Le tracing distribué avec Jaeger : concepts et architecture

Les concepts du tracing distribué (trace, span, contexte, propagation) et Jaeger : son histoire, ...

Du clic à la base de données : traces front-end vers back-end avec Faro

Relier les requêtes du navigateur aux traces du back-end : TracingInstrumentation, propagation de...

Traefik : le tracing distribué avec OpenTelemetry

Activer le tracing de Traefik v3 avec OpenTelemetry (OTLP), propager le contexte W3C vers les app...

Les traces OpenTelemetry en profondeur : spans, statuts, événements, liens et échantillonnage

Maîtriser le signal trace : anatomie d'une trace distribuée, span et SpanKind, attributs, statut ...

Bonnes pratiques du tracing distribué avec Jaeger

Check-list pour un tracing utile : instrumentation OpenTelemetry, nommage des spans, attributs, p...

Corréler traces, métriques, logs et profils avec OpenTelemetry

Relier les quatre signaux pour diagnostiquer vite : ressource commune, trace_id dans les logs, ex...

Les concepts fondamentaux d'OpenTelemetry : signaux, ressources, contexte et maturité

Le vocabulaire indispensable d'OpenTelemetry : les quatre signaux, API et SDK, ressource et instr...

Grafana Tempo : le backend de traces distribuées à grande échelle

Comprendre le tracing distribué et Grafana Tempo : traces, spans, TraceID, architecture (distribu...

OpenInference : les conventions OpenTelemetry pour tracer les applications d'IA

Guide détaillé d'OpenInference : conventions sémantiques et instrumentations OpenTelemetry pour L...

Support us

♥ SUPPORT US

Support RousselTM Learning

Courses, articles, labs and certificates stay free with no intrusive ads. A voluntary contribution, of any amount you choose, pays for hosting, lab environments and new content.

Contribute with PayPal Any amount · card or PayPal accountLearn more
QR code PayPal
Or scan this QR code with your phone

Thank you, every contribution counts!