OpenTelemetry en 2023
(bit.kevinslin.com)- Lancé en 2019 par la fusion d’OpenTracing et d’OpenCensus, OpenTelemetry s’est imposé en quatre ans comme un standard d’observabilité couvrant traces, métriques et logs
- Son architecture centrale se divise entre spécification et implémentations, fournissant à la fois un référentiel de compatibilité entre vendors et des outils concrets d’instrumentation et de collecte
- La spécification OTEL a stabilisé le tracing en 2020, les métriques en 2021 et les logs en 2023, si bien que tous les signaux sont désormais stable, même si la prise en charge des logs varie encore selon les SDK
- OTLP et le Collector constituent la base commune pour envoyer et traiter les données d’observabilité, et des agents de vendors comme Grafana ou Datadog les implémentent également
- OTEL élargit son périmètre avec le Collector, les Semantic Conventions, OpAMP, OTTL et la Demo, et devient une base commune de l’observabilité neutre vis-à-vis des vendors
La place actuelle d’OpenTelemetry
- OpenTelemetry, ou OTEL, est né en 2019 de la fusion d’OpenTracing et d’OpenCensus
- Au départ centré sur le tracing, le projet a ensuite élargi son champ à l’ensemble de l’observabilité
- Son objectif est d’aider les organisations à fournir une télémétrie de haute qualité, universelle et portable
- Quatre ans plus tard, OTEL dispose des bases suivantes
- des standards stables pour les métriques, les logs et les traces
- un Collector capable de recevoir, traiter et exporter la télémétrie dans n’importe quel environnement
- des SDK permettant l’instrumentation du code dans les principaux langages
- des standards supplémentaires autour des Semantic Conventions et de la gestion des agents
- Aujourd’hui, OTEL est le projet le plus actif de la CNCF après Kubernetes, avec des contributeurs répartis parmi les principaux vendors de l’observabilité, et son protocole est désormais adopté presque universellement parmi les fournisseurs d’observabilité
Une architecture OTEL divisée entre spécification et implémentations
- OTEL se compose principalement de la spécification (specification) et des implémentations (implementation)
- La spécification définit la manière de capturer, collecter, traiter et exporter la télémétrie
- elle s’apparente à un standard commun que les vendors doivent suivre pour être compatibles avec OTEL
- Les implémentations sont des bibliothèques clientes et des outils qui manipulent les données de télémétrie
- c’est la partie à laquelle les utilisateurs finaux sont directement confrontés lorsqu’ils instrumentent leur code
- La stabilité du projet est généralement indiquée par signal
- dans OTEL, un signal désigne un type de donnée de télémétrie comme les métriques, les logs ou les traces
- Les principaux sous-projets sont les suivants
- OpenTelemetry Specification
- OpenTelemetry SDKs
- OpenTelemetry Protocol
- OpenTelemetry Collector
- Open Agent Management Protocol
- OpenTelemetry Semantic Conventions
OpenTelemetry Specification 1.24.0
- OpenTelemetry Specification constitue la base d’OTEL et fournit les API, SDK et modèles de données qui servent de fondation aux autres standards OTEL
- La stabilisation progresse par signal
- septembre 2020 : tracing stable
- novembre 2021 : métriques stable
- avril 2023 : logs stable
- À ce jour, la spécification OTEL est stable pour tous les signaux
- Le signal de logs n’ayant été stabilisé qu’en 2023, de nombreux SDK OTEL ne prennent pas encore en charge les logs
SDK OpenTelemetry et auto-instrumentation
- Le SDK OTEL fournit l’instrumentation côté client basée sur la spécification OTEL
- Chaque SDK selon le langage possède son propre niveau de maturité pour les signaux métriques, logs et traces
- Certains SDK prennent en charge l’auto-instrumentation (auto instrumentation) selon le langage de programmation
- l’auto-instrumentation consiste à laisser le SDK injecter automatiquement des signaux dans le code applicatif, principalement des traces, afin de réduire la charge d’instrumentation manuelle
- Dans des langages compilés comme
goetrust, l’auto-instrumentation ne fonctionne pas - En revanche, en dehors du SDK, des outils basés sur eBPF ou sur un service mesh permettent d’obtenir une injection automatique des traces
OTLP 1.0 et le standard de transport des données
- OTLP est un protocole wire commun destiné au transport des données d’observabilité
- Il existe deux modes de transport officiels
- HTTP et Protocol Buffers
- gRPC
- Cette spécification est considérée comme stable et peut être implémentée dans tout service qui reçoit, traite et exporte des données OTEL
- OTLP est implémenté par l’OpenTelemetry Collector, ainsi que par les agents de vendors de l’observabilité comme Grafana et Datadog
OpenTelemetry Collector 0.83.0
- Le OTEL Collector est un agent neutre vis-à-vis des vendors qui collecte, transforme et transmet les données d’observabilité
- Le Collector est composé des éléments suivants
- receivers : reçoivent des données depuis plusieurs sources en mode push/pull
- processors : transforment, filtrent, enrichissent ou dérivent les données en transit
- exporters : envoient les données vers des destinations downstream
- connectors : agissent à la fois comme receiver et exporter et relient plusieurs pipelines
- pipelines : chaînes composées d’un receiver, de zéro ou plusieurs processors, puis d’un exporter
- extensions : fournissent des fonctions hors traitement de télémétrie, comme basic auth ou health check
- Ensemble, ces composants forment un pipeline d’observabilité capable de collecter la télémétrie depuis n’importe quelle source, de la traiter en transit, puis de l’envoyer vers la destination voulue
- Le Collector se divise en deux projets
- otel-collector : ne contient que les composants de base du Collector et regroupe surtout la logique directement liée au traitement des données OTLP
- otel-collector-contrib : ensemble d’intégrations incluant les exporters et receivers pour la plupart des fournisseurs d’observabilité
- Au moment de la rédaction,
otel-collector-contribcomprend 91 receivers, 48 exporters et 24 processors - Il est recommandé aux utilisateurs finaux d’utiliser OpenTelemetry Collector Builder pour créer une version personnalisée de
otel-collector-contribne contenant que les composants nécessaires - Des vendors comme AWS et Splunk proposent aussi leurs propres distributions OTEL
OpAMP et la gestion distante des agents
- OpAMP est un protocole réseau pour la gestion distante des agents
- C’est un standard relativement récent, ajouté à OTEL en 2022, qui fournit une méthode neutre vis-à-vis des vendors pour contrôler un ensemble d’agents
- Les agents gérés peuvent être des instances de
otel-collectorou des agents propriétaires de vendors implémentant OpAMP - OpAMP permet d’activer les fonctions suivantes
- déploiement dynamique de configuration
- mise à jour des agents
- gestion des identifiants
- À l’heure actuelle, l’implémentation Go de la spécification OpAMP est encore en cours de développement
Semantic Conventions et projets supplémentaires
- Les OTEL Semantic Conventions définissent un ensemble commun d’attributs pour les données d’observabilité
- Leur champ d’application couvre notamment les ressources cloud, les bases de données, les exceptions et les systèmes
- Les Semantic Conventions sont utilisées par les SDK OTEL et s’appliquent automatiquement dans les SDK prenant en charge l’auto-instrumentation
- Une sémantique commune permet la corrélation entre différents signaux
- D’autres composants majeurs d’OTEL existent également
- OpenTelemetry Transformation Language (OTTL) : un langage commun de transformation pour la télémétrie, conçu et implémenté dans
otel-collector-contribavec un accent sur les performances et la flexibilité - OTEL Demo : un site e-commerce basé sur des microservices qui présente les fonctionnalités d’OTEL et la plupart de ses SDK pour différents langages
- OpenTelemetry Transformation Language (OTTL) : un langage commun de transformation pour la télémétrie, conçu et implémenté dans
Quatre années de transformation
- OTEL est passé d’une fusion de spécifications de tracing concurrentes à un standard industriel de l’observabilité
- Ces quatre dernières années ont servi à construire une base commune à l’échelle des vendors et des outils
1 commentaires
Avis sur Hacker News
OpenTelemetry a deux problèmes
Dans le même esprit, je voulais implémenter un simple heartbeat pour comprendre l’usage d’une application de bureau, et vu le nom du projet, c’était étonnamment proche de l’impossible. Il y a eu peu de réactions aux questions, donc j’ai complètement abandonné l’idée d’utiliser OpenTelemetry : https://github.com/open-telemetry/community/discussions/1598, https://github.com/open-telemetry/semantic-conventions/issue...
Par exemple, on ne peut pas définir les buckets à proximité de l’endroit où l’on définit un histogramme. Il faut passer, à un endroit comme un exportateur global, une liste d’« overrides » qui associe les noms d’histogrammes aux buckets. Si une bibliothèque émet des métriques, cela devient très sale : https://github.com/open-telemetry/opentelemetry-go/issues/38...
Même sur les sites des entreprises leaders de l’observabilité, les articles sur l’instrumentation personnalisée font à peine quatre pages et ne couvrent que des notions très basiques. OTel n’est pas particulièrement en retard ; la réponse est généralement proche de « ça dépend ». Avec l’expérience, on peut démêler ces points qui déroutent les débutants
J’aime beaucoup OpenTelemetry et je veux tracer presque tous les spans. Si j’avais utilisé un fournisseur, les coûts m’auraient mis en faillite
Avec l’instrumentation automatique Java, j’ai ajouté OpenTelemetry presque sans effort, et je l’envoie vers un ClickHouse auto-hébergé qui stocke plus de 700 millions de spans par jour sur une EC2 à 100 dollars : https://clickhouse.com/blog/how-we-used-clickhouse-to-store-...
Avec une rétention des traces d’un mois,
signoz_index_v2compte 26,9 millions de lignes pour 17.06GiB,trace_log123 millions de lignes pour 2.64GiB, etsamples_v2environ 949 millions de lignes pour 345MiB, donc la compression est bonne. Si j’avais utilisé une machine ClickHouse conforme aux recommandations, j’aurais réduit le temps passé au tuning, mais même ainsi cela fonctionne bienL’inconvénient, c’est que les IOPS du petit disque sc1 sont autour de 4, donc ClickHouse met environ 5 minutes à démarrer, et l’UI de SigNoz est suffisamment fonctionnelle, mais il ne faut pas s’attendre au niveau de polish de Datadog
Dans mon ancien poste, nous ne collections que 5 % des traces qui n’étaient pas des erreurs
OpenTelemetry m’a fortement déçu. D’après mon expérience, c’est un amas confus sur-conçu, et l’expérience d’utilisation par défaut est très hostile à l’utilisateur.
Le projet se présente comme un format universel de traces/métriques/logs et comme un ensemble de bibliothèques plug-and-play avec des adaptateurs pour tout ce dont on a besoin, mais en réalité cela ressemble plutôt à un ensemble de bibliothèques incomplètes, dont l’implémentation interne fuit beaucoup, avec des adaptateurs de mauvaise qualité et pas tant de fonctionnalités que ça.
Beaucoup de fonctionnalités viennent avec des conditions du genre : quand, où, combien, sous quelle phase de la lune, quand Jupiter est visible dans le ciel, et pour quelle longueur de chaîne elles fonctionnent.
Cela dit, si l’on fait abstraction des API de SDK qui fuient et des fonctionnalités à moitié implémentées, la promesse de remplaçabilité est tenue dans une certaine mesure. Avant OTel, tout relevait de piles propriétaires ; maintenant, on peut brancher un autre backend de logging sur un SDK standard et s’attendre à ce que ça fonctionne globalement. C’est moins bien qu’une pile intégrée verticalement, mais cela permet une concurrence et une évolution par morceaux sans devoir remplacer toute la pile d’observabilité ; du point de vue architectural, c’est donc une victoire partielle.
L’exemple se contente de montrer comment parser la spécification OpenAPI (https://github.com/openzipkin/zipkin-api/blob/master/zipkin2...) avec des outils Swagger, générer automatiquement du code de liaison en Go, puis enregistrer une trace en appelant une fonction générée automatiquement.
Il n’y avait absolument aucune documentation ni autre exemple, si bien que je me suis demandé si quelqu’un utilisait réellement cette approche ; au final, j’ai fini par utiliser directement l’API du service (https://zipkin.io/zipkin-api/#/) via des appels REST. OTel est pénible, mais les alternatives ne sont pas meilleures. À mesure que la mesure des SLO et des SLI devient plus importante, j’aimerais que ce domaine suscite davantage d’intérêt.
Les bibliothèques officielles OTel ne fonctionnent pas encore très bien côté frontend web. Par exemple, dans leur état par défaut, il n’y a aucun moyen de relier les erreurs aux source maps.
Le collecteur pour navigateur web publié par le projet OTel utilise Zone.js pour intercepter en contexte presque tout ce qui se passe dans le navigateur. Si vous avez utilisé Angular récent, vous savez que Zone.js peut parfois être assez douloureux et, en touchant au global, produire des comportements difficiles à prévoir.
Je ne sais pas non plus ce qu’il en est d’un standard OTel pour des choses comme le session replay. Beaucoup de plateformes de télémétrie comme Sentry, Rollbar ou DataDog le prennent en charge. Les équipes backend semblent plutôt l’apprécier, et j’aime le fait que les spans puissent traverser les frontières et permettre de suivre tout le système via des tags uniques. En revanche, les payloads générés sont parfois très verbeux, alors que certaines plateformes de logging sont plus compactes. En pratique, cela ne m’a pas semblé être un gros problème.
J’ai aussi essayé l’instrumentation manuelle, mais c’était sujet aux erreurs et verbeux. Les navigateurs auraient vraiment besoin de quelque chose comme https://nodejs.org/api/async_context.html#class-asynclocalst....
Dans notre package, nous ajoutons du session replay, un meilleur suivi des exceptions, etc. par-dessus l’implémentation du SDK navigateur Otel/Splunk. Malheureusement, ce genre de choses est loin d’être fourni par défaut. Cela dit, je pense que le fait de pouvoir relier une session frontend aux traces/logs backend a beaucoup changé l’expérience développeur : https://www.hyperdx.io/blog/browser-based-distributed-tracin...
Elle ne résout pas complètement le problème, mais constitue un point de départ.
Je me demande s’il y a des gens qui ont ne serait-ce que commencé à faire du tracing frontend.
Avec quelques collègues, on a eu cette idée un peu saugrenue qu’on n’avait plus besoin de logs. Il suffit d’ajouter des événements de span à la place des messages de log : https://opentelemetry.io/docs/instrumentation/ruby/manual/#a...
Ensuite, on ne logue que le titre du span et le lien vers le span correspondant dans Jaeger. Je ne l’ai essayé que sur des projets personnels, mais ça m’a semblé plutôt bien ; simplement, j’aimerais que l’interface de Jaeger prenne mieux en charge ce type d’usage
En fait, ces collègues ont même fait une présentation sur le sujet. Si vous êtes près de Hanovre, en Allemagne, cherchez « Nie wieder Log-Files! » sur https://javaforumnord.de/2023/programm/
Utiliser des spans pour toutes les actions significatives revient un peu à utiliser des logs structurés plus puissants. C’est difficile pour beaucoup de systèmes qui doivent conserver les logs existants en parallèle, mais si le projet est suffisamment greenfield, je le recommande
Pour utiliser des traces, il y a beaucoup de choses qui doivent fonctionner correctement. Ou alors c’est peut-être simplement que je manque encore d’expérience et que les outils m’intimident
Quand j’ai vu la présentation il y a quelques années, j’ai trouvé ça excellent, mais il me semblait que ce serait très difficile de convaincre des développeurs qui ne sont pas SRE : https://github.com/stripe/veneur
OpenTelemetry est un projet mené par le marketing, conçu naïvement et inefficacement façon comité, et il semble surtout avoir pour objectif de permettre aux CTO du Fortune X00 de cocher une case dans leurs documents de feuille de route stratégique
Ce n’est pas quelque chose que quelqu’un qui a le choix devrait utiliser
Voici un exemple de changement que nous avons soumis : https://github.com/open-telemetry/opentelemetry-js/pull/4049
J’aimerais que vous expliquiez pourquoi, selon vous, personne ne devrait l’utiliser
Datadog a effectivement mobilisé beaucoup de personnes pour ajouter le support de Datadog à des projets OSS. Se plonger dans des bases de code inconnues est une compétence puissante, donc ça a peut-être été plutôt bon comme début de carrière
OTel pousse les projets open source à utiliser une couche d’abstraction, ce qui permet aux utilisateurs d’acheter une solution plutôt que de l’auto-héberger. Je n’en suis pas particulièrement fan, mais pour des services exploités par des gens en dehors de mon entreprise, j’envisagerais désormais OTel. Parce que si un utilisateur veut utiliser Datadog, nous ne serons pas ceux qui l’en empêchent
Quand j’ai utilisé OTel à ses tout débuts, l’API Go était très inefficace, ce qui m’avait déçu. Il fallait un
context.Contextpour incrémenter un compteur, et les abstractions fuyaient, par exemple sans moyen de configurer les buckets d’histogramme lors de l’export vers Prometheus. J’imagine que c’est probablement corrigé maintenantLe processeur est aussi assez capable, et l’ensemble contrib de receivers et d’exporters est globalement correct. Je ne dis pas que c’est la meilleure solution, cela dépend des cas d’usage, mais une critique aussi forte ne me paraît pas justifiée. Pour contexte, je fais partie de l’équipe de maintenance de fluent-bit
Du point de vue opérations, quelle que soit l’observabilité que les développeurs ajoutent au code, on peut imposer un filtrage centralisé, et l’application n’a besoin de parler qu’à un seul point d’entrée central
Comme tout exporte de l’OTLP, quand on veut passer à un nouveau backend, il suffit de modifier un fichier YAML, sans réécrire les applications pour prendre en charge un nouveau backend de logs. Plutôt que de revenir à l’ancienne approche avec des bibliothèques de logging propres à chaque fournisseur, malgré ses défauts, je continuerais à choisir OTEL 10 fois sur 10
Je déteste vraiment la popup d’abonnement de ce blog. Il n’y a pas de bouton
x, donc il n’est pas du tout évident qu’on puisse la fermer sans donner son e-mailSous le bouton d’abonnement, il y a un « continue reading » très peu intuitif ; je ne pensais pas que ça fonctionnerait, et cliquer à l’extérieur ne fermait pas la popup. Ce genre de chose devrait être amélioré
Côté OpenTelemetry, cela fait longtemps que je voulais tester s’il fournit toutes les fonctionnalités nécessaires pour envoyer les données vers Datadog. Mais si, en plus des fonctions de base, il faut toujours l’agent Datadog, cela fait encore une chose de plus à gérer et à expliquer, donc j’hésite
Je me demande si quelqu’un l’a vraiment raccordé à Datadog. Le but n’est pas forcément de rester lié à Datadog, mais comme une bonne partie de nos alertes et de nos logs y sont actuellement, passer d’abord à OpenTelemetry devrait théoriquement nous permettre de migrer vers autre chose plus tard
Quand j’ai appuyé sur retour, ça m’a renvoyé sur HN
Je me demande s’il existe encore un frontend qui ne rogne pas fortement les flux de revenus en termes de coûts de personnel, d’infrastructure et de licences
Quand on reçoit plus de 2 000 requêtes par seconde, conserver seulement les logs coûte déjà cher
Nous exploitons notre propre stack Jaeger avec un sampling de 0,1 %, et par rapport à Datadog APM, le coût est négligeable
Pour les métriques et les logs, le sampling n’est pas très utile, donc il n’y a pas de bonne réponse. Si la marge brute de Datadog est de 80 %, les coûts d’infrastructure représentent au maximum 20 % de ce que vous payez, et si vos coûts de personnel sont inférieurs à ces 80 %, vous pouvez réduire fortement les coûts en exploitant vous-même une stack open source. Même avec Datadog, on mène tous les trois mois un projet de réduction d’usage, donc de toute façon il faut continuer à s’en occuper
Le coût est un problème, mais vous pourriez être surpris de voir à quel point l’observabilité pèse plus lourd qu’on ne l’imagine sur un service. Ça consomme pas mal de CPU
J’avais aussi écrit quelques requêtes Elasticsearch pour produire des rapports de base permettant de trouver les requêtes lentes. En suivant les tutoriels OTEL/Jaeger, c’est une configuration assez standard
Le volume était de quelques centaines de traces par seconde, et nous les collections toutes sans downsampling. La rétention pouvait être configurée à 7 jours, et au moment de mon départ il y avait eu très peu d’optimisation réelle. Le coût mensuel devait être de l’ordre de quelques dizaines à quelques centaines de dollars
On peut définir le comportement du sampler de tracing via des variables d’environnement configurables sur les conteneurs. Voir
OTEL_TRACES_SAMPLERdans la documentation : https://opentelemetry.io/docs/specs/otel/configuration/sdk-e...Nous utilisons actuellement Datadog, mais tout le monde sait que c’est beaucoup trop cher
La majeure partie de ce fil parle d’envoyer les métriques/logs avec OpenTelemetry vers des tâches de collecteurs auto-hébergées
Utiliser une bibliothèque standard prise en charge par plusieurs outils de collecte comme ClickHouse est déjà utile en soi, mais un autre avantage est que la spécification permet de transmettre les ID de trace au-delà des frontières des systèmes
Si vous et vos dépendances implémentez tous la spécification OpenTelemetry, vous pouvez obtenir des spans qui montrent finement ce qui s’est passé tout au long du parcours. Par exemple, vous pouvez savoir si le chargement lent d’une page était dû au chargement de pages disque dans la base de données, ou si un span du plan de métadonnées d’un service cloud était la cause d’une latence élevée
Je suis très satisfait des progrès d’OpenTelemetry. Quand j’ai poussé son adoption il y a quelques années, les développeurs hésitaient en disant que c’était nouveau et qu’ils n’en avaient jamais entendu parler, mais quand j’y suis revenu il y a un an, OpenTelemetry était partout dans nos systèmes, et le fournisseur de logs/traçabilité que nous utilisions était aussi en train de migrer dans cette direction