Métriques Prometheus en TypeScript : guide pratique
Prometheus est un puissant système de surveillance et d'alerte open source. Pour l'intégration avec des applications TypeScript, on utilise la bibliothèque prom-client (Prometheus Client). Elle permet de collecter, agréger et exporter des métriques dans un format compréhensible par le serveur Prometheus. Dans cet article, nous allons détailler comment travailler avec les métriques Prometheus en TypeScript, y compris les types de métriques, des exemples de code et les bonnes pratiques.
Installation et configuration
Pour commencer, installez le package via npm :
npm install prom-clientPour TypeScript, vous devrez également installer les types :
npm install @types/prom-client --save-devAprès l'installation, créez un fichier metrics.ts pour initialiser le client :
import client from 'prom-client';
// Activer la collecte des métriques par défaut (GC, mémoire, processeur)const collectDefaultMetrics = client.collectDefaultMetrics;collectDefaultMetrics({ timeout: 5000 });
// Créer un registre pour stocker les métriquesconst register = client.register;
export { client, register };Principaux types de métriques Prometheus
Prometheus prend en charge quatre types principaux de métriques. Examinons chacun avec des exemples en TypeScript.
1. Counter (Compteur)
Utilisé pour compter des événements qui ne font qu'augmenter (requêtes, erreurs).
import { Counter } from 'prom-client';
const httpRequestsTotal = new Counter({ name: 'http_requests_total', help: 'Nombre total de requêtes HTTP', labelNames: ['method', 'path', 'status_code'],});
// Incrémenter le compteur lors d'une requêtehttpRequestsTotal.inc({ method: 'GET', path: '/api', status_code: 200 });httpRequestsTotal.inc({ method: 'POST', path: '/users', status_code: 201 }, 2); // +22. Gauge (Jauge)
Peut augmenter et diminuer. Utilisé pour les valeurs courantes (mémoire, file d'attente).
import { Gauge } from 'prom-client';
const memoryUsageGauge = new Gauge({ name: 'memory_usage_bytes', help: 'Utilisation actuelle de la mémoire en octets',});
// Définir une valeurmemoryUsageGauge.set(process.memoryUsage().heapUsed);
// Modifier par une deltamemoryUsageGauge.inc(1024); // +1 KomemoryUsageGauge.dec(512); // -512 o3. Histogram (Histogramme)
Mesure la distribution des valeurs (par exemple, le temps de réponse).
import { Histogram } from 'prom-client';
const httpRequestDuration = new Histogram({ name: 'http_request_duration_seconds', help: 'Durée des requêtes HTTP en secondes', labelNames: ['method', 'route'], buckets: [0.1, 0.3, 0.5, 1, 2, 5], // limites des segments});
// Observer une valeurconst start = Date.now();// ... traitement de la requête ...httpRequestDuration.observe( { method: 'GET', route: '/api' }, (Date.now() - start) / 1000);4. Summary (Résumé)
Similaire à l'histogramme, mais calcule les quantiles côté client.
import { Summary } from 'prom-client';
const responseTimeSummary = new Summary({ name: 'response_time_summary_seconds', help: 'Résumé du temps de réponse en secondes', percentiles: [0.5, 0.9, 0.99], // quantiles});
responseTimeSummary.observe(0.42);responseTimeSummary.observe(0.35);Exportation des métriques pour Prometheus
Créez un endpoint /metrics qui fournira les métriques au format texte :
import express from 'express';import { register } from './metrics';
const app = express();
app.get('/metrics', async (req, res) => { try { res.set('Content-Type', register.contentType); res.end(await register.metrics()); } catch (err) { res.status(500).end(err); }});
app.listen(3000, () => console.log('Serveur en cours d\'exécution sur le port 3000'));Maintenant, lors d'une requête GET