prometheus
- monitoreo
- Docker
- Grafana
- Kubernetes
- Traefik
Arquitectura de Prometheus
Prometheus es un sistema de monitorización orientado a métricas que sigue un modelo pull, altamente fiable y ligero. Su arquitectura se compone de varios elementos clave:
- Prometheus Server
- Responsable de scrapear targets, guardar series temporales y ejecutar queries (PromQL).
- Incluye:
- Scrape Manager: extrae métricas vía HTTP.
- TSDB (Time Series Database): almacena métricas en bloques inmutables optimizados.
- Query Engine: ejecuta consultas PromQL.
- Exporters
- Componentes que exponen métricas en formato comprendido por Prometheus.
- Tipos principales:
- Node Exporter: métricas del sistema.
- App-specific Exporters: MySQL, Redis, Nginx, etc.
- Custom Exporters: desarrollados para aplicaciones propias.
- Service Discovery
- Descubre dinámicamente targets en entornos dinámicos.
- Integraciones: Kubernetes, Consul, EC2, Docker Swarm, archivos estáticos.
- Alertmanager
- Gestión de alertas, deduplicación, inhibición, rutas y notificaciones.
- Integración con email, Slack, PagerDuty, Webhooks, etc.
- Pushgateway
- Permite registrar métricas de jobs efímeros que no pueden ser scrapeados.
Métricas en Prometheus
Las métricas siguen un formato estructurado basado en series temporales con labels:
- Tipos de métricas
- Counter: valores crecientes (ej: peticiones).
- Gauge: valores que suben y bajan (ej: RAM utilizada).
- Histogram: distribución en buckets, útil para latencia.
- Summary: percentiles calculados localmente.
- Buenas prácticas
- No abusar de labels con alta cardinalidad.
- Mantener consistencia entre nombres y etiquetas.
- Usar
snake_casepara nombres. - Usar prefijos adecuados (
http_,process_,go_, etc.).
Consultas PromQL
PromQL es un lenguaje muy expresivo para consultas de series temporales.
Operaciones básicas
- Selección:
metric_namemetric_name{label="value"}
- Filtros:
!=,=~,!~
- Rango:
rate(http_requests_total[5m])
Operaciones avanzadas
- Agregaciones:
sum by (job) (rate(metric[1m]))avg,max,min,count,histogram_quantile
- Funciones comunes:
rate(),irate(),increase()predict_linear()label_replace()histogram_quantile(0.95, ...)
- Vector matching para combinar métricas:
sum(rate(a[5m])) / sum(rate(b[5m]))on(),ignoring(),group_left,group_right
Ejemplos
Peticiones por segundo
rate(http_requests_total[1m])
`
Latencia P95 desde histogram
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
Uso de CPU por job
sum by (job) (rate(process_cpu_seconds_total[5m]))
Alertas con Prometheus y Alertmanager
Las alertas se definen en archivos YAML y el servidor las evalúa continuamente.
Componentes
- Reglas de alerta (alerting rules)
- Expresiones PromQL que definen condiciones de disparo.
- Alertmanager
- Encargado del envío, agrupación y silencios.
Propiedades de alertas
- Severity (
warning,critical) - For: periodo de tiempo antes de disparar
- Labels y Annotations
Ejemplo de alerta
groups:
- name: cpu_high
rules:
- alert: HighCPUUsage
expr: rate(process_cpu_seconds_total[5m]) > 0.8
for: 2m
labels:
severity: critical
annotations:
summary: "Uso de CPU alto"
description: "El proceso {{ $labels.instance }} está usando >80% CPU."
Despliegues y Docker
Imagen recomendada:
- Bitnami:
- https://hub.docker.com/r/bitnami/prometheus
Ejemplo de
docker-compose.yml
- https://hub.docker.com/r/bitnami/prometheus
services:
prometheus:
image: bitnami/prometheus
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml
prometheus (avanzado)
TSDB Interno (Time Series Database)
La TSDB es el núcleo de Prometheus, optimizada para métricas de series temporales.
- Estructura de Bloques
- Cada bloque contiene un rango de tiempo (por defecto 2h).
- Componentes:
- Chunks: segmentos comprimidos de datos.
- Index: asignación de series → chunks.
- Meta.json: metadatos del bloque.
- WAL (Write-Ahead Log)
- Registro temporal en disco antes de compaction.
- Acelera recuperación tras fallos.
- Archivos:
00000001,00000002…
- Compaction
- Proceso que combina bloques pequeños en bloques mayores.
- Elimina datos duplicados.
- Optimiza compresión y almacenamiento.
- Retención
- Controlada por flags:
--storage.tsdb.retention.time--storage.tsdb.retention.size
- Recomendado ajustar según cardinalidad y capacidad.
- Controlada por flags:
Service Discovery Avanzado
Permite detectar dinámicamente instancias sin configuración estática.
- Kubernetes SD
- Tipos soportados:
- Pod, Endpoints, Service, Node
- Permite recolectar métricas en entornos altamente dinámicos.
- Tipos soportados:
- File-Based SD
- Archivos JSON/YAML que se actualizan dinámicamente.
- Útil para entornos con orquestadores propios.
- Relabeling (clave en entornos dinámicos)
- Transforma labels antes del scrape.
- Acciones:
replace,keep,drop,hashmod,labelmap
- Usos:
- Filtrado de targets.
- Normalización de etiquetas.
- Agrupación de métricas.
Relabeling Detallado
relabel_configs
Aplicado a targets antes del scrape.
relabel_configs:
- source_labels: [__address__]
regex: "(.+):80"
replacement: "$1:9100"
target_label: __address__
`
metric_relabel_configs
Perfecto para reducir cardinalidad tras el scrape.
metric_relabel_configs:
- source_labels: [pod]
regex: "test-.*"
action: drop
Federation
Permite que un Prometheus consulte a otros Prometheus para consolidar métricas.
- Casos de uso
- Monitorización global y agregada.
- Jerarquías multinodo.
- Desacoplar scraping de agregación.
- Modelos
- Federación simple: nodo A → nodo B.
- Federación jerárquica: múltiples niveles.
- Federación selectiva: solo métricas necesarias (
match[]).
Remote Write / Remote Read
Clave para escalabilidad y almacenamiento a largo plazo.
- Remote Write
- Envía métricas a sistemas externos:
- Thanos
- Cortex / Mimir
- VictoriaMetrics
- InfluxDB remotamente
- Diseñado para ingestión a gran escala.
- Envía métricas a sistemas externos:
- Remote Read
- Permite consultar datos históricos almacenados remotamente.
- Casos prácticos
- Métricas ilimitadas con almacenamiento externo.
- Reducción de presión sobre la TSDB local.
Prometheus en Kubernetes
Prometheus Operator / kube-prometheus-stack
Facilita despliegues complejos con CRDs.
- CRDs clave
ServiceMonitor: descubre servicios.PodMonitor: descubre pods.PrometheusRule: reglas de alertas y grabación.Probe: health checks externos.
Ventajas
- Autogestión del ciclo de vida.
- Auto-scraping.
- Alertmanager configurado dinámicamente.
Ejemplo de ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: app-monitor
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: http
interval: 15s
Alertas Avanzadas
Recording Rules
Permiten precalcular series para mejorar performance.
groups:
- name: recording
rules:
- record: job:http_requests:rate1m
expr: rate(http_requests_total[1m])
SLOs / SLIs
Alertas basadas en fiabilidad a nivel de servicio.
sum(rate(http_request_errors_total[5m]))
/
sum(rate(http_requests_total[5m]))
> 0.01
Alertas multi-etapa
Combinar recording rules + alertas para eficiencia y claridad.
Seguridad
- HTTPS
- Soportado, pero muchas veces se protege vía reverse proxy.
- Autenticación
- No incluida nativamente → usar Nginx, Traefik, OAuth2-proxy.
- Restricciones
- Network Policies
- Firewalls
- Control de acceso a endpoints
/api/v1/*
Escalabilidad y Limitaciones
- Cardinalidad
- El factor más crítico.
- Evitar etiquetas dinámicas:
pod_id,uuid,ip, etc.
- Límites del TSDB
- Diseñado para un solo nodo por instancia.
- No distribuido.
- Sharding via múltiples Prometheus o vía Thanos/Mimir.
- Optimización
- Reducir frecuencias de scrape innecesarias.
- Usar recording rules en vez de queries complejas repetidas.
- Purgar métricas de alta cardinalidad con
metric_relabel_configs.
prometheus (casos de uso)
Introducción
Esta guía reúne casos de uso reales y patrones prácticos para aplicar Prometheus de forma efectiva en diferentes entornos. Cada caso incluye su objetivo, enfoque recomendado y ejemplos útiles.
Monitorización de Infraestructura
Sistema Operativo y Servidores
- Objetivo
- Monitorear CPU, RAM, disco, redes y procesos del sistema.
- Enfoque
- Usar Node Exporter en cada nodo.
- Crear recording rules para CPU y discos.
- Ejemplo de métrica
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
```
### Máquinas Virtuales / Bare Metal
- **Objetivo**
- Visibilidad completa de hardware.
- **Enfoque**
- Node Exporter + Textfile Collector para scripts adicionales.
## Monitorización de Aplicaciones
### Aplicaciones HTTP
- **Objetivo**
- Medir peticiones, errores, latencias y throughput.
- **Enfoque**
- Usar *client libraries* (Go, Python, Java, Node.js).
- Exponer `/metrics` con histogramas.
- **Ejemplo**
```promql
histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le))
```
### Microservicios
- **Objetivo**
- Observar dependencias, tiempos de respuesta, límites.
- **Enfoque**
- Exportar métricas por servicio.
- Agregar `service`, `endpoint`, `version` como labels.
- **Casos comunes**
- Detección de cuellos de botella.
- Balanceo de carga.
## Monitorización en Kubernetes
### Descubrimiento Automático
- **Objetivo**
- Scrape dinámico sin modificar configuraciones manuales.
- **Enfoque**
- `ServiceMonitor` y `PodMonitor` con el Operator.
- **Ejemplo de query**
```promql
sum by (namespace) (kube_pod_container_resource_limits_cpu_cores)
```
### Estado del Clúster
- **Objetivo**
- Salud de nodos, pods, schedulers y control plane.
- **Enfoque**
- kube-state-metrics + cadvisor + apiserver metrics.
### Autoscaling Basado en Métricas
- **Objetivo**
- Ajustar replicas según carga real.
- **Enfoque**
- HPA con Prometheus Adapter.
## Monitorización de Bases de Datos
### PostgreSQL / MySQL
- **Objetivo**
- Queries Lentas, conexiones, locks, uso de buffers.
- **Exporters**
- postgres_exporter
- mysqld_exporter
- **Ejemplo**
```promql
rate(pg_stat_activity_total[5m])
```
### Redis
- **Objetivo**
- Latencia, keys, evicciones, hits vs misses.
- **Exporters**
- redis_exporter
## Monitorización de Redes
### Routers / Switches (SNMP)
- **Objetivo**
- Tráfico, errores, temperatura, estado de interfaces.
- **Enfoque**
- Usar snmp_exporter con targets generados.
- **Ejemplo**
```promql
rate(if_in_octets[1m])
```
### Proxies y Gateways (Nginx / Traefik)
- **Objetivo**
- Latencia, tráfico, errores y saturación.
- **Exporters**
- nginx exporter
- traefik metrics nativas
## Monitorización de Jobs Batch / ETL
### Jobs que no viven suficiente para ser scrapeados
- **Objetivo**
- Monitorizar estados de ejecuciones cortas.
- **Enfoque**
- Usar *Pushgateway*.
- **Ejemplo**
```promql
sum by (job) (push_time_seconds)
```
## Observabilidad de Contenedores
### Docker
- **Objetivo**
- CPU, memoria, IO por contenedor.
- **Enfoque**
- cadvisor en nodos.
- **Ejemplo**
```promql
rate(container_cpu_usage_seconds_total[1m])
```
### Críticas por Saturación
- **Objetivo**
- Detectar contenedores en throttling.
- **Ejemplo**
```promql
rate(container_cpu_cfs_throttled_seconds_total[5m])
```
## SLOs y SLIs
### Error Budget
- **Objetivo**
- Garantizar niveles de servicio (p. ej. 99.9%).
- **Enfoque**
- recording rules con windows largos (30d).
- **Ejemplo**
```promql
1 - (sum(rate(http_request_errors_total[30d])) / sum(rate(http_requests_total[30d])))
```
## Capacidad y Rendimiento
### Predicción de Crecimiento
- **Objetivo**
- Detectar saturación inminente.
- **Enfoque**
- `predict_linear()`
- **Ejemplo**
```promql
predict_linear(node_filesystem_free_bytes[1h], 4*3600)
```
## Alertas Reales Usadas en Producción
### CPU Alta
```promql
sum by (instance) (rate(process_cpu_seconds_total[5m])) > 0.8
`
Memoria Faltante
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.15
Latencia Web Elevada
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 0.5
Integraciones con el Ecosistema
- Grafana
- Docker
- monitoreo
- Kubernetes
¿Te gusta este contenido? Suscríbete vía RSS