Une requete dans un systeme microservices peut traverser 10 services differents. Quand elle prend 3 secondes, comment savoir ou le temps est passe ?
Le probleme du tracing distribue
Sans tracing, vous avez les logs de chaque service — mais ils sont isoles. Vous ne savez pas dans quel ordre ils ont ete executes ni combien de temps chaque etape a pris.
Les concepts cles
Trace : le parcours complet d’une requete a travers tous les services. Span : une operation dans un service (appel DB, appel HTTP, traitement). Trace ID : identifiant unique qui relie tous les spans d’une trace. Parent Span ID : relie un span a son span parent.
Instrumenter avec OpenTelemetry
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
# Configuration
provider = TracerProvider()
jaeger_exporter = JaegerExporter(agent_host_name="jaeger", agent_port=6831)
provider.add_span_processor(BatchSpanProcessor(jaeger_exporter))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
# Utilisation
@app.get("/orders/{order_id}")
async def get_order(order_id: int):
with tracer.start_as_current_span("get-order") as span:
span.set_attribute("order.id", order_id)
with tracer.start_as_current_span("db-query"):
order = await db.get_order(order_id)
with tracer.start_as_current_span("enrich-data"):
enriched = await enrich_service.enrich(order)
return enriched
Propager le trace ID entre services
# Dans le client HTTP
from opentelemetry.propagate import inject
headers = {}
inject(headers) # Injecte traceparent, tracestate
response = requests.get(f"http://payment-service/pay/{order_id}", headers=headers)
Analyser dans Jaeger
Dans l’interface Jaeger, vous voyez un gantt chart de votre trace :
api-gateway [100ms]
order-service [85ms]
db-query [40ms]
payment-service [35ms]
stripe-api [30ms]
D’un coup d’oeil : la latence vient de la base de donnees et de Stripe — pas de votre code.
Notre formation Observabilite couvre le tracing distribue avec OpenTelemetry.