Métriques Prometheus en TypeScript : guide complet
\n\nPrometheus est un système open source de monitoring et d'alerte qui collecte les métriques de vos applications en temps réel. Dans cet article, nous verrons comment intégrer les métriques Prometheus dans les applications TypeScript en utilisant la bibliothèque prom-client. Vous apprendrez à créer, enregistrer et exporter des métriques, ainsi qu'à configurer un endpoint pour la collecte de données.
Que sont les métriques Prometheus ?
\n\nPrometheus fonctionne selon le modèle pull : il interroge périodiquement (scrape) les endpoints de votre application pour obtenir des métriques. Les métriques se divisent en plusieurs types principaux :
\n\n- \n
- Counter (compteur) — ne fait qu'augmenter (ex : nombre de requêtes). \n
- Gauge (jauge) — peut augmenter et diminuer (ex : nombre actuel d'utilisateurs actifs). \n
- Histogram (histogramme) — mesure la distribution des valeurs (ex : temps de réponse). \n
- Summary (résumé) — similaire à l'histogramme, mais calcule les quantiles côté client. \n
Installation de prom-client en TypeScript
\n\nPour travailler avec Prometheus en TypeScript, nous utiliserons la bibliothèque officielle prom-client. Installez-la via npm :
npm install prom-client\n\nInstallez également les types pour TypeScript :
\n\nnpm install @types/prom-client --save-dev\n\nCréation et enregistrement des métriques
\n\nVoici un exemple de base pour créer des métriques. Créons un fichier metrics.ts :
import client from 'prom-client';\n\n// Création d'un registre pour les métriques (par défaut, le registre global est utilisé)\nconst register = new client.Registry();\n\n// Ajout des métriques par défaut (ex : mémoire, CPU)\nclient.collectDefaultMetrics({ register });\n\n// Création d'un Counter pour compter les requêtes\nconst httpRequestsTotal = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'status', 'path'],\n registers: [register],\n});\n\n// Création d'un Gauge pour les connexions actives\nconst activeConnections = new client.Gauge({\n name: 'active_connections',\n help: 'Number of active connections',\n registers: [register],\n});\n\n// Création d'un Histogram pour le 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', 'path'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],\n registers: [register],\n});\n\nexport { register, httpRequestsTotal, activeConnections, httpRequestDuration };\n\nUtilisation des métriques dans une application Express
\n\nCréons maintenant une simple application Express en TypeScript qui utilisera nos métriques :
\n\nimport express from 'express';\nimport { register, httpRequestsTotal, activeConnections, httpRequestDuration } from './metrics';\n\nconst app = express();\nconst port = 3000;\n\n// Middleware pour mesurer le temps de requête\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer({ method: req.method, path: req.path });\n activeConnections.inc();\n\n res.on('finish', () => {\n httpRequestsTotal.inc({ method: req.method, status: res.statusCode.toString(), path: req.path });\n activeConnections.dec();\n end();\n });\n\n next();\n});\n\n// Endpoint pour Prometheus\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// Exemple d'endpoint\napp.get('/', (req, res) => {\n res.send('Hello, Prometheus!');\n});\n\napp.listen(port, () => {\n console.log(`Server running at http://localhost:${port}`);\n});\n\nLancement et vérification
\n\nLancez l'application :
\n\nnpx ts-node app.ts\n\nOuvrez dans