La premiĂšre fois que vous avez vraiment besoin dâobservabilitĂ©, ce nâest pas lorsque vous regardez calmement un tableau de bord. C'est lorsqu'un utilisateur Ă©crit « le paiement est lent », que le graphique d'erreur semble normal et que dans les journaux, vous ne trouvez qu'une rangĂ©e de messages dĂ©connectĂ©s.
OpenTelemetry a Ă©tĂ© créé pour Ă©viter ce moment : non pas pour avoir plus de graphiques, mais pour relier les piĂšces. Une requĂȘte entre dans le API, appelle une base de donnĂ©es, passe par un fournisseur externe, publie une tĂąche en file d'attente et peut Ă©chouer trois services plus tard. Sans traçage distribuĂ©, vous reconstruisez cette histoire Ă la main. Avec OpenTelemetry au moins vous avez une carte.
Le problĂšme n'est pas le trace, c'est l'histoire
Un trace est une séquence de span. Dit comme ça, ça fait froid. En pratique, chaque span est un morceau de l'histoire : POST /checkout, SELECT inventory, call payment provider, publish order.created.
La valeur vient lorsque vous commencez à répondre à de vraies questions :
- quel service externe ralentit ?
- les erreurs proviennent-elles d'une version spécifique ?
- le problĂšme concerne-t-il tout le monde ou un seul locataire ?
- une nouvelle tentative cache-t-elle un délai d'attente ?
- le travail asynchrone démarre mais meurt ensuite ailleurs ?
Ces questions ne peuvent pas ĂȘtre rĂ©solues par un console.log lancĂ© Ă la hĂąte. En effet, souvent le journal ajoutĂ© en cas d'urgence vous aide aujourd'hui et devient du bruit demain.
Comment pourrais-je mettre cela dans une application Node.js
La configuration la plus saine est simple : l'application produit la tĂ©lĂ©mĂ©trie, le Collector dĂ©cide oĂč l'envoyer.
Node.js app -> OpenTelemetry Collector -> backend di observability
Pourquoi ne pas exporter directement vers le fournisseur ? Parce qu'au début, cela semble plus rapide, vous réalisez ensuite que chaque service a des configurations différentes, des tentatives différentes, des filtres différents et aucun point central pour supprimer les données sensibles ou changer de destination.
Le Collector est ennuyeux dans tous les sens du terme. Il reçoit OTLP, effectue le traitement par lots, peut filtrer, effectuer des échantillonnages, ajouter des attributs communs et exporter vers plusieurs systÚmes.
Auto-instrumentation : bien, mais pas suffisant
En Node.js, je commencerais par l'auto-instrumentation. Il vous offre une visibilité immédiate sur HTTP, les frameworks pris en charge, les bases de données et les bibliothÚques communes.
npm install @opentelemetry/sdk-node \ @opentelemetry/auto-instrumentations-node \ @opentelemetry/exporter-trace-otlp-http
Ensuite, vous initialisez le SDK avant le reste de l'application :
import { NodeSDK } from '@opentelemetry/sdk-node'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; const sdk = new NodeSDK({ traceExporter: new OTLPTraceExporter({ url: process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, }), instrumentations: [getNodeAutoInstrumentations()], }); sdk.start();
Cependant, cela concerne le cadre, pas votre produit. Il sait que vous avez effectuĂ© une requĂȘte, mais il ne sait pas que cette requĂȘte Ă©tait dans « ordre de crĂ©ation » ou « renouvellement d'abonnement ». Pour cela, vous avez besoin de span manuels aux points oĂč la domination compte.
const span = tracer.startSpan('checkout.create_order'); try { span.setAttribute('cart.items_count', input.items.length); const order = await createOrder(input); span.setAttribute('order.id', order.id); return order; } catch (error) { span.recordException(error as Error); throw error; } finally { span.end(); }
Je ne mettrais les manuels span nulle part. Je les mettrais lĂ oĂč, Ă trois heures du matin, j'aimerais comprendre ce qui s'est passĂ© sans lire la moitiĂ© de la base de code.
Trois rÚgles qui évitent beaucoup de chaos
PremiÚre rÚgle : chaque service doit avoir service.name, environnement et version. Cela semble trivial, mais sans ces attributs, un trace est beaucoup moins utile. Lorsqu'un déploiement interrompt quelque chose, vous souhaitez filtrer par version en deux secondes.
DeuxiĂšme rĂšgle : ne mettez pas de donnĂ©es sensibles dans les attributs. Les e-mails, les jetons, les charges utiles entiĂšres et les adresses ne doivent pas se retrouver par accident dans un backend dâobservabilitĂ©. Si vous devez identifier un utilisateur, envisagez les identifiants internes, le hachage ou les champs moins sensibles.
TroisiÚme rÚgle : faites attention à la cardinalité. user.id comme attribut de trace peut avoir du sens. En tant qu'étiquette métrique, elle peut détruire vos coûts et vos performances.
Métriques : peu nombreuses, mais bonnes
Je commencerais par des mesures trÚs pratiques :
- tarifs, erreurs et durée des demandes ;
- latence des dépendances externes ;
- nombre de délais d'attente et de tentatives ;
- profondeur des queues ;
- durée du travail ;
- pourcentage d'erreurs par version.
Le reste est ajouté en cas de besoin. Les tableaux de bord remplis de graphiques que personne ne regarde sont des meubles, pas des observables.
Logs : toujours utiles, mais liés
Les journaux ne disparaissent pas. Ils deviennent simplement beaucoup plus utiles lorsqu'ils portent trace_id et span_id. Vous pouvez donc partir d'un journal d'erreurs et ouvrir le trace, ou partir d'un trace lent et lire uniquement les journaux produits dans ce chemin.
Sans corrélation, vous recherchez des aiguilles. Avec la corrélation, au moins vous savez dans quel tiroir regarder.
La checklist que j'utiliserais avant de dire "nous sommes couverts"
- Le trace traverse en fait plusieurs services.
- Les journaux incluent
trace_idetspan_id. - Le Collector est configuré avec des limites de traitement par lots et de mémoire.
- Les erreurs sont enregistrées en span.
- Il existe une politique d'échantillonnage.
- Les métriques ont une cardinalité contrÎlée.
- Les données sensibles sont filtrées.
- Les alertes partent des symptÎmes de l'utilisateur et non de graphiques aléatoires.
Conclusion
OpenTelemetry ne rĂ©sout pas Ă lui seul les problĂšmes de production. Mais la façon dont vous les gĂ©rez change. Au lieu d'ajouter aveuglĂ©ment des journaux, vous commencez Ă suivre le chemin rĂ©el d'une requĂȘte.
Pour moi, le signe que ça marche est simple : quand quelque chose arrive, l'Ă©quipe arrĂȘte de se demander « oĂč cherche-t-on ? et commence Ă demander "pourquoi ce morceau est-il lent ?". C'est lĂ que l'observabilitĂ© devient un outil et non un ensemble de tableaux de bord.
##Sources