Skip to content

Grafana

Grafana es la herramienta de visualización de métricas más popular en el ecosistema DevOps. Mientras que Prometheus se encarga de recopilar y almacenar datos de rendimiento, Grafana transforma esos números en dashboards interactivos y visualmente intuitivos que cualquier miembro del equipo puede interpretar de un vistazo, sin necesidad de escribir consultas PromQL.

En este módulo aprenderás a instalar Grafana, conectarla con Prometheus, crear dashboards personalizados y reutilizar plantillas de la comunidad. También exploraremos Netdata como una alternativa más ligera para monitorización local.

[!NOTE] Repositorio de ejemplos Todos los ejemplos de este tema se encuentran en el repositorio del módulo:

Terminal window
git clone https://github.com/josepgarcia/monitoring-prometheus-graphana
cd monitoring-prometheus-graphana

Para que Grafana funcione, necesitamos un stack de servicios interconectados: Prometheus (que recopila datos), Grafana (que los visualiza), Node Exporter (que proporciona métricas del host) y cAdvisor (que expone métricas de contenedores Docker).

Añadimos Grafana al stack de Prometheus del tema anterior en un único archivo docker-compose.yaml:

# docker-compose.yaml (stack completo)
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
# Credenciales del administrador
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
# Sin este volumen, los dashboards se pierden al reiniciar el contenedor
- grafana-data:/var/lib/grafana
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
ports:
- "8080:8080"
privileged: true
volumes:
grafana-data:
Terminal window
# Levantar el stack completo
docker compose up -d
# Acceder a Grafana
# http://localhost:3000 (admin / admin)

2. Conectar Grafana con Prometheus (Data Source)

Section titled “2. Conectar Grafana con Prometheus (Data Source)”

Un data source es la forma en que Grafana accede a los datos. Es como decirle: “aquí es donde puedes consultar las métricas”. Sin configurar un data source, Grafana no tiene nada que visualizar.

Pasos para configurar Prometheus como data source

Section titled “Pasos para configurar Prometheus como data source”
  1. Accede a Grafana: abre tu navegador en http://localhost:3000 e inicia sesión con usuario admin y contraseña admin
  2. Navega a Data Sources: en el menú lateral, haz clic en ConnectionsData Sources
  3. Añade una nueva fuente: pulsa el botón Add new data source (azul, esquina superior derecha)
  4. Selecciona Prometheus: elige Prometheus de la lista de opciones disponibles
  5. Configura la URL: en el campo URL introduce http://prometheus:9090 (importante: usa el nombre del servicio Docker, no localhost)
  6. Prueba la conexión: pulsa Save & Test — deberías ver un mensaje verde que diga “Data source is working”

Un dashboard es una pantalla compuesta de paneles interactivos. Cada panel representa una métrica específica usando una visualización (gráfico de líneas, número destacado, indicador de porcentaje, tabla, etc.) basada en una consulta PromQL contra Prometheus.

  1. Abre la página de dashboards: en el menú lateral, haz clic en Dashboards
  2. Crea uno nuevo: pulsa el botón + New Dashboard (esquina superior derecha)
  3. Añade tu primer panel: pulsa + Add visualization (botón azul en el centro)
  4. Selecciona la fuente de datos: elige Prometheus en el menú desplegable (datos source)
  5. Escribe una consulta PromQL: en el editor de consultas (abajo), pega una de las consultas de ejemplo
  6. Configura la visualización: en la columna derecha, selecciona el tipo de gráfico (Time series, Stat, Gauge, etc.)
  7. Guarda el panel: pulsa Apply (botón azul) para confirmar y añadirlo al dashboard

Verás cómo en tiempo real el panel muestra datos si Prometheus está correctamente configurado.

Consultas PromQL para los primeros paneles

Section titled “Consultas PromQL para los primeros paneles”

A continuación, encontrarás consultas listas para usar. Solo tienes que copiar y pegarlas en el editor de Grafana. Cada una está comentada para explicar qué mide.

# Panel 1: CPU de cada contenedor (Time series)
# Muestra cómo evoluciona el porcentaje de CPU de cada contenedor a lo largo del tiempo
sum(rate(container_cpu_usage_seconds_total{name=~".+"}[10m])) by (name) * 100
# Panel 2: Número de contenedores activos (Stat)
# Un número grande y visible con el total de contenedores en marcha en este momento
count(count(container_last_seen) by (name))
# Panel 3: Memoria por contenedor en MB (Bar chart)
# Compara el uso de memoria (en megabytes) entre todos los contenedores activos
container_memory_usage_bytes{name=~".+"} / 1024 / 1024
# Panel 4: Tráfico de red enviado en Mbps (Time series)
# Visualiza el ancho de banda de salida de red en megabits por segundo
rate(container_network_transmit_bytes_total[1m]) * 8 / 1024 / 1024
# Panel 5: CPU del host en % (Gauge de 0 a 100)
# Muestra el porcentaje total de CPU usado en la máquina host
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Panel 6: Memoria disponible del host en GB (Stat)
# Cantidad de RAM libre disponible en la máquina host
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024

Consejo práctico: copia cada consulta en el campo PromQL de un nuevo panel, selecciona el tipo de visualización recomendado, y verás los datos en tiempo real.

Dashboard Grafana con métricas de contenedores Docker

Panel de CPU por contenedor en Grafana


Grafana incluye muchas opciones de visualización. Seleccionar el tipo correcto hace que tus datos sean mucho más claros y comprensibles. Aquí están los más importantes para monitorización:

TipoDescripciónCuándo usarloEjemplo
Time seriesGráfico de líneas que evoluciona en el tiempoVer tendencias, cambios, picos de cargaCPU, memoria, tráfico de red
StatUn número grande y destacadoMostrar un valor actual importanteContenedores activos, uptime total
GaugeIndicador circular o lineal (tipo velocímetro)Mostrar un valor dentro de un rango (0-100%)CPU%, disco usado%, memoria disponible%
Bar chartGráfico de barras comparativoComparar valores entre instancias o serviciosMemoria por contenedor, peticiones por endpoint
TableTabla de datos estructuradaMostrar muchos detalles simultáneamenteListado de servicios con estado, IPs, puertos
HeatmapMapa de calor (intensidad de colores)Ver distribuciones y patrones ocultosLatencia de peticiones, calor de CPU por hora
LogsPanel de texto en tiempo realLeer líneas de log vivas mientras ocurrenLogs de aplicación (requiere Loki integrado)

Una de las mayores ventajas de Grafana es que no necesitas crear todos los dashboards desde cero. Miles de usuarios y empresas comparten dashboards profesionales, completos y listos para usar.

Ubicación: grafana.com/grafana/dashboards

  1. Abre el gestor de dashboards: en el menú lateral, haz clic en Dashboards
  2. Abre el importador: pulsa New → Import
  3. Busca el dashboard:
    • Opción A: Introduce el ID del dashboard (número de 3-5 dígitos) en el campo “Grafana.com Dashboard”
    • Opción B: Pega el JSON completo si lo tienes descargado
  4. Selecciona el data source: en el desplegable, elige tu Prometheus data source
  5. Confirma la importación: pulsa Import

En segundos, Grafana creará todos los paneles y empezará a mostrar datos.

IDNombreQué monitorizaIdeal para
1860Node Exporter FullCPU, RAM, disco, red, procesos del hostAdministradores de sistemas
193Docker monitoringMétricas de todos los contenedoresIngenieros DevOps con Docker
11074Node Exporter Dashboard ENVersión simplificada del hostPrincipiantes
893Docker and system monitoringDocker + métricas del host combinadasStack mixto (contenedores + host)

6. Aprovisionamiento automático (Infrastructure as Code)

Section titled “6. Aprovisionamiento automático (Infrastructure as Code)”

En desarrollo, configurar dashboards manualmente desde la UI funciona. Pero en producción, esta aproximación tiene problemas: cambios manuales, inconsistencias entre entornos, dificultad para reproducir configuraciones en nuevos servidores.

La solución es el aprovisionamiento automático: define tus data sources y dashboards en archivos YAML/JSON que Grafana carga automáticamente cuando arranca. Es la forma profesional de trabajar.

provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
# Nombre del servicio Docker, no localhost
url: http://prometheus:9090
isDefault: true
editable: false
provisioning/dashboards/dashboards.yml
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: ''
type: file
disableDeletion: false
updateIntervalSeconds: 10
options:
# Carpeta donde están los JSON de los dashboards
path: /var/lib/grafana/dashboards

Luego monta los archivos en el docker-compose:

grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
# Montar la configuración de aprovisionamiento
- ./provisioning:/etc/grafana/provisioning
# Montar los JSON de los dashboards
- ./dashboards:/var/lib/grafana/dashboards

7. Alternativa: Netdata (monitorización autónoma)

Section titled “7. Alternativa: Netdata (monitorización autónoma)”

Existe una alternativa a la combinación Prometheus + Grafana: Netdata. Es una herramienta de monitorización autónoma que genera sus propias visualizaciones sin dependencias externas.

AspectoPrometheus + GrafanaNetdata
InstalaciónRequiere 2-3 servicios (Prometheus, Grafana, exporters)Un único contenedor
ConfiguraciónManual, requiere entender PromQLAutomática, sin configuración
AlcanceCentraliza métricas de múltiples hostsMonitoriza un único host localmente
FlexibilidadMuy personalizable, gran comunidadMenos flexible, menos opciones
Caso de usoProducción, múltiples servidores, dashboards complejosDesarrollo, single-node, visión rápida
Terminal window
# Desplegar Netdata con Docker en 10 segundos
docker run -d \
--name=netdata \
-p 19999:19999 \
--cap-add SYS_PTRACE \
--security-opt apparmor=unconfined \
netdata/netdata
# Accede a: http://localhost:19999
# Verás métricas del host en tiempo real sin configurar nada

Dashboard de Netdata mostrando métricas en tiempo real

Elige Netdata si…

  • Necesitas monitorizar un solo servidor o máquina local
  • Quieres resultados inmediatos sin configuración
  • Trabajas en desarrollo local

Elige Prometheus + Grafana si…

  • Necesitas monitorizar múltiples hosts/servicios de forma centralizada
  • Quieres crear dashboards personalizados y profesionales
  • Trabajas en producción y necesitas escalabilidad

❌ Error: “Los dashboards desaparecen al reiniciar Grafana”

Section titled “❌ Error: “Los dashboards desaparecen al reiniciar Grafana””

Síntoma: Creas un dashboard hermoso, lo guardas, pero cuando reinicia el contenedor de Grafana, desaparece.

Causa: Falta el volumen persistente. Sin él, los datos se almacenan solo en la memoria del contenedor.

Solución: Añade un volumen en el docker-compose.yaml:

# ❌ INCORRECTO: sin volumen persistente
grafana:
image: grafana/grafana
ports:
- "3000:3000"
# Los dashboards se pierden aquí ⚠️
# ✅ CORRECTO: con volumen para persistencia
grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana # ← Esto guarda los dashboards
volumes:
grafana-data: # Nombre del volumen Docker

Luego, reinicia los contenedores: docker compose down && docker compose up -d

❌ Error: “Data source Prometheus shows ‘No Data’ / connection refused”

Section titled “❌ Error: “Data source Prometheus shows ‘No Data’ / connection refused””

Síntoma: En Grafana, al hacer clic en Test Connection para el data source, ves un mensaje rojo de error.

Causa: Generalmente es por uno de estos problemas:

  1. Prometheus no está corriendo: verifica con docker ps que el contenedor de Prometheus existe y está activo
  2. URL incorrecta: usaste http://localhost:9090 en lugar del nombre del servicio Docker
  3. Prometheus no tiene datos: no está scrapeando correctamente

Solución paso a paso:

Terminal window
# 1. Verifica que todos los contenedores están activos
docker ps | grep prometheus # Debería listar el contenedor de Prometheus
# 2. Entra en Grafana y comprueba la URL del data source
# Debe ser: http://prometheus:9090 (NO localhost)
# 3. Verifica que Prometheus está scrapeando datos
# Abre en tu navegador: http://localhost:9090/targets
# Todos los targets deben estar en estado "UP" (verde)
# 4. Si aún falla, reinicia todo:
docker compose down
docker compose up -d

[!NOTE] 💡 Soluciones disponibles Si te atascas, las soluciones están en el archivo 2.Graphana_SOL.txt del repositorio.

Ej. 1: Instalación y conexión (verificación básica)

Section titled “Ej. 1: Instalación y conexión (verificación básica)”

Objetivo: Instalar el stack completo y verificar que Grafana puede conectarse a Prometheus.

Pasos:

  1. Usa el docker-compose.yaml de la Sección 1 y levanta el stack: docker compose up -d
  2. Espera 30 segundos a que Prometheus se estabilice
  3. Abre Grafana en http://localhost:3000 e inicia sesión con admin / admin
  4. Añade Prometheus como data source (Connections → Data Sources → Add new data source)
    • URL: http://prometheus:9090
    • Pulsa “Save & Test” — deberías ver ✅ verde
  5. Verificación: Ve a Explore (icono de brújula) y ejecuta la consulta up. ¿Cuántos targets aparecen? ¿Todos están en valor 1?

Concepto: La métrica up en Prometheus indica si un target está activo (1 = UP, 0 = DOWN).

Objetivo: Crear un dashboard simple con un panel que muestre cuántos contenedores están corriendo.

Pasos:

  1. Abre Dashboards → New Dashboard
  2. Haz clic en + Add visualization
  3. Selecciona Prometheus como data source
  4. Copia esta consulta en el editor PromQL:
    count(count(container_last_seen) by (name))
  5. En la columna derecha, selecciona Stat como tipo de visualización
  6. Configura el panel:
    • Title: Contenedores activos
    • Units: dejar en blanco
  7. Pulsa Apply para guardar

Resultado esperado: Verás un número grande (3 o 4) en el centro del panel, dependiendo de cuántos contenedores tengas activos.

¿Qué significa?: La métrica container_last_seen emite un valor 1 cuando un contenedor está activo. Al agrupar por nombre y contar, obtenemos el total.

Ej. 3: Gráfico de evolución temporal (Time series)

Section titled “Ej. 3: Gráfico de evolución temporal (Time series)”

Objetivo: Añadir un segundo panel que muestre cómo varía la CPU de cada contenedor a lo largo del tiempo.

Pasos:

  1. En el mismo dashboard, haz clic en + Add visualization (o en la esquina superior derecha del dashboard)
  2. Selecciona Prometheus como data source
  3. Copia esta consulta:
    sum(rate(container_cpu_usage_seconds_total{name!=""}[5m])) by (name) * 100
  4. En la columna derecha, selecciona Time series (gráfico de líneas)
  5. Configura el panel:
    • Title: CPU por contenedor (%)
    • En la pestaña Field, ajusta Unit a percent (0-100)
  6. Pulsa Apply

Resultado esperado: Verás un gráfico con varias líneas (una por contenedor) mostrando la CPU en el tiempo.

Análisis: ¿Qué contenedor tiene picos de CPU? ¿Es constante o variable?

Objetivo: Aprender a importar dashboards profesionales de Grafana.com en lugar de crear todo desde cero.

Pasos:

  1. En Dashboards → New → Import
  2. En el campo “Find and import dashboards for common applications”, introduce: 1860
  3. Pulsa Enter o espera a que Grafana cargue la información del dashboard
  4. En el desplegable de Datasource, selecciona Prometheus
  5. Pulsa el botón Import

Espera 5 segundos a que cargue. Verás un dashboard completo con muchos paneles automáticamente.

Preguntas de reflexión:

  • ¿Cuántos paneles diferentes tiene este dashboard?
  • ¿Qué información te parece más valiosa como administrador de sistemas?
  • ¿Hay algún panel que ya habías creado manualmente en el ejercicio 3?

Ej. 5: Automatizar la configuración (Infrastructure as Code)

Section titled “Ej. 5: Automatizar la configuración (Infrastructure as Code)”

Objetivo: Practicar el aprovisionamiento automático para que Grafana se configure sin intervención manual.

Pasos:

  1. Crea la carpeta: en tu proyecto, crea provisioning/datasources/
  2. Crea el archivo YAML: provisioning/datasources/prometheus.yml con este contenido:
    apiVersion: 1
    datasources:
    - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
  3. Actualiza el docker-compose.yaml: añade en el servicio grafana:
    volumes:
    - grafana-data:/var/lib/grafana
    - ./provisioning:/etc/grafana/provisioning # ← Nueva línea
  4. Reinicia el stack:
    Terminal window
    docker compose down
    docker compose up -d
  5. Verifica: abre Grafana, ve a Connections → Data Sources. El data source de Prometheus debe estar ahí sin haberlo configurado manualmente.

Concepto clave: Esto es Infrastructure as Code — tu configuración vive en archivos versionables, no en clicks en la UI.


🚀 Proyecto Integral: Dashboard de Monitorización Profesional

Section titled “🚀 Proyecto Integral: Dashboard de Monitorización Profesional”

En este proyecto, crearás un dashboard production-ready que monitoriza tanto contenedores Docker como el host.

Construir un dashboard con al menos 6 paneles que proporcione una visión completa del estado del sistema en tiempo real.

PanelTipoMétricaDescripción
Contenedores activosStatcount(count(container_last_seen) by (name))Número de contenedores en ejecución
CPU por contenedorTime seriessum(rate(container_cpu_usage_seconds_total{name!=""}[5m])) by (name) * 100Evolución de CPU de cada contenedor
Memoria por contenedor (MB)Bar chartcontainer_memory_usage_bytes{name!=""} / 1024 / 1024Consumo de RAM comparado
CPU del host (%)Gauge100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)Uso total de CPU del servidor
Memoria disponible del host (GB)Statnode_memory_MemAvailable_bytes / 1024 / 1024 / 1024RAM libre disponible
Disco usado del host (%)Gauge(node_filesystem_size_bytes{fstype=~"ext4|xfs"} - node_filesystem_free_bytes{fstype=~"ext4|xfs"}) / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100Porcentaje de disco utilizado

Estructura: Organiza los 6 paneles en dos filas:

  • Fila 1 (arriba): Métricas de contenedores (activos, CPU, memoria)
  • Fila 2 (abajo): Métricas del host (CPU, memoria, disco)

Presentación:

  • Título del dashboard: algo descriptivo como “Stack Monitoring” o “System Dashboard”
  • Cada panel con título y unidades apropiadas
  • Colores coherentes

Exportación: Una vez terminado, exporta el dashboard como JSON:

  • En el dashboard, haz clic en Share (arriba a la derecha)
  • Selecciona Export → Save to file
  • Guarda el archivo en tu repositorio con nombre descriptivo

💡 Ahorra tiempo duplicando paneles: Crea el primero manualmente, luego:

  • Haz clic en el panel → More options (tres puntos) → Duplicate
  • Edita la consulta y el tipo de visualización del duplicado

💡 Configura thresholds para alertas visuales: En la columna derecha de cada panel, usa la pestaña Thresholds para colorear valores:

  • Rojo si CPU > 80%
  • Amarillo si CPU > 50%

💡 Añade descripciones: En cada panel, en la pestaña Description, añade una breve explicación de qué se mide y por qué es importante.

Cuando termines, tendrás:

  • Un dashboard funcional en Grafana con 6 paneles
  • Un archivo JSON exportado, versionable en Git
  • Experiencia práctica en monitorización real

📚 Referencias y recursos para profundizar

Section titled “📚 Referencias y recursos para profundizar”

¿Qué viene después? Ahora que dominas Prometheus + Grafana, puedes:

  • Añadir alertas automáticas (Alertmanager)
  • Exportar métricas de aplicaciones personalizadas (crear exporters)
  • Centralizar logs con Loki (logging distribuido)
  • Automatizar todo con Kubernetes y Prometheus Operator