Introduction : Pourquoi la surveillance avancée est une nécessité pour Node.js
\nDans le développement web moderne, la surveillance a dépassé le cadre de la simple journalisation des erreurs. Pour les applications Node.js critiques — des microservices aux API à forte charge — une collecte proactive de métriques, des alertes intelligentes et une visualisation des données sont nécessaires. Au niveau avancé, on ne parle pas simplement de "l'application est vivante", mais de ses performances, de ses goulots d'étranglement et de la prédiction des pannes.
\nDans cet article, nous allons voir comment construire un système de surveillance complet pour une application JavaScript (Node.js) : de la collecte de métriques personnalisées à la configuration d'alertes via Prometheus et Grafana. Vous apprendrez à utiliser les capacités intégrées de Node.js et les bibliothèques modernes pour un suivi proactif de l'état du service.
\n\n1. Collecte de métriques avancées : de l'Event Loop aux compteurs personnalisés
\nUne métrique de base est le temps de réponse du serveur. Une métrique avancée est le délai de l'Event Loop, le nombre de descripteurs actifs et la fréquence du garbage collection. Voyons comment collecter ces données à l'aide de process et de la bibliothèque prom-client (client pour Prometheus).
1.1. Métriques de l'Event Loop et ressources système
\nNode.js est monothread, donc le délai de l'Event Loop est critique. On le mesure via process.hrtime() et on l'exporte sous forme d'histogramme.
const client = require('prom-client');\nconst eventLoopDelay = new client.Histogram({\n name: 'nodejs_event_loop_delay_seconds',\n help: 'Délai de l\\'Event Loop en secondes',\n buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1]\n});\n\nfunction measureEventLoop() {\n const start = process.hrtime.bigint();\n setImmediate(() => {\n const duration = Number(process.hrtime.bigint() - start) / 1e9;\n eventLoopDelay.observe(duration);\n });\n}\nsetInterval(measureEventLoop, 5000);\n\n1.2. Métriques personnalisées de la logique métier
\nEn plus des métriques système, suivez les indicateurs métier : le nombre de commandes traitées, les erreurs de validation, le temps d'exécution des requêtes externes.
\nconst orderCounter = new client.Counter({\n name: 'app_orders_total',\n help: 'Nombre total de commandes traitées',\n labelNames: ['status'] // success, failed\n});\n\n// Exemple d'utilisation dans un gestionnaire\napp.post('/api/order', async (req, res) => {\n try {\n await processOrder(req.body);\n orderCounter.inc({ status: 'success' });\n res.send('OK');\n } catch (err) {\n orderCounter.inc({ status: 'failed' });\n res.status(500).send('Error');\n }\n});\n\n2. Export des métriques et intégration avec Prometheus
\nPour que Prometheus puisse collecter les métriques, il faut créer un endpoint /metrics. On utilise le registre standard de prom-client.
2.1. Création de l'endpoint de collecte
\nconst express = require('express');\nconst app = express();\nconst client = require('prom-client');\n\n// Collecte des métriques standard de Node.js\nclient.collectDefaultMetrics({ timeout: 5000 });\n\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', client.register.contentType);\n res.end(await client.register.metrics());\n});\n\napp.listen(3000, () => console.log('Serveur de métriques sur :3000'));\n\n2.2. Configuration de Prometheus
\nDans le fichier prometheus.yml, ajoutez une cible pour votre application :
scrape_configs:\n - job_name: 'nodejs-app'\n static_configs:\n - targets: ['localhost:3000']\nAprès le redémarrage de Prometheus, les métriques seront collectées toutes les 15 secondes par défaut.
\n\n3. Configuration des alertes : des seuils simples à l'analyse des anomalies
\nLes alertes sont une réaction au dépassement des seuils normaux des métriques. Au niveau avancé, on utilise PromQL pour des conditions complexes et on configure les règles dans Alertmanager.
\n\n3.1. Règles d'alerte de base
\nCréez un fichier alerts.yml :
Blogs
Book Recommendations
Lire aussi
Travail avec WebAssembly et Rust : niveau avancé d'optimisation et d'intégration
Mise en cache en Java : Redis, Memcached et solutions intégrées pour les pros
Tests d'intégration Java avec Docker : techniques avancées
Journalisation en PHP : meilleures pratiques pour débutants
Meilleurs IDE et outils pour le développement JavaScript en 2025