Surveillance des applications JavaScript : métriques et alertes (niveau avancé)
Les applications JavaScript modernes sur Node.js deviennent de plus en plus complexes : microservices, architectures event-driven, systèmes temps réel. Une simple surveillance "en vie/hors service" ne donne plus une image complète. Pour garantir la stabilité et des performances élevées, une approche avancée est nécessaire : collecte de métriques métier, analyse de la latence, configuration d'alertes intelligentes et observabilité. Dans cet article, nous allons voir comment construire un système de surveillance de niveau avancé en utilisant Node.js, Prometheus et Grafana.
1. Métriques clés pour les applications Node.js
La surveillance commence par le bon choix des métriques. Pour un environnement de production, trois groupes sont critiques :
- Métriques RED (Rate, Errors, Duration) — fréquence des requêtes, nombre d'erreurs, temps de réponse.
- Métriques USE (Utilization, Saturation, Errors) — charge CPU, utilisation mémoire, nombre de descripteurs de fichiers ouverts.
- Métriques métier — nombre d'utilisateurs actifs, taille de la file d'attente des tâches, vitesse de traitement des événements.
Exemple de collecte de métriques avec la bibliothèque prom-client :
const client = require('prom-client');const httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'], buckets: [0.1, 0.3, 0.5, 1, 3, 5]});
app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status_code: res.statusCode }); }); next();});Il est également essentiel de surveiller le garbage collection (GC) et le event loop lag — cela permet de détecter les problèmes de performance avant qu'ils ne deviennent critiques.
2. Configuration des alertes : du simple à l'intelligent
Les alertes ne sont pas de simples notifications de panne serveur. À un niveau avancé, les alertes doivent être :
- Contextuelles — tenir compte de l'heure de la journée, du jour de la semaine, des cycles métier.
- Multi-niveaux — Warning, Critical, Pager.
- Prédictives — basées sur les tendances (par exemple, augmentation de la latence de 20 % en 15 minutes).
Exemple de règle pour Prometheus Alertmanager utilisant la prédiction :
groups: - name: nodejs_alerts rules: - alert: HighErrorRate expr: rate(http_requests_errors_total[5m]) / rate(http_requests_total[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "Taux d'erreurs élevé ({{ $value | humanizePercentage }})" description: "Plus de 5 % des requêtes retournent des erreurs depuis les 2 dernières minutes."
- alert: MemoryLeak expr: predict_linear(nodejs_heap_bytes_used{space="total"}[30m], 3600) > 1e9 for: 5m labels: severity: warning annotations: summary: "Fuite mémoire prévue" description: "L'utilisation du heap pourrait dépasser 1 Go dans une heure."Il est important de configurer la déduplication et le regroupement des alertes pour ne pas submerger l'ingénieur de garde avec des centaines de messages identiques. Utilisez group_wait et group_interval dans la configuration d'Alertmanager.
3. Journalisation avancée : logs structurés et traçage
Le console.log standard ne convient pas à la production. Utilisez une journalisation structurée avec les bibliothèques pino ou winston au format JSON. Cela permet d'analyser facilement les logs et de les intégrer avec des systèmes d'agrégation (ELK, Loki).
Exemple de configuration avec pino :
const pino = require('pino');const logger = pino({ level: process.env.LOG_LEVEL ||