Skip to content

DevOps & Monitoring – Prometheus y Grafana

En el módulo anterior trabajaste con Apache Spark para procesar grandes volúmenes de datos. Ahora viene una pregunta inevitable: ¿cómo sabes si todo eso está funcionando correctamente? ¿Cómo detectas que un proceso se ha caído, que un servidor se está quedando sin memoria, o que un pipeline de datos lleva horas atascado?

La respuesta es la monitorización. Este módulo te introduce al stack de observabilidad más popular del ecosistema Big Data y DevOps: Prometheus + Grafana.


Para este módulo utilizaremos los contenedores creados en la carpeta “modulo3” del laboratorio.

Terminal window
git pull
cd modulo3
./menu.sh

1. El problema: ¿qué necesitamos saber de nuestros sistemas?

Section titled “1. El problema: ¿qué necesitamos saber de nuestros sistemas?”

Cuando tienes un sistema en producción, necesitas responder tres preguntas en todo momento:

PreguntaEjemploSin monitorización
¿Está vivo?¿Está el contenedor de Kafka corriendo?Solo lo sabes cuando falla
¿Está bien?¿Usa el 90% de la CPU?Solo lo sabes cuando el servidor explota
¿Cómo ha evolucionado?¿Cuándo empezó a degradarse el rendimiento?No tienes histórico

Los sistemas de monitorización modernos resuelven estas tres preguntas recopilando métricas continuamente.

Una métrica es un valor numérico registrado en el tiempo. Por ejemplo:

  • cpu_usage_percent = 82.3 → registrado el 19:30:01
  • http_requests_total = 14201 → registrado el 19:30:01
  • container_memory_bytes = 524288000 → registrado el 19:30:01

Esto se llama serie temporal (time series): el mismo dato capturado repetidamente a lo largo del tiempo.

graph LR
T1["19:30:00\ncpu=45%"]
T2["19:30:15\ncpu=67%"]
T3["19:30:30\ncpu=89%"]
T4["19:30:45\ncpu=92%"]
T5["19:31:00\n🚨 ALERTA"]
T1 --> T2 --> T3 --> T4 --> T5
style T1 fill:#c8e6c9,stroke:#388e3c
style T2 fill:#fff9c4,stroke:#f57c00
style T3 fill:#f8d7da,stroke:#c62828
style T4 fill:#f8d7da,stroke:#c62828
style T5 fill:#f8d7da,stroke:#c62828,stroke-width:3px

Con esta información puedes ver tendencias, detectar anomalías y configurar alertas automáticas.


Prometheus es un sistema de monitorización y alertas de código abierto creado originalmente por SoundCloud (2012) y actualmente parte de la CNCF (Cloud Native Computing Foundation), al igual que Kubernetes.

Su función principal es simple: ir a preguntar a todos tus servicios periódicamente cuántos recursos consumen, cuántos errores tienen, cuántas peticiones procesan… y almacenar esa información en una base de datos de series temporales.

Grafana es una plataforma de visualización de datos que se conecta a Prometheus (y otras fuentes) para mostrar los datos en forma de dashboards interactivos.


Así es cómo encajan todos los componentes:

graph TB
subgraph "Infraestructura a monitorizar"
S1["🖥️ Servidor Linux\n(Node Exporter)"]
S2["🐳 Contenedores Docker\n(cAdvisor)"]
S3["🐍 App Python\n(prometheus_client)"]
S4["📦 Apache Airflow\n(StatsD Exporter)"]
end
subgraph "Recolección y Almacenamiento"
P["🔵 Servidor Prometheus\n\nScrape cada 15s\nAlmacena series temporales\nEvalúa reglas de alerta"]
end
subgraph "Gestión de Alertas"
AM["🔔 Alertmanager\n\nAgrupa alertas\nEnvía a Slack / Email"]
end
subgraph "Visualización"
G["🟠 Grafana\n\nDashboards interactivos\nConsultas PromQL\nPaneles en tiempo real"]
end
S1 -->|"HTTP /metrics"| P
S2 -->|"HTTP /metrics"| P
S3 -->|"HTTP /metrics"| P
S4 -->|"HTTP /metrics"| P
P -->|"Cuando condición\nse cumple"| AM
P -->|"DataSource\n(PromQL)"| G
AM -->|"Notificación"| U["👤 Equipo de ops"]
G -->|"Dashboard"| U2["👤 Cualquier usuario"]
style P fill:#e3f2fd,stroke:#1976d2,stroke-width:3px
style G fill:#fff9c4,stroke:#f57c00,stroke-width:2px
style AM fill:#f8d7da,stroke:#c62828,stroke-width:2px
style S1 fill:#c8e6c9,stroke:#388e3c
style S2 fill:#c8e6c9,stroke:#388e3c
style S3 fill:#c8e6c9,stroke:#388e3c
style S4 fill:#c8e6c9,stroke:#388e3c

Es el cerebro del sistema. Sus responsabilidades son:

  • Scraping: cada N segundos, hace peticiones HTTP a las endpoints /metrics de los objetivos configurados.
  • Almacenamiento: guarda las métricas en su base de datos de series temporales (TSDB local).
  • Evaluación de reglas: comprueba si alguna métrica supera un umbral para generar alertas.
  • API: expone una API y una interfaz web para hacer consultas con PromQL.
Terminal window
# Ejemplo de endpoint de métricas que Prometheus va a "scrapear"
# Cada servicio expone algo como esto en /metrics:
curl http://localhost:9090/metrics
# Salida (ejemplo):
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
# go_gc_duration_seconds{quantile="0"} 4.9351e-05
# go_gc_duration_seconds{quantile="0.5"} 7.424e-05
# go_gc_duration_seconds{quantile="1"} 0.001462528

Muchos sistemas no saben hablar el idioma de Prometheus. Para eso existen los exporters: pequeños servicios que leen las métricas nativas de un sistema y las “traducen” al formato HTTP que Prometheus entiende.

ExporterMonitorizaPuerto
Node ExporterHardware del servidor (CPU, RAM, disco, red)9100
cAdvisorContenedores Docker en tiempo real8080
StatsD ExporterApps que usan StatsD (Airflow, etc.)9125/9102
Blackbox ExporterDisponibilidad de URLs, DNS, TCP9115
Terminal window
# Ejemplo: arrancar Node Exporter con Docker
docker run -d \
--name node-exporter \
-p 9100:9100 \
prom/node-exporter
# Ahora Prometheus puede scrapear las métricas del host en:
# http://localhost:9100/metrics

Para extraer información de Prometheus se usa PromQL (Prometheus Query Language). Es el lenguaje que usa tanto la UI de Prometheus como Grafana para construir los gráficos.

# Uso de CPU de todos los CPUs del host
rate(node_cpu_seconds_total{mode!="idle"}[5m])
# Memoria disponible en GB
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024
# Número de contenedores corriendo
count(container_last_seen) by (name)
# Alertar si la CPU supera el 80% durante 5 minutos
avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) > 0.80

Cuando Prometheus detecta que una métrica supera un umbral (por ejemplo, CPU > 90% durante 5 minutos), dispara una alerta. El Alertmanager recibe esa alerta y se encarga de:

  • Agruparlas: si 10 servidores fallan a la vez, no recibes 10 mensajes, sino uno solo.
  • Silenciarlas: puedes silenciar alertas durante mantenimientos planificados.
  • Enrutarlas: envía las alertas al canal correcto (Slack del equipo de datos, email del sysadmin, PagerDuty de guardia…).

Un dashboard es una pantalla compuesta de paneles (panels). Cada panel muestra una visualización diferente (líneas temporales, gauges, tablas, heatmaps…) basada en una consulta PromQL.

graph TD
DB["📊 Dashboard\n'Monitorización Docker'"]
DB --> P1["📈 Panel 1\nUso de CPU por contenedor\n(Gráfico de líneas)"]
DB --> P2["💧 Panel 2\nMemoria usada\n(Gauge 0-100%)"]
DB --> P3["🌐 Panel 3\nTrafico de red\n(Área apilada)"]
DB --> P4["📋 Panel 4\nContenedores activos\n(Stat)"]
style DB fill:#fff9c4,stroke:#f57c00,stroke-width:2px
style P1 fill:#e3f2fd,stroke:#1976d2
style P2 fill:#e3f2fd,stroke:#1976d2
style P3 fill:#e3f2fd,stroke:#1976d2
style P4 fill:#e3f2fd,stroke:#1976d2

Grafana tiene una comunidad enorme de dashboards predefinidos que puedes importar directamente: grafana.com/grafana/dashboards.


Antes de continuar, asegúrate de tener claro lo siguiente:

  • Prometheus recopila métricas siendo “tirando” de los servicios cada N segundos (pull model).
  • Grafana lee esas métricas y las muestra en dashboards visuales.
  • Los exporters (Node Exporter, cAdvisor…) traducen el idioma de cada sistema al formato Prometheus.
  • Las métricas son valores numéricos registrados en el tiempo → series temporales.
  • PromQL es el lenguaje para consultar esas series temporales.
  • El Alertmanager gestiona las notificaciones cuando algo va mal.