ADR 0033 — Use Grafana for Visualization

Status

Accepted

Context

El stack de observabilidad del TFG incluye Prometheus para métricas de infraestructura (ADR-0031) y Loki para agregación de logs (ADR-0032). Necesitamos una plataforma de visualización que permita:

  • Dashboards unificados para métricas y logs
  • Alertas visuales y notificaciones
  • Exploración interactiva de datos
  • Provisioning declarativo de configuración

Decision

Utilizaremos Grafana como plataforma única de visualización para métricas (Prometheus) y logs (Loki).

Componentes:

  • Grafana: Plataforma open-source de visualización y observabilidad
  • Provisioning: Configuración declarativa de datasources y dashboards
  • Dashboards JSON: Dashboards versionados en Git

Consequences

  • Pros:
    • Unifica visualización de métricas y logs en una sola UI.
    • Integración nativa con Prometheus y Loki (mismo ecosistema Grafana Labs).
    • Provisioning declarativo permite configuración como código.
    • Amplia comunidad con dashboards pre-construidos disponibles.
    • Self-hosted (privacidad de datos).
  • Cons / Trade-offs:
    • Añade un servicio más al stack de infraestructura.
    • Requiere configuración inicial de datasources y dashboards.
    • Curva de aprendizaje para crear dashboards complejos.

Alternatives considered

  • Prometheus UI: Incluida en Prometheus, pero muy básica para dashboards.
  • Kibana: Potente para logs, pero requiere Elasticsearch (no Loki).
  • Datadog/New Relic: SaaS propietarios, no self-hosted.
  • Chronograf: Buena opción para InfluxDB, pero no para Prometheus/Loki.

Implementation

# docker-compose.yml
grafana:
  image: docker.io/grafana/grafana:latest
  ports:
    - "3001:3000"
  environment:
    GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-admin}
    GF_USERS_ALLOW_SIGN_UP: "false"
  volumes:
    - grafana_data:/var/lib/grafana
    - ./grafana/provisioning:/etc/grafana/provisioning
  depends_on:
    - prometheus
    - loki
# grafana/provisioning/datasources/datasources.yml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    url: http://prometheus:9090
    isDefault: true

  - name: Loki
    type: loki
    url: http://loki:3100

Estructura de provisioning:

grafana/provisioning/
├── dashboards/
│   ├── dashboards.yml       # Configuración del provider
│   └── json/
│       ├── logs.json        # Dashboard de logs
│       └── system-health.json  # Dashboard de salud del sistema
└── datasources/
    └── datasources.yml      # Configuración de datasources

References

  • https://grafana.com/
  • https://grafana.com/docs/grafana/latest/administration/provisioning/
  • https://grafana.com/docs/loki/latest/
  • ADR-0031: Use Prometheus for Infrastructure Metrics
  • ADR-0032: JSON Structured Logging