Aller au contenu
Outils medium

Instrumentation

10 min de lecture

L’instrumentation est la première étape du pipeline d’observabilité : c’est le code qui génère les signaux — métriques, logs, traces — au sein même de vos applications. Sans instrumentation de qualité, les meilleurs backends et dashboards du monde ne servent à rien : “garbage in, garbage out”.

Mais “instrumenter” n’est pas un seul outil. C’est un empilement de couches qui vont de votre code jusqu’au backend. Cette page vous explique comment ces briques s’assemblent.

Voici comment les signaux circulent de votre code jusqu’à vos backends :

Couches d'instrumentation : du code applicatif aux backends

L’idée clé : plus vous descendez dans le pipeline, plus c’est centralisé (facile à gouverner), mais moins vous êtes “proche” de la logique métier.

1. API / Facade : l’interface que le code appelle

Section intitulée « 1. API / Facade : l’interface que le code appelle »

L’API fournit une interface stable dans le code : tracer, meter, logger. Votre code appelle ces primitives sans savoir quel backend stockera les données.

OutilCe qu’il fait
OpenTelemetry APIInterface standard pour traces, métriques, logs (multi-langage)
Micrometer (Java)Facade “metrics-first” très utilisée dans l’écosystème Spring

Dans le code, ça ressemble à :

# Créer un span (trace)
with tracer.start_as_current_span("checkout.process") as span:
span.set_attribute("cart.items", 3)
# ... logique métier
// Incrémenter un compteur (métrique)
counter.add(1, Attributes.of(stringKey("status"), "success"));

2. SDK : l’implémentation qui collecte et exporte

Section intitulée « 2. SDK : l’implémentation qui collecte et exporte »

Le SDK transforme ce que produit l’API en télémétrie exploitable :

ResponsabilitéCe que ça fait
Buffering / BatchRegroupe les signaux avant export (économise le réseau)
RetryRé-essaie en cas d’échec réseau
SamplingDécide quelles traces garder (ratio, parent-based…)
PropagationInjecte/extrait le contexte (trace-id) entre services
ExportEnvoie les signaux vers OTLP (ou autre format)

C’est dans le SDK que vous configurez :

Fenêtre de terminal
# Identité du service
OTEL_SERVICE_NAME=checkout-api
OTEL_RESOURCE_ATTRIBUTES=service.version=1.2.3,deployment.environment=production
# Export OTLP vers le Collector
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
OTEL_EXPORTER_OTLP_PROTOCOL=grpc
# Sampling (10% des traces)
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1

L’auto-instrumentation intercepte automatiquement les appels aux frameworks et librairies (HTTP, DB, messaging) sans modifier votre code.

LangageComment ça marche
JavaAgent JVM : -javaagent:opentelemetry-javaagent.jar
PythonWrapper : opentelemetry-instrument python app.py
Node.jsRequire : --require @opentelemetry/auto-instrumentations-node/register
.NETRuntime hooks (variable CORECLR_ENABLE_PROFILING)
GoInstrumentation des packages (net/http, database/sql…)
PHPExtension PHP : opentelemetry.so

Quand l’utiliser ?

  • Pour couvrir rapidement 80% des spans (HTTP entrant/sortant, SQL, Redis, Kafka…)
  • Sur du legacy où vous ne voulez pas toucher le code
  • En complément de spans manuels pour la logique métier

4. Exporters : comment les signaux sortent de l’application

Section intitulée « 4. Exporters : comment les signaux sortent de l’application »

L’exporter envoie les signaux vers une destination. En 2026, le standard est :

App (SDK) → OTLP → Collector

Pourquoi OTLP vers un Collector (et pas directement vers le backend) ?

AvantageExplication
DécouplageVotre app ne “connaît” qu’un endpoint OTLP
FlexibilitéChangez de backend (Jaeger → Tempo) sans recoder
GouvernanceFiltrage, redaction, routing centralisés
RésilienceLe Collector bufferise si le backend est down

Le Collector est le routeur central de votre télémétrie. Il reçoit les signaux OTLP et les transforme/route vers vos backends.

Ce qu’il fait :

FonctionExemple
NormaliserConvertir différents formats en un seul
EnrichirAjouter metadata Kubernetes (namespace, pod, node)
FiltrerExclure les healthchecks, les routes internes
RedacterMasquer les tokens, emails, données sensibles
RouterTraces → Tempo, Métriques → Mimir, Logs → Loki
BufferiserQueue + retry si backend indisponible
CoucheExempleOù ça vitÀ quoi ça sert
API / FacadeOTel API, MicrometerDans le codeInterface stable, appels de l’app
SDKOTel SDK Java/Python/NodeDans le runtimeCollecte, batching, sampling, export
Auto-instrumentationJava Agent, Python distroAutour de l’appSpans/metrics automatiques sans toucher le code
ExporterOTLP exporterDans l’appSortie des signaux
CollectorOTel CollectorInfraGouvernance, routing, résilience

Chaque environnement a ses contraintes. Voici les trois patterns les plus courants :

L’app exporte directement vers le backend.

  • ✅ Simple, rapide à mettre en place
  • ❌ Couplé au backend, difficile à faire évoluer
  • ❌ Pas de gouvernance centralisée

Quand l’utiliser : POC, application standalone, environnement de développement.

Toutes les applications exportent vers un Collector central qui route vers les backends.

Architecture standard avec Collector central

  • ✅ Découplage apps ↔ backends
  • ✅ Gouvernance centralisée (filtering, redaction, sampling)
  • ✅ Multi-backends sans modifier le code applicatif

Quand l’utiliser : dès que vous avez plusieurs services en production.

Chaque node a un agent (DaemonSet) qui collecte localement, puis envoie à un gateway central.

Architecture Kubernetes agent + gateway

  • ✅ Collecte locale (faible latence réseau)
  • ✅ Enrichissement Kubernetes (namespace, pod, node)
  • ✅ Routing centralisé + HA (gateway répliqué)

Quand l’utiliser : clusters Kubernetes de production, multi-tenants, équipes plateforme.

Vous voulez…Solution
Zéro codeAuto-instrumentation + OTLP → Collector
Du contexte métierSpans manuels via API + SDK
Découpler du backendOTLP exporter vers Collector
Standardiser cross-langageOpenTelemetry partout
Juste des métriques JVMMicrometer (mais OTel reste compatible)
Migrer du legacyOTel Shim pour OpenTracing/OpenCensus

Avant de tout tracer, instrumentez l’essentiel :

ÉtapeCe qu’il faut faire
1. IdentitéOTEL_SERVICE_NAME, service.version, deployment.environment
2. PropagationW3C Trace Context (traceparent) activé
3. Spans métier3-5 opérations clés (checkout, paiement, génération PDF)
4. Métriques REDRate, Errors, Duration (p50/p95/p99)
5. RedactionMasquer tokens, emails, PII avant export
6. SamplingRatio 10-20% pour commencer, affiner ensuite
Fenêtre de terminal
# Identité du service
OTEL_SERVICE_NAME=checkout-api
OTEL_RESOURCE_ATTRIBUTES=service.version=1.2.3,deployment.environment=production
# Export OTLP
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
# Sampling (ajuster selon le volume)
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1
Anti-patternConséquenceSolution
IDs uniques en tags/labelsExplosion cardinalité, coûtsUtiliser des catégories (status, region)
Tout tracer sans samplingOverhead perf, coûts stockageRatio 10-20% puis tail-based
Spans trop verbeuxBruit, difficile à exploiter5-10 attributs max par span
Pas de validation localeBugs découverts en prodExporter vers console/debug en dev
Ignorer service.nameTraces anonymes, inutilisablesToujours définir l’identité
Exporter direct vers backendCouplage, pas de gouvernancePasser par le Collector

Guides prévus : OpenTelemetry Java Agent, Python, Node.js, et l’Operator K8s.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.