Monitoreo de aplicaciones TypeScript: 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

Introducción: Por qué el monitoreo es crítico para las aplicaciones TypeScript

\n

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

\n

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

1. Métricas principales para aplicaciones TypeScript

\n

Antes de configurar alertas, debe determinar qué métricas son críticas para su aplicación. Las dividiremos en tres grupos:

\n\n

1.1 Métricas de negocio

\n

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

1.2 Métricas técnicas

\n

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

1.3 Ejemplo: recopilación de métricas con Prometheus en TypeScript

\n

Instalemos la biblioteca prom-client para Node.js:

\n
npm install prom-client @types/prom-client
\n\n

Creemos el archivo metrics.ts:

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

2. Configuración de alertas: de la teoría a la práctica

\n

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

2.1 Reglas de alertas en Prometheus

\n

Cree el archivo alerts.yml:

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

Blogs

Book Recommendations