Monitoreo de aplicaciones JavaScript: métricas y alertas de la A a la Z
\n\nEn el mundo moderno del desarrollo, no basta con escribir código que funcione. Es fundamental entender cómo se comporta tu aplicación en un entorno de producción. El monitoreo de aplicaciones JavaScript (especialmente en Node.js) no es solo una tendencia, sino una necesidad. Permite identificar cuellos de botella, prevenir fallos y garantizar una alta disponibilidad de los servicios. En este artículo, analizaremos el ciclo completo: desde la recopilación de métricas clave hasta la configuración de alertas, utilizando un stack de herramientas moderno.
\n\n¿Por qué es importante el monitoreo de Node.js?
\nLas aplicaciones Node.js a menudo funcionan de forma asíncrona, procesando miles de solicitudes por segundo. Sin monitoreo, corres el riesgo de:
\n- \n
- Pasar por alto una fuga de memoria (memory leak) que provoque la caída del servidor. \n
- No notar un aumento en el tiempo de respuesta (latencia), lo que empeora la experiencia del usuario. \n
- Perder datos debido a errores no controlados. \n
Un sistema de monitoreo te brinda visibilidad (observabilidad) y te permite tomar decisiones basadas en datos, no en suposiciones.
\n\nMétricas clave para aplicaciones JavaScript
\nTodas las métricas se pueden dividir en tres grupos: métricas de infraestructura, métricas de negocio y métricas de aplicación. Veámoslas en detalle.
\n\n1. Métricas de infraestructura (método USE)
\nSon los indicadores básicos de salud del servidor: CPU, memoria, disco, red. Para Node.js, la memoria (heap, non-heap) y la cantidad de descriptores de archivo abiertos son especialmente importantes.
\n\n2. Métricas de aplicación (método RED)
\nEl método RED (Rate, Errors, Duration) es el estándar de oro para microservicios:
\n- \n
- Rate (Tasa): número de solicitudes por segundo (RPS). \n
- Errors (Errores): porcentaje de solicitudes que finalizan con error (4xx, 5xx). \n
- Duration (Duración): tiempo de ejecución de la solicitud (percentiles p50, p95, p99). \n
3. Métricas de negocio
\nEspecíficas de tu producto: número de usuarios registrados, pedidos completados, sesiones activas, etc.
\n\nRecopilación de métricas con Prometheus y Node.js
\nPrometheus es el estándar de facto para la recopilación de métricas. Para Node.js usamos la librería prom-client. Veamos un ejemplo de configuración.
Instalación y configuración básica
\nnpm install prom-client express\n\nCreemos un servidor con el endpoint /metrics:
const express = require('express');\nconst client = require('prom-client');\n\nconst app = express();\nconst port = 3000;\n\n// Creamos un registro de métricas\nconst register = new client.Registry();\n\n// Agregamos métricas estándar de Node.js\nclient.collectDefaultMetrics({ register });\n\n// Creamos un histograma personalizado para el tiempo de respuesta\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duration of HTTP requests in seconds',\n labelNames: ['method', 'route', 'status'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5]\n});\nregister.registerMetric(httpRequestDuration);\n\n// Middleware para medir el tiempo\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.route?.path || 'unknown', status: res.statusCode });\n });\n next();\n});\n\n// Endpoint para métricas\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\napp.get('/', (req, res) => {\n res.send('Hello, monitoring!');\n});\n\napp.listen(port, () => {\n console.log(`App listening at http://localhost:${port}`);\n});\n\nContadores personalizados
\nAgreguemos un contador de errores:
\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',