Zum Hauptinhalt springen

Grafana

Definition

Grafana ist eine Open-Source-Analyse- und interaktive Visualisierungsplattform, die sich mit einer Vielzahl von Datenquellen verbindet — Prometheus, InfluxDB, Elasticsearch, Loki, PostgreSQL, Cloud-native Monitoring-APIs und Dutzende mehr — und die Daten als interaktive, teilbare Dashboards darstellt. Es verfügt über keinen eigenen Speicher; es ist eine reine Query-und-Visualisierungsschicht, die vor bestehender Dateninfrastruktur sitzt. Dieses Design macht Grafana komplementär zu jedem Zeitreihen- oder Log-Speichersystem, anstatt eines davon zu ersetzen.

In ML- und MLOps-Kontexten dient Grafana als einheitliche Observability-Oberfläche. Data Scientists und ML-Engineers nutzen es, um Modellleistungsmetriken (Genauigkeit, F1, AUC) über die Zeit zu verfolgen, Vorhersagelatenz und Durchsatz zusammen mit Infrastrukturressourcennutzung zu visualisieren und Datenqualitätssignale wie Feature-Drift-Scores zu überwachen. Da Grafana mehrere Datenquellen gleichzeitig unterstützt, kann ein einziges Dashboard Prometheus-Metriken, Anwendungslogs von Loki und Business-KPIs aus einer SQL-Datenbank kombinieren — und so einen vollständigen, kontextualisierten Überblick über das Verhalten eines Modells in der Produktion geben.

Grafana ist als selbst gehostete Open-Source-Distribution, als Grafana Cloud (ein verwaltetes SaaS-Angebot) und als Grafana Enterprise mit zusätzlichen Enterprise-Features erhältlich. Die Open-Source-Distribution ist voll funktionsfähig und ist die häufigste Wahl für Teams, die bereits Kubernetes betreiben oder Infrastructure-as-Code-Workflows haben, da Grafana-Dashboards, Datenquellenkonfigurationen und Alert-Regeln alle als JSON oder über Terraform-Provider verwaltet werden können.

Funktionsweise

Datenquellenkonfiguration

Grafana verbindet sich über Plugins mit Datenquellen. Ein Datenquellen-Plugin übersetzt Grafanas internes Query-Modell in die native Abfragesprache des Backends (PromQL für Prometheus, SQL für relationale Datenbanken, Lucene für Elasticsearch usw.) und gibt Daten in einem normalisierten Format zurück. Datenquellen werden in der Grafana-UI oder über Provisioning-Dateien (YAML) konfiguriert, was die Verwaltung von Konfigurationen als Code in einem Git-Repository ermöglicht. Authentifizierung, TLS und Timeout-Einstellungen sind pro Datenquelle konfigurierbar.

Dashboard- und Panel-Komposition

Ein Grafana-Dashboard ist ein JSON-Dokument, das eine geordnete Liste von Panels enthält. Jedes Panel definiert eine Abfrage gegen eine Datenquelle, einen Visualisierungstyp (Zeitreihe, Gauge, Balkendiagramm, Tabelle, Heatmap, Stat usw.) und Anzeigeoptionen (Achsen, Schwellenwerte, Legenden, Überschreibungen). Panels können mit anderen Dashboards verknüpft werden, unterstützen Variablen (Template-Variablen ermöglichen es einem einzigen Dashboard, zwischen Umgebungen, Modellversionen oder Diensten per Dropdown zu wechseln) und können Annotationen referenzieren — Ereignisse, die als Überlagerung auf Zeitreihen-Graphen Deployments, Retraining-Läufe oder Incident-Starts markieren.

Variablen und Templating

Template-Variablen verwandeln ein statisches Dashboard in ein dynamisches. Eine Variable fragt die Datenquelle nach einer Liste von Werten ab (z. B. alle verschiedenen model_version-Label-Werte aus Prometheus) und fügt den ausgewählten Wert in jede Panel-Abfrage des Dashboards ein. Damit ist es möglich, ein einziges ML-Modell-Dashboard zu erstellen, das für alle Modelle und Versionen funktioniert, anstatt für jedes Modell ein separates Dashboard zu pflegen.

Alerting

Grafana Alerting (eingeführt in Grafana 8+) bietet einheitliche, multi-Datenquellen-Alert-Regeln, die Panel-Abfragen nach einem Zeitplan auswerten und ausgelöste Alerts an Kontaktpunkte (Slack, PagerDuty, E-Mail, Webhooks) weiterleiten. Alert-Regeln werden in Benachrichtigungsrichtlinien gruppiert, die Routing-, Gruppierungs- und Stummschaltungsverhalten bestimmen. Grafana Alerting kann neben dem Prometheus Alertmanager koexistieren oder ihn vollständig ersetzen, je nach Teampräferenz.

Provisioning und Infrastructure as Code

Grafana unterstützt deklaratives Provisioning von Datenquellen, Dashboards und Alert-Regeln über YAML- und JSON-Dateien, die beim Start geladen werden. In Kombination mit dem Grafana-Terraform-Provider kann die gesamte Grafana-Konfiguration versioniert und über CI/CD-Pipelines deployt werden — eine kritische Fähigkeit für Teams, die mehrere Umgebungen verwalten oder reproduzierbare Monitoring-Infrastruktur wünschen.

Wann verwenden / Wann NICHT verwenden

Verwenden wennVermeiden wenn
Interaktive, teilbare Dashboards über Prometheus oder andere Zeitreihendaten benötigt werdenEine vollständige ML-Experiment-Tracking-UI benötigt wird (stattdessen MLflow oder W&B verwenden)
Infrastrukturmetriken mit Modellleistung in einer Ansicht korreliert werden sollenDas Team keine bestehende Zeitreihendatenquelle hat, mit der Grafana verbunden werden kann
Mehrere Datenquellen (Prometheus, SQL, Loki) in einem Dashboard vereint werden sollenEine einfache Text- oder Tabellenübersicht ausreicht und ein Dashboard keinen Mehrwert bietet
Dashboards als Code via JSON oder Terraform verwaltet werden sollenDie Organisation bereits auf eine proprietäre Observability-Plattform standardisiert ist
Alerting benötigt wird, das mehrere Datenquellen umfasstRohe Vorhersage-Logs gespeichert oder analysiert werden müssen (Grafana fragt ab, speichert nicht)

Vergleiche

Grafana und Prometheus ergänzen sich — Prometheus sammelt und speichert Metriken; Grafana visualisiert sie. Die folgende Tabelle vergleicht sie, um ihre unterschiedlichen Rollen zu verdeutlichen.

KriteriumGrafanaPrometheus
Primäre RolleVisualisierung und DashboardingMetriken-Sammlung, Speicherung und Alerting
DatenspeicherungKeine — fragt externe Backends abLokale TSDB (pull-basiertes Scraping)
AbfragespracheAbhängig von Datenquelle (PromQL, SQL usw.)PromQL
AlertingEinheitliches multi-Datenquellen-Alerting (Grafana 8+)PromQL-basierte Regeln + Alertmanager
Datenquellen50+ Plugins (Prometheus, SQL, Loki, Cloud usw.)Nur selbst (TSDB)
Gemeinsamer EinsatzImmer — Grafana ist die UI für Prometheus-DatenImmer — Prometheus ist das Backend für Grafana-Dashboards

Vor- und Nachteile

AspektVorteileNachteile
Multi-DatenquellenVereint Metriken, Logs und SQL in einem DashboardKonfigurationskomplexität wächst mit der Anzahl der Datenquellen
Dashboard-as-CodeJSON-Export und Terraform-Provider ermöglichen GitOps-WorkflowsJSON-Dashboards sind ausführlich und schwer manuell zu vergleichen
Template-VariablenEin Dashboard deckt alle Modelle, Umgebungen und Versionen abVariablenabfragen erhöhen die Latenz beim Dashboard-Laden
VisualisierungsbibliothekUmfangreiche, anpassbare Panel-TypenEinige erweiterte Diagrammtypen erfordern Plugins oder Grafana Enterprise
AlertingEinheitliche, multi-Datenquellen-Alert-RegelnLernkurve für Benachrichtigungsrichtlinien und Routing-Bäume
Selbst gehostete OptionVolle Kontrolle, keine Daten verlassen die eigene InfrastrukturErfordert operativen Aufwand: Upgrades, Backups, Plugin-Verwaltung

Code-Beispiele

// grafana_ml_dashboard.json
// Grafana dashboard definition for monitoring an ML model serving endpoint.
// Import this JSON via Grafana UI: Dashboards → Import → Upload JSON file.
// Prerequisites: Prometheus data source named "Prometheus" with ml_* metrics.
{
"title": "ML Model Monitoring",
"description": "Dashboard for monitoring ML model latency, throughput, confidence distribution, and data drift.",
"uid": "ml-model-monitoring-v1",
"schemaVersion": 36,
"version": 1,
"refresh": "30s",
"time": { "from": "now-3h", "to": "now" },
"templating": {
"list": [
{
"name": "model_name",
"label": "Model",
"type": "query",
"datasource": { "type": "prometheus", "uid": "Prometheus" },
"query": "label_values(ml_predictions_total, model_name)",
"includeAll": false,
"multi": false,
"current": {}
},
{
"name": "model_version",
"label": "Version",
"type": "query",
"datasource": { "type": "prometheus", "uid": "Prometheus" },
"query": "label_values(ml_predictions_total{model_name=\"$model_name\"}, model_version)",
"includeAll": true,
"multi": true,
"current": {}
}
]
},
"panels": [
{
"id": 1,
"title": "Prediction Throughput (req/s)",
"type": "timeseries",
"gridPos": { "x": 0, "y": 0, "w": 12, "h": 8 },
"datasource": { "type": "prometheus", "uid": "Prometheus" },
"targets": [
{
"expr": "sum(rate(ml_predictions_total{model_name=\"$model_name\", status=\"success\"}[2m])) by (model_version)",
"legendFormat": "{{model_version}} — success",
"refId": "A"
},
{
"expr": "sum(rate(ml_predictions_total{model_name=\"$model_name\", status=\"error\"}[2m])) by (model_version)",
"legendFormat": "{{model_version}} — error",
"refId": "B"
}
],
"fieldConfig": {
"defaults": {
"unit": "reqps",
"custom": { "lineWidth": 2, "fillOpacity": 10 }
}
}
},
{
"id": 2,
"title": "P50 / P95 / P99 Prediction Latency",
"type": "timeseries",
"gridPos": { "x": 12, "y": 0, "w": 12, "h": 8 },
"datasource": { "type": "prometheus", "uid": "Prometheus" },
"targets": [
{
"expr": "histogram_quantile(0.50, sum(rate(ml_prediction_latency_seconds_bucket{model_name=\"$model_name\"}[2m])) by (le, model_version))",
"legendFormat": "p50 {{model_version}}",
"refId": "A"
},
{
"expr": "histogram_quantile(0.95, sum(rate(ml_prediction_latency_seconds_bucket{model_name=\"$model_name\"}[2m])) by (le, model_version))",
"legendFormat": "p95 {{model_version}}",
"refId": "B"
},
{
"expr": "histogram_quantile(0.99, sum(rate(ml_prediction_latency_seconds_bucket{model_name=\"$model_name\"}[2m])) by (le, model_version))",
"legendFormat": "p99 {{model_version}}",
"refId": "C"
}
],
"fieldConfig": {
"defaults": {
"unit": "s",
"thresholds": {
"mode": "absolute",
"steps": [
{ "color": "green", "value": null },
{ "color": "yellow", "value": 0.1 },
{ "color": "red", "value": 0.5 }
]
}
}
}
},
{
"id": 3,
"title": "Data Drift Score",
"type": "gauge",
"gridPos": { "x": 0, "y": 8, "w": 8, "h": 6 },
"datasource": { "type": "prometheus", "uid": "Prometheus" },
"targets": [
{
"expr": "ml_data_drift_score{model_name=\"$model_name\"}",
"legendFormat": "{{feature_set}}",
"refId": "A"
}
],
"fieldConfig": {
"defaults": {
"unit": "none",
"min": 0,
"max": 1,
"thresholds": {
"mode": "absolute",
"steps": [
{ "color": "green", "value": null },
{ "color": "yellow", "value": 0.1 },
{ "color": "red", "value": 0.25 }
]
}
}
}
},
{
"id": 4,
"title": "Prediction Confidence Distribution (heatmap)",
"type": "heatmap",
"gridPos": { "x": 8, "y": 8, "w": 16, "h": 6 },
"datasource": { "type": "prometheus", "uid": "Prometheus" },
"targets": [
{
"expr": "sum(rate(ml_prediction_confidence_bucket{model_name=\"$model_name\"}[5m])) by (le)",
"legendFormat": "{{le}}",
"refId": "A",
"format": "heatmap"
}
]
}
]
}

Praktische Ressourcen

  • Grafana-Dokumentation — Offizielle Dokumentation zu Installation, Datenquellen, Dashboards, Alerting und Provisioning.
  • Grafana-Dashboard-Best-Practices — Offizieller Leitfaden zur Strukturierung effektiver Dashboards, Verwendung von Template-Variablen und Organisation von Panels.
  • Grafana-Terraform-Provider — Grafana-Datenquellen, Dashboards und Alert-Regeln als Infrastructure-as-Code verwalten.
  • Awesome Grafana — Community-kuratierte Sammlung vorgefertigter Grafana-Dashboards für gängige Infrastruktur-Stacks.
  • Grafana Labs Blog — ML-Observability — Praktische Anleitung zur Einrichtung von ML-Modell-Monitoring-Dashboards mit Grafana und Prometheus.

Siehe auch