Grafana zeigt deinen Systemen beim Arbeiten zu. CPU-Auslastung, Fehlerquoten, Model-Performance—alles in einem Dashboard. Du fragst deine Daten, Grafana beantwortet sie visuell.
Installation
Docker (empfohlen)
version: '3.8'
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=grafana-password
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
volumes:
- grafana_data:/var/lib/grafana
- ./provisioning:/etc/grafana/provisioning
restart: unless-stopped
volumes:
grafana_data:
Starten:
docker compose up -d grafana
Öffne http://localhost:3000 Login: admin / grafana-password
Lokale Installation (Linux)
# Ubuntu/Debian
sudo apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/oss/release/grafana_10.2.0_amd64.deb
sudo dpkg -i grafana_10.2.0_amd64.deb
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
Datasources verbinden
Eine Datasource ist deine Datenquelle (Prometheus, InfluxDB, PostgreSQL, etc.).
Prometheus (metrische Daten)
Prometheus sammelt Metriken von Servern, Docker Containern, Anwendungen.
Setup:
- Administration → Datasources → Add data source
- Prometheus wählen
- URL:
http://prometheus:9090(oderhttp://dein-server:9090) - Save & Test
Was Prometheus liefert:
cpu_usage{instance="server1"} = 45.3
memory_used{instance="server1"} = 8.2GB
docker_container_cpu_usage{container_name="ollama"} = 60.5
Loki (Logs)
Loki speichert und durchsucht Logs.
Setup:
- Datasources → Add → Loki
- URL:
http://loki:3100 - Save & Test
Query Beispiel:
{job="ollama"} | json | level="error"
Zeigt alle Error-Logs aus Ollama.
PostgreSQL (Relationale Daten)
Für Queries auf deiner Datenbank.
Setup:
- Datasources → Add → PostgreSQL
- Host:
postgres:5432 - Database:
mydb - User/Password: deiner DB
- Save & Test
Query Beispiel:
SELECT created_at, count(*) FROM events GROUP BY created_at;
InfluxDB (Zeitreihen)
Alternative zu Prometheus für detaillierte Metriken.
Setup:
- Datasources → Add → InfluxDB
- URL:
http://influxdb:8086 - Database: dein-db
- Save & Test
Dashboards erstellen
Ein Dashboard ist eine Sammlung von Panels (Visualisierungen).
Neues Dashboard
- Home → Create → New Dashboard
- Panel hinzufügen: + Add Panel
- Query schreiben (hängt vom Datasource ab)
- Visualization wählen
- Title + Description
- Save
Panel Types
Time Series (Zeitreihe) Daten über Zeit zeigen (CPU, Memory, Requests/sec).
Datasource: Prometheus
Query: cpu_usage{instance="server1"}
Visualization: Time Series
Y-Axis: CPU %
Stat Eine einzige Zahl prominent anzeigen (jetzt 95% CPU).
Datasource: Prometheus
Query: cpu_usage{instance="server1"}
Visualization: Stat
Thresholds: 0 (green), 70 (yellow), 90 (red)
Table Tabellarische Daten (alle Error-Logs der letzten Stunde).
Datasource: Loki oder PostgreSQL
Query: SELECT timestamp, message FROM errors WHERE timestamp > now() - interval '1 hour'
Visualization: Table
Gauge Anzeiger wie ein Dashboard-Messgerät (0-100%).
Datasource: Prometheus
Query: memory_used / memory_total * 100
Visualization: Gauge
Min: 0, Max: 100
Logs Raw Logs durchsuchen und filtern.
Datasource: Loki
Query: {job="n8n"} | json
Visualization: Logs
Prometheus Query Examples
Metriken sind Zeitreihen mit Labels.
# Aktuelle Wert
cpu_usage
# Mit Filter
cpu_usage{instance="server1"}
cpu_usage{instance=~"server.*"} # Regex
# Funktionen
rate(http_requests[5m]) # Requests pro Sekunde in letzten 5min
increase(errors[1h]) # Gesamtsteigerung Fehler in letzter Stunde
topk(5, memory_used) # Top 5 Memory-Consumer
# Berechnungen
(used_memory / total_memory) * 100 # Prozent
Prometheus Query Builder hat Auto-Complete—klick auf "Metrics" oben.
Variablen und Templating
Variablen machen Dashboards interaktiv. Statt einen Wert hardcoden, wählt der User den Wert.
Dashboard-Variable erstellen
- Dashboard öffnen → Settings (oben rechts)
- Variables → New Variable
- Name:
instance - Datasource: Prometheus
- Query:
label_values(cpu_usage, instance)(alle unterschiedlichen "instance" Werte) - Save
Variable in Panel nutzen
Query im Panel:
cpu_usage{instance="$instance"}
Panel rendert sich neu wenn Variable sich ändert.
Häufige Variablen
# Dropdown mit verfügbaren Services
label_values(http_requests, job)
# Datum-Bereich (Standard-Variable)
$__from, $__to # Wird von Dashboard-Zeitauswahl gesetzt
# Regex-Variablen
{instance=~"$instance"} # User wählt mehrere Items
Alerting
Benachrichtigungen wenn etwas schief läuft.
Alert Rule erstellen
- Alerts → Alert Rules → Create alert rule
- Query:
cpu_usage > 90 - Condition: "IS ABOVE 90"
- Evaluation interval: 1m (jede Minute prüfen)
- For: 5m (mindestens 5min über Schwellenwert = Alert)
- Labels:
severity: critical - Annotation:
{{ instance }} CPU über 90%!
Benachrichtigungen
Alerts können an verschiedene Kanäle gehen:
Slack:
- Administration → Notifications → New contact point
- Type: Slack
- Webhook URL von Slack Integration
- Save
E-Mail:
- Administration → Notifications → New contact point
- Type: Email
- E-Mail-Adresse eingeben
- Save
PagerDuty/Telegram/Discord: Gleiches Prinzip
Notification Policy
Welche Alerts gehen an welche Kontakt-Punkte?
- Alerts → Notification policies
- Define root policy
- Match Labels:
severity=critical→ send to Slack - Match Labels:
severity=warning→ send to Email
Dashboard Provisioning
Dashboards als Code in Git speichern. Beim Container-Start werden sie automatisch importiert.
Provisioning File (Dashboard als JSON)
-
Bestehendes Dashboard exportieren:
- Dashboard öffnen → Share (oben rechts) → Export
- "Save to file" klicken
-
JSON-Datei in
./provisioning/dashboards/speichern:
provisioning/
└── dashboards/
├── ai-monitoring.json
└── system-health.json
- Docker Compose Mount:
volumes:
- ./provisioning:/etc/grafana/provisioning
- Provisioning Config (
./provisioning/dashboards/dashboards.yml):
apiVersion: 1
providers:
- name: 'Default'
orgId: 1
folder: ''
type: file
disableDeletion: false
editable: true
options:
path: /etc/grafana/provisioning/dashboards
- Container restart:
docker compose restart grafana
Dashboards sind jetzt automatisch geladen.
Performance-Tipps
Große Dashboards optimieren
Ein Dashboard mit 50 Panels kann langsam werden.
Lösungen:
- Panels in mehrere Dashboards aufteilen
- Refresh-Interval erhöhen (nicht jede Sekunde aktualisieren)
- Panel Settings → Refresh interval: 30s statt 10s
- Query-Range kürzen (z.B. nur letzte 24h statt 30 Tage)
- Query:
rate(http_requests[5m])stattrate(...[30d])
- Query:
Häufige Query-Fehler
"No data" Meldung:
- Datasource läuft nicht?
- Query-Syntaxfehler?
- Daten existieren nicht in diesem Zeitraum?
Test: Datasources → Test Data Source → "Save & Test" Button
Falsche Metrik-Namen: Prometheus: Metrics Liste anschauen
- URL:
http://prometheus:9090/api/v1/label/__name__/values - Oder in Grafana Panel: "Metrics" button klicken
Zu viele Daten = slow query
Time-range kürzen oder rate() / increase() nutzen (komprimiert Daten).
Best Practices
- Dashboard pro Service: Ollama-Dashboard, n8n-Dashboard, System-Dashboard
- Aussagekräftige Titel: "CPU Usage" statt "cpu"
- Schwellenwerte setzen: Panels mit Alerts verbinden
- Sharing: Dashboard → Share → Public URL (mit Read-Only)
- Backup: Regelmäßig Dashboards exportieren
curl http://localhost:3000/api/dashboards/db/<name> -H "Authorization: Bearer <api-key>"
Checkliste
- Grafana installiert (Docker oder lokal)
- Admin-Account konfiguriert
- Prometheus als Datasource verbunden
- Prometheus Targets läuft (http://prometheus:9090/targets)
- Erstes Panel mit Prometheus-Metrik erstellt
- Time Series, Stat und Gauge Visualisierungen getestet
- Dashboard-Variable (z.B. instance) erstellt
- Alert Rule mit Slack/Email Benachrichtigung konfiguriert
- Dashboard-JSON exportiert
- Provisioning für automatisches Dashboard-Load getestet
