L’issue s’ouvre déjà remplie avec le titre et l’adresse de cette page.
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. Un backend ne peut afficher que ce que l'instrumentation a émis : une trace sans service.name reste anonyme quel que soit le tableau de bord placé derrière.
Mais "instrumenter" n'est pas un seul outil. C'est un empilement de couches qui vont de votre code jusqu'au backend (l'outil qui stocke et affiche les signaux). Cette page vous explique comment ces briques s'assemblent.
Deux termes reviennent partout. Un span est une opération chronométrée (un appel HTTP, une requête SQL) ; une trace est l'ensemble des spans d'une même requête, de service en service.
Lisez le schéma de haut en bas, dans le sens de circulation des signaux. Chaque couche a un point de configuration distinct, et c'est ce qui compte pour vous : un problème de nommage de service se règle dans le SDK, un problème de volume dans le sampling, un problème de données sensibles dans le Collector. Savoir à quelle couche appartient un symptôme évite de modifier le code applicatif pour un réglage qui vit ailleurs.
Plus vous descendez dans le pipeline, plus la configuration est centralisée et donc facile à gouverner, mais plus vous perdez le contexte métier : le Collector voit passer des spans, il ne sait pas qu'il s'agit d'un abandon de panier.
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.
Outil
Ce qu'il fait
OpenTelemetry API
Interface standard pour traces, métriques, logs (multi-langage)
Micrometer (Java)
Facade "metrics-first" très utilisée dans l'écosystème Spring
Glissez pour voir
Dans le code, ça ressemble à :
# Créer un span (trace)
with tracer.start_as_current_span("checkout.process") as span:
Le sampling (échantillonnage) ne conserve qu'une partie des traces pour limiter le coût. parentbased_traceidratio garde ici 10 % des traces, et respecte la décision déjà prise par le service appelant. Comme cette décision est prise à la création de la trace, avant d'en connaître l'issue, le SDK ne peut pas viser les traces en erreur : le tail sampling du Collector s'en charge, et les fondamentaux des traces comparent les deux approches.
Pas d'agent comme en Java : instrumentation eBPF (OBI, OpenTelemetry eBPF Instrumentation) ou bibliothèques d'instrumentation (otelhttp...) ajoutées au code
PHP
Extension PHP : opentelemetry.so
Glissez pour voir
Quand l'utiliser ?
Pour couvrir rapidement l'essentiel des spans techniques (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
La colonne « Où ça vit » est celle à retenir, parce qu'elle dit qui doit
intervenir quand un réglage change. Modifier l'API ou les spans manuels
implique un développeur et un redéploiement. Modifier le SDK se fait par
variables d'environnement, donc au niveau du déploiement. Modifier le Collector
ne touche aucune application. Cette progression est exactement ce qui rend
l'architecture avec Collector plus soutenable dans la durée.
Chaque environnement a ses contraintes. Voici les trois patterns les plus courants, vus depuis l'application. Le détail du déploiement côté Collector (gateway, agent, sidecar, haute disponibilité) est dans la page Collecte & pipeline.
L'application exporte directement vers le backend, sans intermédiaire. C'est la
configuration la plus courte à écrire, et la seule dette qu'elle crée est
l'adresse du backend inscrite dans la configuration de chaque service. Sur
un seul service, ce n'est rien. Sur quinze, chaque changement de backend devient
une campagne de redéploiement.
Avantage : simple, rapide à mettre en place
Limite : couplé au backend, difficile à faire évoluer
Limite : 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. La configuration applicative se réduit alors à une seule adresse OTLP, identique pour tous les services, et tout ce qui relève du filtrage, du masquage ou du routage sort du code.
Trois applications instrumentées avec le SDK OpenTelemetry envoient en OTLP à un Collector central, qui filtre, échantillonne, route et masque avant de livrer Tempo, Mimir et Loki.BackendsApplicationsOTLPOTLPOTLPApp 1OTel SDKApp 2OTel SDKApp 3OTel SDKOTel Collectorfiltrage, sampling, routage, masquageTempotracesMimirmétriquesLokilogs
Chaque nœud Kubernetes a un agent (un DaemonSet, c'est-à-dire un pod par nœud) qui collecte localement, puis envoie à une gateway centrale. Ce dédoublement répond à deux besoins que le Collector unique ne couvre pas : l'agent est le mieux placé pour lire les métadonnées du nœud et les journaux des conteneurs qui y tournent, et il absorbe les pics locaux sans saturer le réseau entre nœuds.
Sur chaque nœud Kubernetes, les pods envoient en OTLP à un agent déployé en DaemonSet ; les agents transmettent à une gateway répliquée au moins deux fois, qui alimente Tempo, Mimir et Loki.BackendsNode 2Node 1OTLPOTLPOTLPOTLPOTLPOTLPPod APod BAgentDaemonSetPod CPod DAgentDaemonSetGatewayDeployment, 2 replicas ou plusTempoMimirLoki
Ce tableau se lit par le besoin, pas par l'outil. Deux lignes se combinent
presque toujours en production : l'auto-instrumentation couvre les appels
techniques, les spans manuels ajoutent le contexte métier que rien
d'automatique ne peut deviner. Choisir l'une contre l'autre est une erreur
fréquente ; elles ne répondent pas à la même question.
Les six étapes sont ordonnées par dépendance, pas par importance. Les deux
premières conditionnent tout le reste : sans identité de service, vos traces
arrivent anonymes dans le backend, et sans propagation W3C, chaque service
crée sa propre trace au lieu de continuer celle de l'appelant, ce qui donne des
traces coupées en morceaux que rien ne relie.
Ces variables sont standardisées par la spécification OpenTelemetry : elles
portent le même nom quel que soit le langage, ce qui permet de les injecter
uniformément depuis un manifeste Kubernetes ou un fichier docker compose. Le
port 4317 correspond au transport gRPC ; passez à 4318 si vous exportez
en HTTP.
La configuration minimale est celle du bloc de variables de la section SDK plus
haut : l'identité du service (OTEL_SERVICE_NAME,
OTEL_RESOURCE_ATTRIBUTES), l'export OTLP vers le Collector
(OTEL_EXPORTER_OTLP_ENDPOINT) et le sampling (OTEL_TRACES_SAMPLER et
OTEL_TRACES_SAMPLER_ARG), à ajuster selon le volume de traces. Les spans
métier, les métriques RED et la redaction, eux, demandent du code ou une
configuration du Collector.
La première ligne du tableau est celle qui coûte le plus cher en facture. Mettre
un identifiant unique (identifiant de commande, adresse e-mail, identifiant de
session) dans un label de métrique crée une série temporelle distincte par
valeur : quelques milliers de commandes suffisent à faire exploser la
cardinalité et à saturer le backend. Les identifiants ont leur place dans les
attributs de span, pas dans les métriques.
Anti-pattern
Conséquence
Solution
IDs uniques en tags/labels
Explosion cardinalité, coûts
Utiliser des catégories (status, region)
Tout tracer sans sampling
Overhead perf, coûts stockage
Un ratio de départ (10 à 20 %, repère indicatif) puis tail sampling dans le Collector
Cette page décrit l'assemblage des couches et ne se pratique pas : le geste se
joue dans les guides d'outil. Chaque famille d'outil renvoie vers le sien.
OpenTelemetry est le seul projet à couvrir les trois signaux (traces,
métriques, logs) avec une API commune et des conventions de nommage partagées.
C'est par le guide OpenTelemetry
qu'il faut commencer : les autres pages de cette section supposent son
vocabulaire acquis. Si le modèle de données (signal, contexte, propagation)
n'est pas encore clair, les
fondamentaux OpenTelemetry
l'expliquent sans outil, et la
corrélation des signaux montre
comment relier logs, métriques et traces.
Chaque langage a son mécanisme d'injection, résumé dans le tableau plus haut :
agent JVM pour Java, exécutable d'enrobage pour Python, chargement de module au
démarrage pour Node.js. Le guide OpenTelemetry cité ci-dessus couvre les
concepts communs à tous les langages, dont l'agent Java et le wrapper Python.
Micrometer précède OpenTelemetry dans l'écosystème Spring et reste très
présent sur les applications Java existantes. Il est avant tout une
facade de métriques (le traçage relève de Micrometer Tracing, un module à
part), et il sait exporter les métriques en OTLP, ce qui permet de le conserver côté
code tout en unifiant la sortie avec le reste de votre télémétrie. Le guide
Micrometer l'installe
sur une application Spring Boot.
L'export direct convient à un POC, le Collector central dès plusieurs services en production, agent + gateway sur Kubernetes à l'échelle
Les applications ne connaissent qu'un endpoint OTLP : filtrage, masquage et routage vivent dans le Collector
Auto-instrumentation et spans manuels se combinent : l'une couvre les tuyaux, l'autre le contexte métier
Commencez par l'identité du service et la propagation W3C, puis les spans métier, les métriques RED et le sampling
Pas d'identifiant unique dans un label de métrique : il va dans les attributs de span
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
6 questions
6 min.
70% requis
Informations
Le chronomètre démarre au clic sur Démarrer
Questions à choix multiples, vrai/faux et réponses courtes
Vous pouvez naviguer entre les questions
Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
⏱️--:--
0 / 6
Vérification
(0/0)
--:--
0%
0Correctes
0À revoir
0:00Temps
-Niveau
Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.