Introduction : Pourquoi la surveillance est cruciale pour les applications TypeScript
\nTypeScript est un outil puissant pour créer des applications web évolutives, mais même le code de la plus haute qualité n'est pas à l'abri de pannes en production. Sans système de surveillance, vous risquez d'apprendre l'existence de problèmes par vos utilisateurs, plutôt que par des alertes automatiques. Dans cet article, nous allons parcourir le cycle complet de configuration de la surveillance : de la collecte de métriques à l'envoi de notifications.
\nNous aborderons les trois piliers clés de l'observabilité : les métriques (indicateurs numériques du système), les logs (enregistrements détaillés d'événements) et le tracing (suivi des requêtes). Une attention particulière sera portée à l'intégration avec des outils populaires — Prometheus, Grafana et Sentry.
\n\n1. Métriques principales pour les applications TypeScript
\nAvant de configurer les alertes, il faut déterminer quelles métriques sont critiques pour votre application. Divisons-les en trois groupes :
\n\n1.1 Métriques métier
\nElles reflètent la santé de l'application du point de vue de l'utilisateur :
\n- \n
- Nombre de requêtes par seconde (RPS) — indique la charge sur le serveur \n
- Temps de réponse (latence) — percentiles p50, p95, p99 \n
- Nombre d'erreurs — statuts 4xx et 5xx \n
- Utilisateurs actifs — sessions, connexions WebSocket \n
1.2 Métriques techniques
\nElles montrent l'état de l'infrastructure :
\n- \n
- CPU et Mémoire — charge du processeur et fuites mémoire \n
- Event Loop Lag — retards dans la boucle d'événements Node.js \n
- Garbage Collection — fréquence et durée du ramasse-miettes \n
- HTTP connection pool — nombre de connexions ouvertes \n
1.3 Exemple : collecte de métriques avec Prometheus en TypeScript
\nInstallons la bibliothèque prom-client pour Node.js :
npm install prom-client @types/prom-client\n\nCréons un fichier metrics.ts :
import client from 'prom-client';\nimport express, { Request, Response } from 'express';\n\n// Créer un registre de métriques\nconst register = new client.Registry();\nclient.collectDefaultMetrics({ register });\n\n// Métrique personnalisée : nombre de requêtes HTTP\nconst httpRequestCounter = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code'],\n registers: [register],\n});\n\n// Histogramme du temps de réponse\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duration of HTTP requests in seconds',\n labelNames: ['method', 'route', 'status_code'],\n buckets: [0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// Middleware pour collecter les métriques\nexport function metricsMiddleware(req: Request, res: Response, next: Function) {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n const labels = {\n method: req.method,\n route: req.route?.path || 'unknown',\n status_code: res.statusCode.toString(),\n };\n httpRequestCounter.inc(labels);\n end(labels);\n });\n next();\n}\n\n// Endpoint pour Prometheus\nexport function metricsEndpoint(req: Request, res: Response) {\n res.set('Content-Type', register.contentType);\n res.send(register.metrics());\n}\n\n2. Configuration des alertes : de la théorie à la pratique
\nLes alertes doivent être intelligentes — trop de faux positifs fatiguent l'équipe. Utilisons la règle des "trois sigmas" pour les anomalies et des seuils pour les métriques critiques.
\n\n2.1 Règles d'alerte dans Prometheus
\nCréez un fichier alerts.yml :
groups:\n - name: typescript-app\n rules:\n - alert: HighErrorRate\n expr: |\n rate(http_requests_total{status_code=~"5.."}[5m]) \n / \n rate(http_requests_total[5m]) > 0.05\n for: 2m\n labels:\n severity: critical\n annotations:\n