Biblioteca prom-client: Monitoreo de aplicaciones Node.js con Prometheus
En el desarrollo web moderno, el monitoreo del rendimiento y el estado de las aplicaciones se ha convertido en una necesidad. Una de las soluciones más populares para la recopilación y análisis de métricas es Prometheus, un sistema de código abierto que recopila datos en forma de series temporales. Para la integración con Node.js existe la biblioteca oficial prom-client, que permite exportar fácilmente métricas en un formato comprensible para Prometheus.
En este artículo, analizaremos en detalle cómo instalar y usar prom-client, qué tipos de métricas están disponibles y cómo integrarlas con el framework web Express.
Instalación y configuración
Para comenzar, instale la biblioteca a través de npm:
npm install prom-clientDespués de la instalación, impórtela en su aplicación:
const prometheus = require('prom-client');const express = require('express');const app = express();Tipos principales de métricas
La biblioteca prom-client admite cuatro tipos principales de métricas de Prometheus:
- Counter — un contador que solo aumenta (por ejemplo, número de solicitudes).
- Gauge — un valor que puede tanto aumentar como disminuir (por ejemplo, número de conexiones activas).
- Histogram — un histograma que mide la distribución de valores (por ejemplo, tiempo de respuesta).
- Summary — una estadística resumida, similar a Histogram, pero con cuantiles más precisos.
Ejemplo: Counter (contador de solicitudes)
Creemos un contador para rastrear el número total de solicitudes HTTP:
const httpRequestsTotal = new prometheus.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'route', 'status']});
// Middleware para contar solicitudesapp.use((req, res, next) => { res.on('finish', () => { httpRequestsTotal.inc({ method: req.method, route: req.path, status: res.statusCode }); }); next();});Ejemplo: Gauge (conexiones activas)
Gauge es útil para rastrear el estado actual, por ejemplo, el número de usuarios activos:
const activeUsers = new prometheus.Gauge({ name: 'active_users', help: 'Number of active users'});
app.get('/login', (req, res) => { activeUsers.inc(); // Aumenta al iniciar sesión res.send('Logged in');});
app.get('/logout', (req, res) => { activeUsers.dec(); // Disminuye al cerrar sesión res.send('Logged out');});Ejemplo: Histogram (tiempo de respuesta)
Histogram permite medir cuánto tiempo toma procesar las solicitudes:
const httpRequestDuration = new prometheus.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route'], buckets: [0.1, 0.5, 1, 2, 5] // Límites de los buckets en segundos});
app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.path }); }); next();});Exportación de métricas para Prometheus
Para que Prometheus pueda recopilar datos, es necesario crear un endpoint (generalmente /metrics) que devuelva todas las métricas registradas:
app.get('/metrics', async (req, res) => { res.set('Content-Type', prometheus.register.contentType); res.end(await prometheus.register.metrics());});
app.listen(3000, () => { console.log('Server running on port 3000');});Métricas personalizadas con etiquetas
Puede agregar etiquetas para un filtrado más detallado. Por ejemplo, dividamos las métricas por versiones de API:
const apiCalls = new prometheus.Counter({