Métriques Prometheus en TypeScript : guide complet de monitoring

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Métriques Prometheus en TypeScript : guide complet

\n\n

Prometheus 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.

\n\n

Que sont les métriques Prometheus ?

\n\n

Prometheus 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
\n\n

Installation de prom-client en TypeScript

\n\n

Pour travailler avec Prometheus en TypeScript, nous utiliserons la bibliothèque officielle prom-client. Installez-la via npm :

\n\n
npm install prom-client
\n\n

Installez également les types pour TypeScript :

\n\n
npm install @types/prom-client --save-dev
\n\n

Création et enregistrement des métriques

\n\n

Voici un exemple de base pour créer des métriques. Créons un fichier metrics.ts :

\n\n
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\n

Utilisation des métriques dans une application Express

\n\n

Créons maintenant une simple application Express en TypeScript qui utilisera nos métriques :

\n\n
import 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\n

Lancement et vérification

\n\n

Lancez l'application :

\n\n
npx ts-node app.ts
\n\n

Ouvrez dans

Recommendations