Introducción: Por qué la monitorización es crítica para aplicaciones Node.js
Las aplicaciones web modernas en JavaScript (Node.js) operan bajo alta carga y arquitecturas distribuidas. Incluso el código perfectamente escrito puede fallar debido a fugas de memoria, caídas de rendimiento o errores en operaciones asíncronas. La monitorización de aplicaciones JavaScript permite no solo detectar el problema, sino también prevenirlo antes de que afecte a los usuarios.
En este artículo analizaremos qué métricas deben rastrearse, cómo configurar la recopilación de datos con herramientas populares (Prometheus, Grafana) y cómo organizar un sistema de alertas para Node.js. Todos los ejemplos de código están escritos en JavaScript y listos para usar.
Métricas clave para aplicaciones Node.js
La monitorización de aplicaciones Node.js se puede dividir en tres niveles: infraestructura, aplicación y métricas de negocio. Veamos cada uno de ellos.
Métricas de infraestructura
Estas métricas muestran el estado del servidor y el entorno de ejecución:
- CPU y Memoria (RSS, Heap Total, Heap Used) — fugas de memoria y alta carga del procesador.
- Event Loop Lag — retardo del bucle de eventos (si >50ms, la aplicación comienza a ralentizarse).
- Garbage Collection (GC) — frecuencia y duración de la recolección de basura.
- File Descriptors — número de archivos y sockets abiertos.
Métricas de aplicación
Muestran cómo la aplicación procesa las solicitudes:
- RPS (Requests Per Second) — número de solicitudes por segundo.
- Latencia (p50, p95, p99) — retardo de respuesta.
- Error Rate — porcentaje de errores (4xx, 5xx).
- Active Connections — número de conexiones WebSocket/HTTP activas.
Métricas de negocio
Específicas de su aplicación:
- Número de usuarios registrados.
- Velocidad de procesamiento de pagos.
- Tiempo de respuesta de APIs externas.
Recopilación de métricas con Prometheus y Node.js
Prometheus es el estándar de facto para la recopilación de métricas en infraestructura moderna. Para Node.js existe la biblioteca prom-client, que permite exportar métricas fácilmente.
Instalación y configuración de prom-client
npm install prom-client expressCreemos un servidor básico con métricas:
const express = require('express');const client = require('prom-client');const app = express();
// Creamos un registro de métricasconst register = new client.Registry();client.collectDefaultMetrics({ register });
// Creamos un histograma personalizado para latenciasconst httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'], buckets: [0.1, 0.5, 1, 2, 5]});register.registerMetric(httpRequestDuration);
// Middleware para medir latenciasapp.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status_code: res.statusCode }); }); next();});
// Endpoint para métricasapp.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.end(await register.metrics());});
app.get('/', (req, res) => { res.send('Hello World');});
app.listen(3000, () => console.log('Server running on port 3000'));Recopilación de métricas del Event Loop
Para monitorear el bucle de eventos usamos process.hrtime() o la biblioteca event-loop-lag:
const eventLoopLag = new client.Gauge({ name: 'nodejs_event_loop_lag_seconds', help: 'Event loop lag in seconds'});register.re