Monitoreo de aplicaciones JavaScript: métricas y alertas (nivel avanzado)
Las aplicaciones JavaScript modernas en Node.js se vuelven cada vez más complejas: microservicios, arquitecturas event-driven, sistemas en tiempo real. El monitoreo simple de "vivo/muerto" ya no proporciona una imagen completa. Para garantizar la estabilidad y un alto rendimiento, se requiere un enfoque avanzado: recopilación de métricas de negocio, análisis de latencia, configuración de alertas inteligentes y observabilidad. En este artículo, analizaremos cómo construir un sistema de monitoreo a nivel avanzado utilizando Node.js, Prometheus y Grafana.
1. Métricas clave para aplicaciones Node.js
El monitoreo comienza con la selección correcta de métricas. Para un entorno de producción, tres grupos son críticos:
- Métricas RED (Rate, Errors, Duration) — frecuencia de solicitudes, cantidad de errores, tiempo de respuesta.
- Métricas USE (Utilization, Saturation, Errors) — carga de CPU, uso de memoria, cantidad de descriptores de archivos abiertos.
- Métricas de negocio — cantidad de usuarios activos, tamaño de la cola de tareas, velocidad de procesamiento de eventos.
Ejemplo de recopilación de métricas con la librería prom-client:
const client = require('prom-client');const 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.3, 0.5, 1, 3, 5]});
app.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();});También es obligatorio monitorear el garbage collection (GC) y el event loop lag — esto ayudará a identificar problemas de rendimiento antes de que se vuelvan críticos.
2. Configuración de alertas: de lo simple a lo inteligente
Las alertas no son solo notificaciones de caída del servidor. A nivel avanzado, las alertas deben ser:
- Contextuales — tener en cuenta la hora del día, el día de la semana, los ciclos de negocio.
- Multinivel — Warning, Critical, Pager.
- Predictivas — basadas en tendencias (por ejemplo, aumento de latencia del 20% en 15 minutos).
Ejemplo de regla para Prometheus Alertmanager usando predicción:
groups: - name: nodejs_alerts rules: - alert: HighErrorRate expr: rate(http_requests_errors_total[5m]) / rate(http_requests_total[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "Alto porcentaje de errores ({{ $value | humanizePercentage }})" description: "Más del 5% de las solicitudes devuelven errores en los últimos 2 minutos."
- alert: MemoryLeak expr: predict_linear(nodejs_heap_bytes_used{space="total"}[30m], 3600) > 1e9 for: 5m labels: severity: warning annotations: summary: "Fuga de memoria pronosticada" description: "El uso del heap podría superar 1GB en una hora."Es importante configurar la deduplicación y agrupación de alertas para no abrumar al ingeniero de guardia con cientos de mensajes similares. Use group_wait y group_interval en la configuración de Alertmanager.
3. Logging avanzado: logs estructurados y trazabilidad
El console.log estándar no es adecuado para producción. Use logging estructurado con las librerías pino o winston en formato JSON. Esto permite analizar fácilmente los logs e integrarlos con sistemas de agregación (ELK, Loki).
Ejemplo de configuración de pino:
const pino = require('pino');const logger = pino({ level: process.env.LOG_LEVEL ||