Monitoreo de aplicaciones JavaScript: métricas y alertas de la A a la Z

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

Monitoreo de aplicaciones JavaScript: métricas y alertas de la A a la Z

\n\n

En 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?

\n

Las 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
\n

Un sistema de monitoreo te brinda visibilidad (observabilidad) y te permite tomar decisiones basadas en datos, no en suposiciones.

\n\n

Métricas clave para aplicaciones JavaScript

\n

Todas 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\n

1. Métricas de infraestructura (método USE)

\n

Son 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\n

2. Métricas de aplicación (método RED)

\n

El 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
\n\n

3. Métricas de negocio

\n

Específicas de tu producto: número de usuarios registrados, pedidos completados, sesiones activas, etc.

\n\n

Recopilación de métricas con Prometheus y Node.js

\n

Prometheus 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.

\n\n

Instalación y configuración básica

\n
npm install prom-client express
\n\n

Creemos un servidor con el endpoint /metrics:

\n
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\n

Contadores personalizados

\n

Agreguemos un contador de errores:

\n
const errorCounter = new client.Counter({\n    name: 'app_errors_total',                

Blogs

Book Recommendations