Surveillance avancée des applications TypeScript : métriques et alertes
\nDans le développement moderne, la surveillance a dépassé le simple contrôle "le serveur est-il en vie". Pour les applications TypeScript fonctionnant dans des environnements distribués complexes, un système d'observabilité avancé est nécessaire. Il ne suffit pas de simplement journaliser les erreurs — il faut collecter des métriques de performance personnalisées, configurer des alertes intelligentes et construire des tableaux de bord pour une analyse prédictive. Dans cet article, nous verrons comment mettre en œuvre une surveillance professionnelle des applications TypeScript en utilisant des outils modernes et les meilleures pratiques.
\n\n1. Collecte de métriques de performance personnalisées
\nLes métriques de base (CPU, mémoire) ne donnent souvent pas une image complète. Pour les applications TypeScript, les métriques métier et les métriques de temps d'exécution sont cruciales. Voyons comment configurer la collecte de métriques personnalisées à l'aide de la bibliothèque prom-client (client Prometheus pour Node.js).
Types de métriques personnalisées
\n- \n
- Counter (compteur) — pour compter les événements (requêtes, erreurs). \n
- Gauge (jauge) — pour les valeurs qui peuvent augmenter et diminuer (nombre de connexions actives). \n
- Histogram (histogramme) — pour la distribution des valeurs (temps de réponse). \n
- Summary (résumé) — pour les quantiles de temps d'exécution. \n
Exemple : Enregistrement de métriques personnalisées en TypeScript
\nimport 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// Compteur d'erreurs personnalisé\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',\n help: 'Total number of application errors',\n labelNames: ['type', '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'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// Gauge des utilisateurs actifs\nconst activeUsers = new client.Gauge({\n name: 'active_users_count',\n help: 'Number of currently active users',\n labelNames: ['user_type'],\n registers: [register],\n});\n\nconst app = express();\n\n// Middleware pour mesurer le temps des requêtes\napp.use((req: Request, res: Response, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.path, status: res.statusCode });\n });\n next();\n});\n\n// Point de terminaison pour les métriques\napp.get('/metrics', async (req: Request, res: Response) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// Simulation d'erreur\napp.get('/error', (req: Request, res: Response) => {\n errorCounter.inc({ type: 'validation', code: '400' });\n res.status(400).send('Bad Request');\n});\n\napp.listen(3000, () => console.log('Server on port 3000'));\n\n2. Intégration avec Prometheus et Grafana
\nLes métriques collectées doivent être exportées et visualisées. Prometheus interrogera notre point de terminaison /metrics, et Grafana affichera les données sur des tableaux de bord.
Configuration Prometheus pour une application TypeScript
\n# prometheus.yml\nglobal:\n scrape_interval: 15s\nscrape_configs:\n - job_name: 'typescript-app'\n static_configs:\n - targets: ['localhost:3000']\n metrics_path: '/metrics'\n # Ajouter des étiquettes d'environnement\n relabel_configs:\n - source_labels: [__address__]\n target_label: instance\n regex: '([^:]+):.*'\n replacement: '${1}'\n\nRequêtes PromQL avancées pour l'analyse
\n- \n
rate(app_errors_total[5m])— taux d'erreurs sur 5 minutes. \nhistogram_quantile(0.95, rate(http_request_durati