ITSkillsCenter
Business Digital

Observabilite applicative en 2026 : OpenTelemetry, traces distribuees et stack LGTM

20 min de lecture

Sommaire

Pourquoi l’observabilité applicative redéfinit le métier en 2026

Une application moderne ne tient plus dans un seul processus. Elle s’étale sur des dizaines de microservices, des files asynchrones, des bases managées, des fonctions serverless et des appels HTTP vers des APIs externes. Quand une requête utilisateur prend trois secondes au lieu de cent millisecondes, la question « où est le temps perdu ? » n’a plus de réponse évidente. Les métriques agrégées d’un seul service ne disent plus rien, parce que le problème est presque toujours entre les services, pas dedans.

L’observabilité applicative répond à cette douleur. Elle ne se contente pas de répondre à « est-ce que ça marche ? » comme le monitoring classique. Elle répond à « pourquoi ça ne marche pas comme attendu ? », y compris pour des défaillances qui n’avaient jamais été anticipées au moment où l’application a été déployée. Cette nuance change tout : on ne pré-déclare pas toutes les questions, on instrumente l’application de manière à pouvoir poser des questions inédites en production, après coup, à partir des signaux qu’elle émet.

En 2026, deux mouvements convergent et rendent ce sujet incontournable. Le premier est l’adoption massive d’OpenTelemetry comme standard ouvert, soutenu par la Cloud Native Computing Foundation et désormais le deuxième projet le plus actif après Kubernetes. Le second est la maturation de stacks d’analyse open source comme la famille LGTM de Grafana Labs, qui offrent une alternative crédible aux backends propriétaires historiquement coûteux. Conséquence : un développeur qui maîtrise ce duo peut instrumenter, collecter, stocker et explorer des signaux applicatifs sans dépendre d’une licence opaque ni d’un fournisseur unique.

Cet article pose les fondations conceptuelles puis renvoie vers une série de tutoriels pratiques qui creusent chaque brique : instrumentation Node.js, Python et Go, configuration du Collector, envoi des trois signaux vers Loki, Tempo et Mimir, corrélation par trace_id dans Grafana, et stratégies de sampling pour maîtriser les coûts.

Les trois piliers : logs, métriques, traces

L’observabilité s’appuie sur trois types de signaux qui se complètent et ne se substituent pas. Comprendre leurs forces respectives évite d’utiliser un marteau pour visser une vis.

Les logs : le récit textuel d’un événement

Un log est une trace textuelle horodatée, en général émise par une instruction explicite du code. Il porte un message libre et, si l’on s’en donne la peine, un ensemble d’attributs structurés. Sa force est la richesse contextuelle : on y met le message d’erreur exact, la pile d’exécution, l’identifiant de l’utilisateur, le payload reçu. Sa faiblesse est le coût : ingérer, indexer et requêter des téraoctets de logs en texte libre coûte cher, et pousse souvent les équipes à conserver moins de jours que souhaité.

Le pivot des dix dernières années est le passage des logs textuels libres aux logs structurés en JSON, où chaque champ devient interrogeable sans regex coûteuse. Cette discipline change radicalement le coût d’analyse en aval, et c’est elle qui rend des solutions comme Loki viables à grande échelle, parce que Loki indexe les labels et non le corps du log.

Les métriques : le résumé numérique agrégé

Une métrique est une mesure numérique régulière : nombre de requêtes par seconde, latence p99, pourcentage de CPU utilisé, taille d’une file d’attente. Elle est par construction petite : on ne stocke que des compteurs ou des histogrammes, pas chaque événement individuel. Cette compacité la rend très adaptée aux tableaux de bord temps réel et aux alertes, mais elle paie ce gain en perdant le contexte unitaire — une métrique ne dira jamais quelle requête précise a été lente, seulement que le p99 a dépassé un seuil.

Le piège des métriques est la cardinalité. Chaque combinaison unique de labels (par exemple method=GET,path=/users/42,status=200) crée une nouvelle série temporelle. Mettre l’identifiant utilisateur ou un UUID dans un label fait exploser la cardinalité et peut faire tomber un Prometheus en quelques heures. La règle est simple : un label doit avoir un nombre borné de valeurs possibles.

Les traces : le chemin d’une requête à travers les services

Une trace distribuée capture le parcours d’une requête unique dans tout le système. Elle est composée de spans imbriqués : chaque span représente une opération (réception HTTP, requête SQL, appel à une API, traitement métier) et porte sa durée, son statut et ses attributs. Le contexte de trace est propagé d’un service à l’autre via des en-têtes HTTP standardisés (W3C Trace Context), ce qui permet de reconstituer l’arbre complet même si chaque service ne connaît que sa partie.

La trace est le signal qui répond le mieux à « pourquoi cette requête précise a-t-elle pris trois secondes ? ». Elle montre que 2,7 secondes ont été consommées par un appel à un service de paiement, dont 2,5 secondes par un retry sur un timeout. Sans trace, ce diagnostic exige de corréler manuellement des logs de dix services différents.

La complémentarité des trois est claire : la métrique alerte, le log raconte, la trace localise. Une plateforme d’observabilité moderne expose les trois et les corrèle automatiquement par trace_id, ce qui transforme un incident d’une heure en investigation de quelques minutes.

OpenTelemetry : la norme qui a tué le verrouillage propriétaire

Pendant des années, instrumenter une application demandait de choisir un agent propriétaire dès la première ligne de code. Le code devenait dépendant du fournisseur : changer d’outil signifiait réinstrumenter, parfois entièrement. OpenTelemetry, projet incubé par la CNCF (statut incubating depuis août 2021), casse ce verrou.

OpenTelemetry, abrégé OTel, fournit un ensemble de spécifications, de SDK et d’outils dont l’objectif est unique : produire des données d’observabilité dans un format standard, agnostique du backend qui les analysera. Le code applicatif n’appelle plus une API propriétaire, mais l’API OTel. À l’autre bout, on choisit où envoyer les données, et on peut changer ce choix sans toucher au code.

Les composants clés de l’écosystème OpenTelemetry

L’écosystème OTel se découpe en briques bien identifiées. Comprendre leur articulation est essentiel pour ne pas s’égarer dans la documentation, qui couvre une surface très large.

L’API est la surface stable que les développeurs appellent depuis leur code. Elle est conçue pour ne rien faire par défaut : si aucun SDK n’est chargé, les appels à l’API sont des opérations no-op qui ne produisent ni surcoût mesurable ni dépendance. C’est ce qui permet à un mainteneur de bibliothèque d’instrumenter son code sans imposer une trace à ses utilisateurs.

Le SDK est l’implémentation qui transforme les appels API en données réelles, configure le traitement (batching, sampling, attributs de ressource) et achemine vers un exporter. Chaque langage a son SDK : @opentelemetry/sdk-node pour Node.js, opentelemetry-sdk pour Python, go.opentelemetry.io/otel/sdk pour Go.

Le protocole OTLP (OpenTelemetry Protocol) est le format de transport standard, disponible en gRPC et en HTTP/protobuf. Il porte les trois signaux et garantit qu’un exporter OTLP peut parler à n’importe quel backend qui implémente OTLP en réception. C’est le ciment qui rend l’écosystème interopérable.

Le Collector est un binaire autonome qui reçoit, transforme et redistribue les données. Il sert de tampon, de point de configuration centralisé et d’agent d’enrichissement. On le déploie soit en agent local sur chaque hôte, soit en gateway centralisée, soit les deux en chaîne.

Les instrumentations sont des bibliothèques qui patchent automatiquement les frameworks populaires (HTTP, ORM, brokers) pour générer les spans et métriques sans toucher au code applicatif. C’est la voie d’entrée recommandée : avant d’écrire des spans manuels, on active les instrumentations natives qui couvrent déjà 80 % des besoins.

L’état de stabilité en 2026

Tous les signaux ne sont pas au même niveau de maturité. Les traces et les métriques sont stables et garanties par les engagements de versioning du projet. Les logs ont atteint la stabilité GA dans le Collector et progressent à des rythmes différents dans les SDK : stable côté Java et .NET, en bêta côté Go, encore en development côté Python et JavaScript pour la partie SDK logs au moment où ce texte est écrit. Ce détail compte au moment de figer une version dans un projet long terme — la portée API trace/metrics, elle, est stable partout.

Côté versions au printemps 2026 que l’on retient comme références dans les tutoriels associés : Collector v0.151.0 (composants stables v1.57.x), SDK JS 2.x avec @opentelemetry/sdk-node 0.216.x et @opentelemetry/api 1.9.x, SDK Python 1.41.x, SDK Go 1.43.x. Vérifier la dernière version sur les pages de release officielles avant de figer une dépendance reste un réflexe de base.

La stack LGTM : Loki, Grafana, Tempo, Mimir

OpenTelemetry produit et achemine les signaux. Il faut ensuite un endroit pour les stocker, les indexer et les explorer. Grafana Labs a conçu une famille de quatre outils open source qui répondent à ce besoin de manière cohérente : LGTM pour Loki, Grafana, Tempo, Mimir.

Loki pour les logs

Loki adopte une approche radicalement différente d’Elasticsearch : au lieu d’indexer le corps des logs, il n’indexe que les labels et stocke le contenu sous forme de blocs compressés sur stockage objet. Les requêtes utilisent le langage LogQL, qui filtre d’abord par labels (rapide) puis effectue un grep distribué sur le contenu (moins rapide mais bon marché). Cette architecture découple le coût de stockage du coût d’indexation et rend économiquement viable la rétention longue de gros volumes.

La règle d’or est la même que pour les métriques Prometheus : peu de labels, à faible cardinalité. Mettre le request_id en label est une faute classique qui fait exploser l’index. Le request_id doit rester dans le contenu du log, où LogQL pourra le filtrer.

Tempo pour les traces

Tempo stocke les traces sur stockage objet sans index recherchable au sens classique. Il est conçu pour récupérer une trace par trace_id très efficacement et pour servir les requêtes structurées TraceQL. Cette focalisation lui permet d’avaler des volumes que les backends de tracing historiques ne tenaient pas. Pour des explorations plus libres (« montre-moi toutes les traces lentes du service paiement la semaine dernière »), TraceQL et son intégration avec les indexes de spans de service sont la voie naturelle.

Tempo s’intègre nativement avec OpenTelemetry : il ingère OTLP en gRPC ou HTTP, comprend les conventions sémantiques et pilote la corrélation logs/traces dans Grafana sur la base du trace_id.

Mimir pour les métriques

Mimir est un stockage de métriques compatible Prometheus, scalable horizontalement, fondé sur le moteur de requête PromQL. Il accepte aussi les métriques au format OTLP, ce qui évite d’avoir à transformer côté SDK. La version 3 sortie en 2026 a mis l’accent sur la fiabilité et la performance, et reste pilotée comme un service multi-tenant avec stockage objet. Pour beaucoup d’équipes, Mimir remplace un Prometheus mono-instance qui souffrait à mesure que la cardinalité montait.

Grafana, le pivot d’exploration

Grafana est l’interface qui unifie les trois sources. Sa puissance vient des data links et des derived fields, qui permettent de cliquer sur un trace_id dans un log pour ouvrir la trace correspondante dans Tempo, ou de cliquer sur une métrique pour atterrir sur les exemplars liés. C’est cette corrélation qui transforme une stack en plateforme d’observabilité.

Si la stack LGTM ne convient pas — par exemple parce qu’on veut une indexation plein texte plus puissante côté logs ou un stockage métriques plus dense — il existe des alternatives crédibles documentées par ailleurs sur le blog : Quickwit pour les logs en alternative à Elasticsearch, et VictoriaMetrics pour les métriques en alternative haute performance à Prometheus. Toutes deux acceptent OTLP en entrée et coexistent très bien avec OpenTelemetry.

Architecture de référence d’une chaîne d’observabilité

Une chaîne d’observabilité moderne s’organise autour d’une topologie à trois étages. Comprendre cette topologie permet de placer chaque outil au bon endroit et d’éviter les antipatterns.

Au premier étage, l’application instrumentée émet des données via le SDK OpenTelemetry. L’instrumentation automatique couvre les frameworks (HTTP, base de données, broker), l’instrumentation manuelle ajoute des spans et attributs métier là où ils apportent de la valeur. Les données sont exportées en OTLP gRPC vers le composant suivant.

Au deuxième étage, un OpenTelemetry Collector en mode agent tourne sur l’hôte ou en sidecar du pod Kubernetes. Il joue plusieurs rôles : décharger l’application du protocole de transport (l’application n’a plus besoin de connaître l’adresse du backend), enrichir les données avec des attributs de ressource (nom de l’hôte, namespace, version du déploiement), filtrer ou redacter des champs sensibles avant qu’ils ne quittent le périmètre.

Au troisième étage, un Collector en mode gateway centralisé reçoit le flux des agents, applique les politiques globales (sampling tail-based, batching, ré-écriture d’attributs) puis répartit vers les backends : logs vers Loki, traces vers Tempo, métriques vers Mimir. La séparation agent/gateway permet de découpler le cycle de vie des applications de celui des règles d’exploitation.

Cette architecture en chaîne offre des points de contrôle naturels. La redaction de données sensibles (tokens, numéros de téléphone, identifiants) se fait dans la gateway pour garantir une politique uniforme. L’ajout d’attributs d’environnement se fait dans l’agent pour profiter du contexte local. Le sampling tail-based, qui exige de voir l’ensemble d’une trace pour décider de la garder ou la jeter, se fait dans une couche dédiée en aval de la gateway.

Pour les organisations qui exploitent déjà la sécurité runtime de leurs charges Kubernetes, l’observabilité s’articule naturellement avec ces signaux. La corrélation Falco + OpenTelemetry permet par exemple de relier un événement de sécurité runtime au trace_id applicatif qui l’a déclenché, ce qui réduit drastiquement le temps d’investigation lors d’un incident.

Côté cloud public, la même logique s’applique avec des composants managés. Pour les charges hébergées sur AWS, l’observabilité AWS via CloudWatch, X-Ray et Synthetics peut coexister ou se substituer à la stack LGTM, selon les contraintes contractuelles et de souveraineté.

Tutoriels pas-à-pas associés

Cette section sert de carte vers les tutoriels pratiques qui creusent chaque brique. Chacun est un guide pas-à-pas reproductible, avec code testé et configuration minimale.

  • Instrumenter Node.js avec OpenTelemetry — exporter OTLP, instrumentations HTTP et Express, span manuel — lire le tutoriel
  • Instrumenter Python avec OpenTelemetry — auto-instrumentation via opentelemetry-instrument et instrumentation manuelle — lire le tutoriel
  • Instrumenter Go avec OpenTelemetry — TracerProvider, MeterProvider, instrumentations otelhttp et otelgrpc — lire le tutoriel
  • Configurer un OpenTelemetry Collector — receivers OTLP, processors batch et resource, exporters vers backends — lire le tutoriel
  • Envoyer les logs vers Loki via OTLP — endpoint OTLP natif de Loki, conventions de labels, déduplication — lire le tutoriel
  • Envoyer les traces vers Tempo — exporter OTLP gRPC, conventions de spans, vérification dans Grafana — lire le tutoriel
  • Envoyer les métriques vers Mimir — pipeline OTLP, configuration remote_write, alertes PromQL — lire le tutoriel
  • Corréler trace_id entre logs, métriques et traces dans Grafana — derived fields, exemplars, data links — lire le tutoriel
  • Tail-based sampling pour maîtriser les coûts — architecture loadbalancer + tail_sampling, politiques par latence et erreur — lire le tutoriel

Maîtriser les coûts : sampling et cardinalité

Une chaîne d’observabilité non maîtrisée coûte plus cher que l’application qu’elle observe. Deux leviers principaux pilotent la facture : le volume de données ingéré, et la cardinalité des séries qu’on stocke. Les ignorer mène en pratique à un budget multiplié par dix dans les six mois qui suivent la mise en production.

Côté traces, la stratégie qui paie est le tail-based sampling : au lieu de décider au début de la requête s’il faut la conserver (head sampling, à l’aveugle), on attend la fin de la trace et on décide en fonction du résultat. Une politique courante : conserver 100 % des traces qui contiennent au moins un span en erreur, 100 % de celles qui dépassent 500 ms, et un échantillon de 5 % des autres. Cette approche garde tout ce qui est utile à l’investigation et coupe massivement le bruit.

Côté logs, la discipline minimale est de structurer en JSON, de classer les niveaux (DEBUG laissé désactivé en production, INFO modéré, WARN et ERROR conservés intégralement) et de purger sans pitié les champs verbeux qui n’aident jamais aux investigations. La rétention différenciée par tier (logs critiques 90 jours, logs verbeux 7 jours) est un autre levier sous-utilisé.

Côté métriques, la chasse à la cardinalité est un travail régulier. Tout label qui peut prendre plus de quelques milliers de valeurs distinctes doit être audité. Les outils comme cardinality_exporter côté Prometheus ou les rapports natifs de Mimir aident à identifier les séries explosives. Une métrique avec 10 millions de séries actives n’est pas une métrique, c’est un incident en attente.

Erreurs fréquentes à éviter

Mettre des identifiants à haute cardinalité dans les labels

Mettre user_id, request_id ou un UUID dans un label de métrique ou de log Loki est l’erreur la plus commune et la plus coûteuse. Ces valeurs appartiennent au contenu (attributs de span pour une trace, champs JSON pour un log), pas à l’index. La règle simple : si je peux énumérer les valeurs possibles d’un label sur une feuille A4, c’est probablement OK ; sinon, c’est probablement un piège.

Instrumenter manuellement avant d’avoir activé l’auto-instrumentation

Beaucoup d’équipes commencent par écrire des dizaines de spans manuels et oublient que l’auto-instrumentation OTel couvre nativement HTTP, les bases de données et les brokers. Le coût d’opportunité est énorme : on réinvente ce qui est déjà fait, on rate les conventions sémantiques, et on s’expose à des incompatibilités au moment des mises à jour. Toujours commencer par l’auto-instrumentation, mesurer ce qu’il manque, puis n’instrumenter manuellement que la valeur métier.

Confondre trace et log

Émettre un log à chaque étape d’une opération que l’on a déjà tracée est redondant et coûteux. La trace porte la chronologie et les durées ; le log porte les détails contextuels qui n’ont pas leur place comme attribut de span. La règle : un log par événement notable, un span par opération mesurable. Avec l’attribut trace_id automatiquement injecté dans les logs, on retrouve l’un depuis l’autre sans avoir besoin de doublons.

Exporter directement depuis l’application vers le backend

Court-circuiter le Collector en exportant directement vers Tempo ou Mimir paraît plus simple, mais coûte cher dès le premier incident : pas de tampon en cas de coupure réseau, pas de point de configuration centralisé, pas d’enrichissement uniforme. Le Collector n’est pas optionnel dans une architecture sérieuse, c’est le point pivot qui rend l’ensemble exploitable.

Échantillonner les erreurs

Une politique de sampling qui échantillonne les traces en erreur est un autodébranchement de fusible. Toute politique de sampling sérieuse garde 100 % des traces avec un span en erreur. Le coût marginal est faible (les erreurs sont, par définition, minoritaires en production) et la valeur d’investigation est immense.

Ressources et références officielles

FAQ

Faut-il choisir entre Prometheus et OpenTelemetry pour les métriques ?

Non, ces deux outils coexistent. Prometheus est un format d’exposition et un serveur de scrape ; OpenTelemetry est une norme de collecte et de transport. On peut faire scraper par Prometheus une application qui expose ses métriques au format Prometheus tout en envoyant ses traces et logs via OTel. À l’inverse, le SDK OTel peut produire des métriques directement en OTLP vers Mimir sans passer par Prometheus. Les deux approches sont valides ; la seconde simplifie quand on a déjà OTel pour les traces.

L’auto-instrumentation suffit-elle ?

Pour la couverture technique (entrées HTTP, sorties HTTP, requêtes SQL, appels gRPC, opérations broker), oui dans 80 % des cas. Elle ne capture pas les opérations métier internes : un calcul de scoring, un traitement d’agrégation, une logique de validation complexe. Pour ces points, on ajoute des spans manuels là où la valeur métier le justifie.

Faut-il un Collector si je n’ai qu’un seul service ?

Pas strictement, mais c’est tout de même recommandé. Même avec un service unique, le Collector apporte un tampon résilient, un enrichissement homogène, et un point de configuration séparé du cycle de vie applicatif. Le coût d’exploitation est faible, les bénéfices opérationnels sont immédiats dès le premier incident réseau.

Quelle stratégie de sampling pour démarrer ?

Pour un service en début de vie, sampling à 100 % tant que le volume reste sous le coût acceptable. Au moment où la facture commence à inquiéter, on bascule en tail-based avec une politique « tout ce qui erreure, tout ce qui dépasse un seuil de latence, et un échantillon des autres ». L’erreur typique est d’attaquer trop tôt avec du head sampling agressif, ce qui prive d’investigation les premiers incidents en production.

OpenTelemetry remplace-t-il les agents propriétaires existants ?

De plus en plus, oui. La plupart des grands fournisseurs d’observabilité acceptent désormais OTLP en entrée, ce qui permet de passer du SDK OTel vers leur backend sans changer le code applicatif. La migration depuis un agent propriétaire vers OTel est progressive : on peut faire tourner les deux en parallèle sur une période de coexistence, puis couper l’agent historique quand la confiance dans la couverture OTel est établie.

Loki est-il vraiment moins cher qu’Elasticsearch ?

Pour des charges de logs orientées opérations (filtrage par label puis grep dans le contenu), oui, souvent d’un facteur 5 à 10 sur le coût d’infrastructure. Pour des charges orientées recherche full-text complexe (analyse linguistique, scoring, agrégations sophistiquées), Elasticsearch ou Quickwit restent supérieurs. Le bon choix dépend du profil d’usage, pas d’une supériorité absolue.

Sponsoriser ce contenu

Cet emplacement est à vous

Position premium en fin d'article — c'est l'instant où les lecteurs sont le plus engagés. Réservez cet espace pour votre marque, votre formation ou votre offre.

Recevoir nos tarifs
Publicité