RousselTMLEARNING

Observabilité

Instrumenter ses applications pour Jaeger avec OpenTelemetry

Envoyer des traces à Jaeger avec OpenTelemetry : auto-instrumentation (Java, Python, Node.js), SDK et spans manuels, variables d'environnement, attributs, propagation et application de démonstration HotROD.

1. Les variables d'environnement #

La configuration commune à tous les langages.

Variables OTEL #

VariableExemple
OTEL_SERVICE_NAMEcommandes
OTEL_EXPORTER_OTLP_ENDPOINThttp://jaeger:4318
OTEL_EXPORTER_OTLP_PROTOCOLhttp/protobuf ou grpc
OTEL_RESOURCE_ATTRIBUTESdeployment.environment=production,service.version=2.4.1
OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARGparentbased_traceidratio, 0.1
OTEL_PROPAGATORStracecontext,baggage
Bonne Pratique : Jaeger reçoit l'OTLP nativement : aucune bibliothèque spécifique à Jaeger n'est nécessaire. Le même code peut envoyer à Jaeger, Tempo, Elastic ou SigNoz en changeant une variable.

2. Auto-instrumentation #

Des traces sans modifier le code.

Java #

curl -LO https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
OTEL_SERVICE_NAME=commandes OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318 \
  java -javaagent:opentelemetry-javaagent.jar -jar commandes.jar

Python #

pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install          # installe les instrumentations des bibliothèques présentes
OTEL_SERVICE_NAME=stock OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318 \
  opentelemetry-instrument python app.py

Node.js #

npm install @opentelemetry/auto-instrumentations-node
OTEL_SERVICE_NAME=front OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318 \
  node --require @opentelemetry/auto-instrumentations-node/register server.js

3. Spans manuels #

Ajouter le contexte métier.

Python #

from opentelemetry import trace

tracer = trace.get_tracer("stock")

def reserver(produit_id, quantite):
    with tracer.start_as_current_span("reserver_stock") as span:
        span.set_attribute("produit.id", produit_id)
        span.set_attribute("stock.quantite", quantite)
        try:
            ...
        except RuptureDeStock as e:
            span.record_exception(e)
            span.set_status(trace.Status(trace.StatusCode.ERROR, "rupture"))
            raise
Erreur Courante : N'ajoutez pas de données personnelles (e-mail, nom) dans les attributs : les traces sont souvent conservées et consultées largement.

L'application HotROD #

HotROD (« Rides on Demand ») est l'application de démonstration de Jaeger : quatre microservices simulés, des latences et erreurs réalistes, des problèmes à diagnostiquer. Elle est idéale pour apprendre à lire des traces.

docker run --rm -p 8080:8080 -e OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318 jaegertracing/example-hotrod:latest all

Articles liés

Le tracing distribué avec Jaeger : concepts et architecture

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

Installer Jaeger v2 : all-in-one, configuration et stockages

Lancer Jaeger v2 en all-in-one, comprendre son fichier de configuration (extensions jaeger_storage et jaeger_…

Analyser des traces dans l'interface de Jaeger

Rechercher des traces, lire une chronologie, repérer le chemin critique, comparer deux traces, utiliser le gr…

Pour aller plus loin