Métricas de Prometheus en TypeScript: guía completa
\n\nPrometheus es un sistema de código abierto para monitoreo y alertas que recopila métricas de sus aplicaciones en tiempo real. En este artículo, veremos cómo integrar métricas de Prometheus en aplicaciones TypeScript utilizando la biblioteca prom-client. Aprenderá a crear, registrar y exportar métricas, así como a configurar un endpoint para la recopilación de datos.
¿Qué son las métricas de Prometheus?
\n\nPrometheus funciona bajo el modelo pull: periódicamente consulta (scrape) los endpoints de su aplicación para obtener métricas. Las métricas se dividen en varios tipos principales:
\n\n- \n
- Counter (contador) — solo aumenta (por ejemplo, número de solicitudes). \n
- Gauge (indicador) — puede aumentar y disminuir (por ejemplo, número actual de usuarios activos). \n
- Histogram (histograma) — mide la distribución de valores (por ejemplo, tiempo de respuesta). \n
- Summary (resumen) — similar al histograma, pero calcula cuantiles en el lado del cliente. \n
Instalación de prom-client en TypeScript
\n\nPara trabajar con Prometheus en TypeScript usaremos la biblioteca oficial prom-client. Instálela mediante npm:
npm install prom-client\n\nTambién instale los tipos para TypeScript:
\n\nnpm install @types/prom-client --save-dev\n\nCreación y registro de métricas
\n\nVeamos un ejemplo básico de creación de métricas. Cree un archivo metrics.ts:
import client from 'prom-client';\n\n// Creamos un registro para las métricas (por defecto se usa el global)\nconst register = new client.Registry();\n\n// Agregamos métricas predeterminadas (por ejemplo, memoria, CPU)\nclient.collectDefaultMetrics({ register });\n\n// Creamos un Counter para contar solicitudes\nconst httpRequestsTotal = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'status', 'path'],\n registers: [register],\n});\n\n// Creamos un Gauge para conexiones activas\nconst activeConnections = new client.Gauge({\n name: 'active_connections',\n help: 'Number of active connections',\n registers: [register],\n});\n\n// Creamos un Histogram 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', 'path'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],\n registers: [register],\n});\n\nexport { register, httpRequestsTotal, activeConnections, httpRequestDuration };\n\nUso de métricas en una aplicación Express
\n\nAhora crearemos una aplicación Express simple en TypeScript que utilizará nuestras métricas:
\n\nimport express from 'express';\nimport { register, httpRequestsTotal, activeConnections, httpRequestDuration } from './metrics';\n\nconst app = express();\nconst port = 3000;\n\n// Middleware para medir el tiempo de solicitud\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer({ method: req.method, path: req.path });\n activeConnections.inc();\n\n res.on('finish', () => {\n httpRequestsTotal.inc({ method: req.method, status: res.statusCode.toString(), path: req.path });\n activeConnections.dec();\n end();\n });\n\n next();\n});\n\n// Endpoint para Prometheus\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// Ejemplo de endpoint\napp.get('/', (req, res) => {\n res.send('¡Hola, Prometheus!');\n});\n\napp.listen(port, () => {\n console.log(`Servidor ejecutándose en http://localhost:${port}`);\n});\n\nEjecución y verificación
\n\nEjecute la aplicación:
\n\nnpx ts-node app.ts\n\nAbra en
También en la biblioteca
Migraciones de bases de datos en Java: revisión de herramientas y bibliotecas
Integración de métricas de Prometheus en aplicaciones Java: biblioteca simpleclient
Rate Limiting en PHP: Limitación de frecuencia de solicitudes para proteger el sitio
Análisis de HTML en PHP: Guía completa de bibliotecas y herramientas
Registro para JavaScript (Node.js): las mejores soluciones