Métricas de Prometheus en TypeScript: guía completa de monitoreo

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

Métricas de Prometheus en TypeScript: guía completa

\n\n

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

\n\n

¿Qué son las métricas de Prometheus?

\n\n

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

Instalación de prom-client en TypeScript

\n\n

Para trabajar con Prometheus en TypeScript usaremos la biblioteca oficial prom-client. Instálela mediante npm:

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

También instale los tipos para TypeScript:

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

Creación y registro de métricas

\n\n

Veamos un ejemplo básico de creación de métricas. Cree un archivo metrics.ts:

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

Uso de métricas en una aplicación Express

\n\n

Ahora crearemos una aplicación Express simple en TypeScript que utilizará nuestras métricas:

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

Ejecución y verificación

\n\n

Ejecute la aplicación:

\n\n
npx ts-node app.ts
\n\n

Abra en

Recommendations