Monitoreo avanzado de aplicaciones TypeScript: métricas y alertas
\nEn el desarrollo moderno, el monitoreo ha ido más allá de la simple verificación de "si el servidor está vivo". Para las aplicaciones TypeScript que operan en entornos distribuidos complejos, se requiere un sistema de observabilidad avanzado. No basta con registrar errores: es necesario recopilar métricas de rendimiento personalizadas, configurar alertas inteligentes y construir paneles para el análisis predictivo. En este artículo, veremos cómo implementar un monitoreo profesional de aplicaciones TypeScript utilizando herramientas modernas y mejores prácticas.
\n\n1. Recopilación de métricas de rendimiento personalizadas
\nLas métricas básicas (CPU, memoria) a menudo no brindan una imagen completa. Para las aplicaciones TypeScript, las métricas de negocio y las métricas de tiempo de ejecución son críticas. Consideremos la configuración de la recopilación de métricas personalizadas utilizando la biblioteca prom-client (cliente de Prometheus para Node.js).
Tipos de métricas personalizadas
\n- \n
- Counter (contador) — para contar eventos (solicitudes, errores). \n
- Gauge (indicador) — para valores que pueden aumentar y disminuir (número de conexiones activas). \n
- Histogram (histograma) — para la distribución de valores (tiempo de respuesta). \n
- Summary (resumen) — para cuantiles de tiempo de ejecución. \n
Ejemplo: Registro de métricas personalizadas en TypeScript
\nimport 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// Contador personalizado de errores\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',\n help: 'Total number of application errors',\n labelNames: ['type', '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'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// Gauge de usuarios activos\nconst activeUsers = new client.Gauge({\n name: 'active_users_count',\n help: 'Number of currently active users',\n labelNames: ['user_type'],\n registers: [register],\n});\n\nconst app = express();\n\n// Middleware para medir el tiempo de las solicitudes\napp.use((req: Request, res: Response, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.path, status: res.statusCode });\n });\n next();\n});\n\n// Endpoint para métricas\napp.get('/metrics', async (req: Request, res: Response) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// Simulación de error\napp.get('/error', (req: Request, res: Response) => {\n errorCounter.inc({ type: 'validation', code: '400' });\n res.status(400).send('Bad Request');\n});\n\napp.listen(3000, () => console.log('Server on port 3000'));\n\n2. Integración con Prometheus y Grafana
\nLas métricas recopiladas deben exportarse y visualizarse. Prometheus consultará nuestro endpoint /metrics y Grafana mostrará los datos en los paneles.
Configuración de Prometheus para la aplicación TypeScript
\n# prometheus.yml\nglobal:\n scrape_interval: 15s\nscrape_configs:\n - job_name: 'typescript-app'\n static_configs:\n - targets: ['localhost:3000']\n metrics_path: '/metrics'\n # Agregamos etiquetas de entorno\n relabel_configs:\n - source_labels: [__address__]\n target_label: instance\n regex: '([^:]+):.*'\n replacement: '${1}'\n\nConsultas avanzadas de PromQL para análisis
\n- \n
rate(app_errors_total[5m])— tasa de errores en los últimos 5 minutos. \nhistogram_quantile(0.95, rate(http_request_durati\n