grafana

  • devops
  • monitoreo
  • prometheus
  • Data Science
  • Docker
    • hub.docker.com/r/grafana/grafana

      Introducción

      Grafana es una plataforma de observabilidad diseñada para visualizar, correlacionar y analizar datos provenientes de métricas, logs, trazas y sistemas externos. Su principal fortaleza es la capacidad de construir dashboards avanzados y unificar múltiples fuentes de datos en un mismo panel. Forma parte de un ecosistema modular que incluye herramientas como Prometheus, Loki, Mimir, Tempo, y Alloy, lo que permite construir soluciones de monitoreo completas, escalables y adaptadas a arquitecturas modernas como microservicios y Kubernetes.

Ofrece:

  • Integración con decenas de orígenes de datos.
  • Dashboards altamente personalizables.
  • Consultas avanzadas mediante PromQL / LogQL.
  • Alertas integradas.
  • Fácil despliegue mediante Docker o Kubernetes.

    Conceptos Clave

  • Métricas
    • Datos numéricos que representan el estado y rendimiento de un servicio, sistema o aplicación.
    • Se suelen capturar mediante Prometheus, Grafana Agent, Alloy, etc.
    • Útiles para dashboards, alertas y análisis de tendencias.
  • Telemetría
    • Conjunto de métricas, logs y trazas.
    • Permite observabilidad completa.
    • Suele gestionarse mediante el stack: Grafana + Prometheus + Loki + Tempo (incluir si lo usas).
  • Logging
    • Registros textuales generados por aplicaciones y servicios.
    • Grafana se integra con Loki para ofrecer consulta eficiente y escalable.
  • Puertos habituales
    • 3000 → Interfaz web de Grafana.
    • 9090 → Prometheus (si formas stack con él).
    • 3100 → Loki (ingestión/query logs).
    • 9009 / 8080+ → Servicios anexos (Mimir, Tempo, Alloy según despliegue).

Componentes y Servicios del Ecosistema Grafana

  • Mimir (Métricas)
    • Sistema de almacenamiento horizontalmente escalable para métricas de Prometheus.
    • Permite ingestión de alto volumen, retención prolongada y clustering distribuido.
    • Ideal para ambientes multi-tenant o infra de gran escala.
      • [Grafana Mimir documentation Grafana Mimir documentation](https://grafana.com/docs/mimir/latest/)
      • [Get started with Grafana Mimir Grafana Mimir documentation](https://grafana.com/docs/mimir/latest/get-started/)
  • Loki (Logs)
    • Sistema de logs indexado por etiquetas, altamente eficiente en almacenamiento.
    • Diseño inspirado en Prometheus.
    • Soporta consultas mediante LogQL.
      • Logs Grafana Loki
      • [Get started with Grafana Loki Grafana Loki documentation](https://grafana.com/docs/loki/latest/get-started/)
  • Alloy (Agente)
    • Agente moderno de observabilidad que reemplaza y unifica funciones de Promtail, Agent y otros.
    • Permite pipelines personalizadas para logs, métricas y telemetría.
    • Soporta ingestión, transformación y envío hacia Loki, Mimir, Prometheus u otros.
    • Ideal para despliegues en contenedores y Kubernetes.
      • [Grafana Alloy Grafana Alloy documentation](https://grafana.com/docs/alloy/latest/)
      • [Run Grafana Alloy in a Docker container Grafana Alloy documentation](https://grafana.com/docs/alloy/latest/set-up/install/docker/)

Deploy con Docker

docker-compose básico para Grafana

services:
	grafana:
		image: grafana/grafana:latest
		container_name: grafana
		ports:
			- "3000:3000"
		volumes:
			- grafana_data:/var/lib/grafana
		environment:
			- GF_SECURITY_ADMIN_USER=admin
			- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
	grafana_data:

`

docker-compose para Loki + Promtail + Grafana

services:
	loki:
		image: grafana/loki:latest
		command: -config.file=/etc/loki/local-config.yaml
		ports:
			- "3100:3100"

	promtail:
		image: grafana/promtail:latest
		volumes:
			- /var/log:/var/log
			- ./promtail-config.yaml:/etc/promtail/config.yaml
		command: -config.file=/etc/promtail/config.yaml

	grafana:
		image: grafana/grafana:latest
		ports:
			- "3000:3000"
		depends_on:
			- loki

docker-compose para Mimir (mínimo)

services:
	mimir:
		image: grafana/mimir:latest
		ports:
			- "9009:9009"
		volumes:
			- ./mimir.yaml:/etc/mimir/mimir.yaml
		command: -config.file=/etc/mimir/mimir.yaml

Consultas y Lenguajes

  • PromQL
    • Lenguaje de consultas para métricas en Prometheus/Mimir.
    • Permite consultas temporales, agregaciones y cálculos derivados.
  • LogQL
    • Lenguaje de Loki para consultar logs.
    • Similar a PromQL pero adaptado a flujos de texto.
  • Grafana dashboards JSON
    • Dashboards versionables mediante Git.
    • Permiten importar/exportar definiciones completas en JSON.

Integraciones Comunes

Guía de Código para Lenguajes y Consultas en Grafana (PromQL, LogQL y JSON de Dashboards)

Introducción

Esta guía reúne ejemplos prácticos de los lenguajes más utilizados dentro del ecosistema de Grafana:

  • PromQL para consultar métricas.
  • LogQL para consultas de logs en Loki.
  • Dashboards JSON para versionado e infraestructura como código.

Todos los bloques de código están separados por headings propios para facilitar la lectura.


PromQL — Consultas de Métricas

Selección Básica de Métricas

# Métrica simple
node_cpu_seconds_total

# Filtrar por etiquetas
node_cpu_seconds_total{mode="idle"}

# Filtrar por múltiples etiquetas
http_requests_total{job="api", status="500"}

`

Agregaciones

# Promedio de uso de CPU por instancia
avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)

# Suma total de peticiones HTTP
sum(rate(http_requests_total[1m]))

# Máximo de uso de memoria por servicio
max(node_memory_Active_bytes) by (service)

Rangos Temporales

# CPU idle en los últimos 10m
node_cpu_seconds_total{mode="idle"}[10m]

# Tasa de peticiones por minuto
rate(http_requests_total[1m])

Alertas en PromQL (para Alertmanager)

# Alerta: CPU sobre el 90%
avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance) > 0.9

LogQL — Consultas de Logs en Loki

Selección Básica

# Logs sin filtros
{job="nginx"}

# Filtrar por etiqueta + substring
{job="backend"} |= "error"

# Filtro negativo
{job="backend"} != "debug"

Expresiones con Operadores

# Contiene "timeout" o "failed"
{app="api"} |= "timeout" |= "failed"

# Filtra logs que NO contienen una palabra
{app="payments"} != "INFO"

Búsqueda con Expresiones Regulares

# Coincidencia de patrón de IP
{job="nginx"} |~ "(\\d+\\.){3}\\d+"

Parsing y Extracción

# Extraer valores usando patrones
{app="api"} 
| json 
| line_format "user={.user_id} status={.status}"

Métricas Derivadas desde Logs

# Contar errores por minuto
sum(rate({app="backend"} |= "error" [1m])) by (instance)

# Latencia promedio analizada desde logs JSON
avg_over_time(({app="api"} | json | unwrap duration)[5m])

Dashboards JSON — Infraestructura como Código

Ejemplo de Panel Sencillo

{
	"title": "Uso de CPU",
	"type": "timeseries",
	"targets": [
		{
			"expr": "avg(rate(node_cpu_seconds_total{mode!=\"idle\"}[5m])) by (instance)",
			"legendFormat": "{{instance}}"
		}
	]
}

Dashboard Completo Mínimo

{
	"dashboard": {
		"id": null,
		"title": "Dashboard de Ejemplo",
		"panels": [
			{
				"type": "timeseries",
				"title": "CPU por instancia",
				"targets": [
					{
						"expr": "rate(node_cpu_seconds_total{mode!=\"idle\"}[2m])",
						"legendFormat": "{{instance}}"
					}
				],
				"gridPos": { "x": 0, "y": 0, "w": 12, "h": 8 }
			}
		]
	},
	"overwrite": true
}

Variables de Dashboard

{
	"name": "instance",
	"type": "query",
	"query": "label_values(node_cpu_seconds_total, instance)",
	"includeAll": true
}

Ejemplos Combinados en Paneles

Métrica + LogQL como series superpuestas

{
	"type": "timeseries",
	"title": "Errores vs Requests",
	"targets": [
		{
			"expr": "sum(rate(http_requests_total{status=\"500\"}[5m]))",
			"legendFormat": "Errores 500"
		},
		{
			"expr": "sum(rate({app=\"api\"} |= \"error\" [5m]))",
			"legendFormat": "Errores LogQL"
		}
	]
}

Plantillas Útiles

Plantilla para Panel de Logs

{
	"type": "logs",
	"title": "Logs del Backend",
	"targets": [
		{
			"expr": "{app=\"backend\"}"
		}
	]
}

Panel de Estado (Stat)

{
	"type": "stat",
	"title": "Requests por minuto",
	"targets": [
		{
			"expr": "sum(rate(http_requests_total[1m]))"
		}
	]
}

Referencias Rápidas

  • PromQL: Selecciona métricas, filtra por etiquetas, aplica funciones → dashboards/alertas.
  • LogQL: Filtra logs, aplica parsers, deriva métricas desde logs.
  • Dashboards JSON: Infra as code, versionable, reproducible.