Métricas de Prometheus en TypeScript: guía práctica
Prometheus es un potente sistema de monitoreo y alerta de código abierto. Para la integración con aplicaciones TypeScript se utiliza la biblioteca prom-client (Prometheus Client). Esta permite recopilar, agregar y exportar métricas en un formato comprensible para el servidor Prometheus. En este artículo, analizaremos en detalle cómo trabajar con métricas de Prometheus en TypeScript, incluyendo tipos de métricas, ejemplos de código y mejores prácticas.
Instalación y configuración
Para comenzar, instale el paquete a través de npm:
npm install prom-clientPara TypeScript también será necesario instalar los tipos:
npm install @types/prom-client --save-devDespués de la instalación, cree un archivo metrics.ts para inicializar el cliente:
import client from 'prom-client';
// Habilitamos la recopilación de métricas predeterminadas (GC, memoria, CPU)const collectDefaultMetrics = client.collectDefaultMetrics;collectDefaultMetrics({ timeout: 5000 });
// Creamos un registro para almacenar las métricasconst register = client.register;
export { client, register };Tipos principales de métricas de Prometheus
Prometheus admite cuatro tipos principales de métricas. Veamos cada uno con ejemplos en TypeScript.
1. Counter (Contador)
Se utiliza para contar eventos que solo aumentan (solicitudes, errores).
import { Counter } from 'prom-client';
const httpRequestsTotal = new Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'path', 'status_code'],});
// Incrementamos el contador al realizar una solicitudhttpRequestsTotal.inc({ method: 'GET', path: '/api', status_code: 200 });httpRequestsTotal.inc({ method: 'POST', path: '/users', status_code: 201 }, 2); // +22. Gauge (Indicador)
Puede aumentar y disminuir. Se utiliza para valores actuales (memoria, cola).
import { Gauge } from 'prom-client';
const memoryUsageGauge = new Gauge({ name: 'memory_usage_bytes', help: 'Current memory usage in bytes',});
// Establecemos el valormemoryUsageGauge.set(process.memoryUsage().heapUsed);
// Cambiamos por deltamemoryUsageGauge.inc(1024); // +1KBmemoryUsageGauge.dec(512); // -512B3. Histogram (Histograma)
Mide la distribución de valores (por ejemplo, tiempo de respuesta).
import { Histogram } from 'prom-client';
const httpRequestDuration = new Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route'], buckets: [0.1, 0.3, 0.5, 1, 2, 5], // límites de los segmentos});
// Observamos el valorconst start = Date.now();// ... procesamiento de la solicitud ...httpRequestDuration.observe( { method: 'GET', route: '/api' }, (Date.now() - start) / 1000);4. Summary (Resumen)
Similar al histograma, pero calcula los cuantiles en el lado del cliente.
import { Summary } from 'prom-client';
const responseTimeSummary = new Summary({ name: 'response_time_summary_seconds', help: 'Response time summary in seconds', percentiles: [0.5, 0.9, 0.99], // cuantiles});
responseTimeSummary.observe(0.42);responseTimeSummary.observe(0.35);Exportación de métricas para Prometheus
Cree un endpoint /metrics que entregue las métricas en formato de texto:
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('Server running on port 3000'));Ahora, con una solicitud GET