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.
0. Entorno
Section titled “0. Entorno”Para este módulo utilizaremos los contenedores creados en la carpeta “modulo3” del laboratorio.
git pullcd modulo3./menu.sh1. 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:
| Pregunta | Ejemplo | Sin 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.
¿Qué es una métrica?
Section titled “¿Qué es una métrica?”Una métrica es un valor numérico registrado en el tiempo. Por ejemplo:
cpu_usage_percent = 82.3→ registrado el 19:30:01http_requests_total = 14201→ registrado el 19:30:01container_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:3pxCon esta información puedes ver tendencias, detectar anomalías y configurar alertas automáticas.
2. La solución: Prometheus + Grafana
Section titled “2. La solución: Prometheus + Grafana”🔵 Prometheus: el recolector
Section titled “🔵 Prometheus: el recolector”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: el visualizador
Section titled “🟠 Grafana: el visualizador”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.
3. Arquitectura del sistema
Section titled “3. Arquitectura del sistema”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:#388e3c4. Componentes principales
Section titled “4. Componentes principales”4.1 El servidor Prometheus
Section titled “4.1 El servidor Prometheus”Es el cerebro del sistema. Sus responsabilidades son:
- Scraping: cada N segundos, hace peticiones HTTP a las endpoints
/metricsde 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.
# 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.0014625284.2 Exporters (traductores)
Section titled “4.2 Exporters (traductores)”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.
| Exporter | Monitoriza | Puerto |
|---|---|---|
| Node Exporter | Hardware del servidor (CPU, RAM, disco, red) | 9100 |
| cAdvisor | Contenedores Docker en tiempo real | 8080 |
| StatsD Exporter | Apps que usan StatsD (Airflow, etc.) | 9125/9102 |
| Blackbox Exporter | Disponibilidad de URLs, DNS, TCP | 9115 |
# Ejemplo: arrancar Node Exporter con Dockerdocker run -d \ --name node-exporter \ -p 9100:9100 \ prom/node-exporter
# Ahora Prometheus puede scrapear las métricas del host en:# http://localhost:9100/metrics4.3 PromQL: el lenguaje de consultas
Section titled “4.3 PromQL: el lenguaje de consultas”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 hostrate(node_cpu_seconds_total{mode!="idle"}[5m])
# Memoria disponible en GBnode_memory_MemAvailable_bytes / 1024 / 1024 / 1024
# Número de contenedores corriendocount(container_last_seen) by (name)
# Alertar si la CPU supera el 80% durante 5 minutosavg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) > 0.804.4 Alertmanager
Section titled “4.4 Alertmanager”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…).
4.5 Grafana Dashboards
Section titled “4.5 Grafana Dashboards”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:#1976d2Grafana tiene una comunidad enorme de dashboards predefinidos que puedes importar directamente: grafana.com/grafana/dashboards.
Resumen
Section titled “Resumen”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.