Votre application est une boîte noire ? Il est temps d'y remédier
\n\nAvez-vous déjà pensé : « Pourquoi mon service Node.js ralentit alors que le code est parfait ? » Ou avez-vous reçu une plainte d'un utilisateur sans pouvoir comprendre ce qui n'a pas fonctionné ? Cela vous parle ? Bienvenue dans un monde où, sans observabilité en JavaScript, vous travaillez à l'aveugle.
\n\nL'observabilité n'est pas qu'un mot à la mode. C'est une approche qui transforme votre code d'une boîte noire en un système transparent. Nous apprendrons à lui poser des questions : « Qui est le coupable ? » (traçage), « Que se passe-t-il en ce moment ? » (métriques) et « Que s'est-il passé hier à 3h15 ? » (logs).
\n\nDans cet article, nous aborderons les trois piliers de l'observabilité dans Node.js : le traçage, les métriques et les logs. Vous obtiendrez des exemples de code prêts à l'emploi et comprendrez comment mettre en œuvre ces pratiques dès aujourd'hui. C'est parti !
\n\nTraçage en JavaScript : le voyage d'une requête
\n\nImaginez qu'un utilisateur clique sur le bouton « Passer commande ». Cette requête traverse l'API Gateway, le service d'authentification, le panier, la passerelle de paiement et la base de données. Si quelque chose se casse, où chercher ? Le traçage (ou distributed tracing) vous donne une carte de ce voyage.
\n\nQu'est-ce que le traçage en termes simples
\n\nLe traçage est une méthode pour suivre le chemin d'une requête spécifique à travers tous les microservices et fonctions. Chaque étape est un span, et toute la chaîne est une trace. Vous voyez combien de temps chaque étape a pris et où l'erreur s'est produite.
\n\nOpenTelemetry : le standard pour l'observabilité en JavaScript
\n\nOpenTelemetry (OTel) est le standard industriel pour la collecte de traces, de métriques et de logs. Il est supporté par tous les grands clouds et outils (Jaeger, Zipkin, Grafana).
\n\nInstallation :
\nnpm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node\n\nExemple de base de traçage pour une application Express :
\nconst { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');\nconst { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');\nconst { ConsoleSpanExporter } = require('@opentelemetry/exporter-console');\nconst { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express');\nconst { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');\n\nconst provider = new NodeTracerProvider();\nprovider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));\nprovider.register();\n\nconst { getTracer } = require('@opentelemetry/api');\nconst tracer = getTracer('my-app');\n\n// Traçage automatique HTTP et Express\nconst { registerInstrumentations } = require('@opentelemetry/instrumentation');\nregisterInstrumentations({\n tracerProvider: provider,\n instrumentations: [\n new ExpressInstrumentation(),\n new HttpInstrumentation()\n ]\n});\n\n// Désormais, chaque requête créera une trace avec des spans\nconst express = require('express');\nconst app = express();\n\napp.get('/api/order', async (req, res) => {\n // Span manuel pour la logique métier\n const span = tracer.startSpan('processPayment');\n try {\n // ... votre logique\n await new Promise(r => setTimeout(r, 100)); // simulation\n span.setStatus({ code: 1 }); // OK\n } catch (err) {\n span.setStatus({ code: 2, message: err.message }); // ERROR\n throw err;\n } finally {\n span.end();\n }\n res.send('Order created');\n});\n\napp.listen(3000);\n\nVous verrez désormais dans la console des données structurées : quelle requête, combien de temps chaque middleware a pris, où l'erreur s'est produite. C'est l'observabilité javascript en action.
\n\nMétriques : le pouls de votre application
\n\nLe traçage est utile pour les requêtes individuelles, mais qu'en est-il de la vue d'ensemble ? Combien de requêtes par seconde ? Quelle est la latence ? Combien de mémoire votre Node.js consomme-t-il ? Les métriques répondent à ces questions.
\n\nPrometheus et le client pour Node.js
\n\nPrometheus est le standard de facto pour la collecte de métriques. Il « tire » les données de votre application via HTTP.