Métricas de Prometheus en Node.js: biblioteca prom-client para monitoreo

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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-client


Despué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({                    

Recommendations