Introduction
En 2026, les applications Java évoluent vers des architectures distribuées complexes comme les microservices et les clouds natifs. OpenTelemetry (OTel), standard ouvert né de la fusion de OpenTracing et OpenCensus, devient indispensable pour l'observabilité. Contrairement aux outils propriétaires, OTel unifie traces, métriques et logs en un seul framework, exportable vers n'importe quel backend (Jaeger, Prometheus, Grafana).
Pourquoi c'est crucial ? Imaginez un e-commerce Java où une requête client traverse 10 services : sans traces, identifier la latence est un cauchemar. OTel capture ces flux automatiquement, réduisant le MTTR (Mean Time To Resolution) de 50% selon CNCF. Ce tutoriel beginner, 100% théorique, pose les fondations : concepts, architecture et pratiques. Pas de code, mais des analogies concrètes pour que vous visualisiez l'implémentation. À la fin, vous saurez structurer votre observabilité Java comme un pro. (128 mots)
Prérequis
- Connaissances de base en Java (JDK 17+ recommandé en 2026).
- Notions d'observabilité : monitoring vs. tracing.
- Familiarité avec les microservices ou Spring Boot (sans expertise requise).
- Accès à un backend comme Jaeger ou Zipkin pour tests futurs.
Étape 1 : Comprendre les piliers d'OpenTelemetry
OpenTelemetry repose sur trois signaux principaux, comme les trois sens d'un pilote : vue (traces), tableau de bord (métriques), journal (logs).
- Traces : Suivi distribué d'une requête. Analogie : une pizza livrée par plusieurs étapes (cuisine, emballage, livraison). Chaque span (segment) mesure durée et attributs (ex. : 'db.query' = 150ms).
- Métriques : Agrégats numériques (compteurs, histogrammes). Exemple concret : nombre de requêtes HTTP/minute dans un service Java, avec percentiles pour détecter les pics.
- Logs : Événements textuels contextualisés. Lien avec traces : un log 'erreur DB' s'attache à une span pour corrélation.
| Signal | Objectif | Exemple Java |
|---|---|---|
| -------- | ---------- | -------------- |
| Traces | Flux distribué | Requête Spring Boot traversant Feign clients |
| Métriques | Tendances | JVM heap usage sur 24h |
| Logs | Détails | Exception stacktrace liée à une trace |
Étape 2 : Décrypter l'architecture OpenTelemetry
Pensez OTel comme une chaîne de production : API (abstraite), SDK (implémentation), Instrumentation (auto), Exporter (sortie).
- API : Interface stable, indépendante du langage. En Java,
io.opentelemetry.apidéfinit Tracer, Meter, Logger. - SDK : Moteur Java (
io.opentelemetry:opentelemetry-sdk). Configure processors, samplers. - Instrumentation : Bibliothèques auto-magiques pour Spring, JDBC, Kafka. Ex. :
@WithSpansur une méthode Java trace sans boilerplate. - Exporter : Pont vers backends. OTLP (gRPC/HTTP) est standard en 2026 pour Prometheus, Elastic.
````
App Java → API/SDK → Processors (Batch/Sampler) → Exporter → Collector → Backend
Le Collector OTel (composant standalone) agrège, filtre et route les données, évitant la surcharge réseau dans un cluster Kubernetes Java.
Étape 3 : Maîtriser la propagation de contexte
En microservices Java, le contexte trace voyage comme un passeport. Baggage (données custom) et TraceContext (traceId, spanId) se propagent via headers HTTP (ex. : traceparent).
Exemple concret : Service A (Spring Boot) appelle B via RestTemplate. OTel injecte headers automatiquement ; B extrait pour nouvelle span enfant.
États du span :
- Active : En cours (temps CPU).
- Ended : Finalisé, avec status (OK/ERROR).
Samplers contrôlent le volume : AlwaysOn (tout), Probabilistic (1%), ParentBased (suivant parent). En prod Java, visez <1% traces pour éviter 10GB+/jour.
Étape 4 : Intégrer métriques et logs
Métriques : Quatre types en Java.
| Type | Description | Usage Java |
|---|---|---|
| ------ | ------------- | ------------ |
| Counter | Incrémental | Requêtes traitées |
| UpDownCounter | + ou - | Connexions pool |
| Histogram | Distribution | Latence API (P50/P95/P99) |
| Gauge | Instantané | Threads actifs |
Bénéfice : Dans Grafana, pivotez d'une métrique 'latence haute' vers la trace causale, puis logs détaillés.
Étape 5 : Configurer pour la production
En 2026, config via properties ou env vars. Ex. : OTEL_SERVICE_NAME=mon-app-java, OTEL_TRACES_EXPORTER=otlp, OTEL_METRICS_EXPORTER=prometheus.
Processors clés :
- Batch : Groupe spans (timeout 5s, max 512).
- Attributes : Limite à 128 par span pour éviter explosion cardinalité.
Ressources Java : OTel surveille JVM metrics (GC, threads) nativement via Micrometer bridge.
Bonnes pratiques
- Commencez par traces : 80% valeur immédiate pour debugging distribué.
- Limitez cardinalité : Attributs low-card (userId) vs. high-card (request.body) → drop ou hash.
- Utilisez semantic conventions :
http.method=POST,db.statementpour interop. - Sampler adaptatif : Head-based en prod pour focus sur erreurs (ratio 1:1000).
- Collector central : Évitez exporters directs depuis pods Java pour scalabilité.
Erreurs courantes à éviter
- No-op par défaut : Vérifiez
OTEL_SDK_DISABLED=false, sinon tout est muet. - Cardinalité explosive : Logs avec timestamps uniques → milliards de séries ; utilisez
{timestamp}template. - Contexte perdu : Oublier propagation dans async (CompletableFuture) → traces orphelines.
- Overhead ignoré : Mesurez CPU (+5-10%) ; optimisez avec batch/small spans.
Pour aller plus loin
- Docs officielles : OpenTelemetry Java.
- CNCF case studies : Netflix, Uber migrations.
- Outils : Jaeger UI pour visualiser traces.
- Formations expertes : Découvrez nos formations Learni sur l'observabilité Java.