Introducción: Por qué el monitoreo es crítico para las aplicaciones TypeScript
\nTypeScript es una herramienta poderosa para crear aplicaciones web escalables, pero incluso el código de mayor calidad no está exento de fallos en producción. Sin un sistema de monitoreo, corre el riesgo de enterarse de los problemas por los usuarios, no por alertas automáticas. En este artículo, analizaremos el ciclo completo de configuración del monitoreo: desde la recopilación de métricas hasta el envío de notificaciones.
\nAbordaremos los tres pilares clave de la observabilidad: métricas (indicadores numéricos del sistema), registros (registros detallados de eventos) y trazado (seguimiento de solicitudes). Prestaremos especial atención a la integración con herramientas populares: Prometheus, Grafana y Sentry.
\n\n1. Métricas principales para aplicaciones TypeScript
\nAntes de configurar alertas, debe determinar qué métricas son críticas para su aplicación. Las dividiremos en tres grupos:
\n\n1.1 Métricas de negocio
\nReflejan la salud de la aplicación desde la perspectiva del usuario:
\n- \n
- Cantidad de solicitudes por segundo (RPS) — muestra la carga en el servidor \n
- Tiempo de respuesta (latencia) — percentiles p50, p95, p99 \n
- Cantidad de errores — estados 4xx y 5xx \n
- Usuarios activos — sesiones, conexiones WebSocket \n
1.2 Métricas técnicas
\nMuestran el estado de la infraestructura:
\n- \n
- CPU y Memoria — carga del procesador y fugas de memoria \n
- Event Loop Lag — retrasos en el bucle de eventos de Node.js \n
- Garbage Collection — frecuencia y duración de la recolección de basura \n
- HTTP connection pool — número de conexiones abiertas \n
1.3 Ejemplo: recopilación de métricas con Prometheus en TypeScript
\nInstalemos la biblioteca prom-client para Node.js:
npm install prom-client @types/prom-client\n\nCreemos el archivo metrics.ts:
import client from 'prom-client';\nimport express, { Request, Response } from 'express';\n\n// Creamos un registro de métricas\nconst register = new client.Registry();\nclient.collectDefaultMetrics({ register });\n\n// Métrica personalizada: número de solicitudes HTTP\nconst httpRequestCounter = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code'],\n registers: [register],\n});\n\n// Histograma de 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_code'],\n buckets: [0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// Middleware para recopilar métricas\nexport function metricsMiddleware(req: Request, res: Response, next: Function) {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n const labels = {\n method: req.method,\n route: req.route?.path || 'unknown',\n status_code: res.statusCode.toString(),\n };\n httpRequestCounter.inc(labels);\n end(labels);\n });\n next();\n}\n\n// Endpoint para Prometheus\nexport function metricsEndpoint(req: Request, res: Response) {\n res.set('Content-Type', register.contentType);\n res.send(register.metrics());\n}\n\n2. Configuración de alertas: de la teoría a la práctica
\nLas alertas deben ser inteligentes: demasiadas falsas alarmas cansan al equipo. Usamos la regla de "tres sigmas" para anomalías y valores umbral para métricas críticas.
\n\n2.1 Reglas de alertas en Prometheus
\nCree el archivo alerts.yml:
groups:\n - name: typescript-app\n rules:\n - alert: HighErrorRate\n expr: |\n rate(http_requests_total{status_code=~"5.."}[5m]) \n / \n rate(http_requests_total[5m]) > 0.05\n for: 2m\n labels:\n severity: critical\n annotations:\n