Monitoreo de APIs con Prometheus
Monitorea rendimiento y salud de APIs con métricas Prometheus, collectors personalizados y reglas de alertamiento.
Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.
Visión General
Prometheus es el estándar de facto para recolección de métricas en entornos cloud-native. Al instrumentar tu API con contadores, histograms y gauges personalizados, ganas visibilidad en tiempo real sobre latencia de requests, tasas de error, throughput y métricas de nivel de negocio.
Cuándo Usar
Usa este recurso cuando:
- Configuras monitoreo para APIs REST o gRPC
- Definies SLOs y SLIs para microservicios
- Creas dashboards de Grafana para salud de API
- Alertas sobre picos de latencia p99 o tasas de error
Solución
Instrumentación con Cliente Prometheus (Node.js)
const client = require('prom-client');
// Counter: requests totales
const httpRequestsTotal = new client.Counter({
name: 'http_requests_total',
help: 'Número total de requests HTTP',
labelNames: ['method', 'route', 'status_code']
});
// Histogram: duración de requests
const httpRequestDuration = new client.Histogram({
name: 'http_request_duration_seconds',
help: 'Duración de requests HTTP en segundos',
labelNames: ['method', 'route'],
buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5]
});
// Gauge: conexiones activas
const activeConnections = new client.Gauge({
name: 'http_active_connections',
help: 'Número de conexiones HTTP activas'
});
// Middleware
app.use((req, res, next) => {
activeConnections.inc();
const end = httpRequestDuration.startTimer();
res.on('finish', () => {
end({ method: req.method, route: req.route?.path || 'unknown' });
httpRequestsTotal.inc({
method: req.method,
route: req.route?.path || 'unknown',
status_code: res.statusCode
});
activeConnections.dec();
});
next();
});
Reglas de Alertamiento
# prometheus-alerts.yml
groups:
- name: api_alerts
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status_code=~"5.."}[5m]) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "Tasa de error alta detectada"
- alert: HighLatency
expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 5m
labels:
severity: warning
Explicación
Prometheus sigue un modelo de pull:
- Instrumentación: Tu aplicación expone un endpoint /metrics
- Scraping: El servidor de Prometheus hace polling a este endpoint periódicamente (default 15s)
- Almacenamiento: Los datos de series temporales se almacenan localmente con compresión
- Consulta: Queries PromQL agregan métricas en tiempo real
- Alertamiento: Alertmanager enruta alertas a Slack, PagerDuty, email
Tipos de métricas:
- Counter: Incrementa monotónicamente (requests, errores)
- Histogram: Observaciones en buckets + suma + conteo (latencia)
- Gauge: Puede subir o bajar (conexiones, profundidad de cola)
- Summary: Cuantiles pre-calculados (usa histograms en su lugar cuando sea posible)
Variantes
| Lenguaje | Librería | Notas |
|---|---|---|
| Node.js | prom-client | Más popular; registro built-in |
| Go | prometheus/client_golang | Oficial; mejor performance |
| Python | prometheus_client | Middleware Flask/Django disponible |
| Java | Micrometer | Integración Spring Boot |
| Rust | prometheus | Compatible con async |
Mejores Prácticas
- Usa labels con moderación: Alta cardinalidad (combinaciones únicas de labels) degrada performance
- Prefiere histograms sobre summaries: Los histograms permiten agregación across instances
- Instrumenta métricas de negocio: No solo métricas técnicas (registros, revenue por endpoint)
- Ajusta retención sabiamente: Default 15 días; incrementa para tendencias a largo plazo
- Ejecuta Prometheus en modo HA: Usa Thanos o Cortex para agregación multi-cluster
Errores Comunes
- Alta cardinalidad de labels: IDs de usuario o sesión como labels crashean Prometheus
- Faltar sufijos de unidades: Usa _seconds, _bytes, _total según convenciones de nombrado
- No instrumentar fallos: Solo trackear éxitos enmascara detección de outage
- Demasiados buckets: 100+ buckets de histogram desperdicia almacenamiento y CPU
- Ignorar errores de scraping: Errores del endpoint /metrics significan puntos ciegos
Preguntas Frecuentes
P: ¿Cuánta memoria necesita Prometheus? R: ~1-3KB por serie temporal. Una API típica con 100 endpoints y 5 labels necesita 2-4GB RAM.
P: ¿Puede Prometheus manejar datos de logs? R: No. Usa Loki para logs, Jaeger para trazas, y Prometheus para métricas. El stack de Grafana los unifica.
P: ¿Cuál es la diferencia entre histogram y summary? R: Los histograms agrupan datos y permiten agregación. Los summaries precalculan cuantiles pero no pueden agregarse across instances.
Recursos Relacionados
Metrics Collection and Alerting with Prometheus
Instrument applications and infrastructure with Prometheus metrics, configure alerting rules, and set up recording rules for efficient monitoring of service health
RecipeObservability Dashboards with Grafana and Prometheus
Build interactive Grafana dashboards that visualize Prometheus metrics with panels, variables, and alerts for comprehensive service observability
DocAPI Status Page Template
A template for a public API status page that communicates uptime, incidents, and maintenance windows to consumers.
GuideLogging, Monitoring & Observability Guide
A guide to building observable systems with structured logging, metrics, and distributed tracing.
GuideMonitoring and Alerting — Metrics, Logs, and Dashboards
A practical guide to observability: the three pillars (metrics, logs, traces), RED and USE methods, alert design, and building dashboards that actually help.