Prometheus & Grafana: Server-Monitoring einrichten

Step-by-step guide to setting up Prometheus and Grafana for server monitoring on Linux with practical dashboard examples and alerting rules.

Prometheus & Grafana: Server-Monitoring einrichten

Monitoring habe ich jahrelang aufgeschoben. Es gibt diesen Punkt, wo man weiß, dass man's einrichten sollte, aber das nächste Feature, der nächste Bug, der nächste Spam-Angriff wichtiger erscheinen. Ich bin erst dazu gekommen, nachdem mein Mailserver dreimal in einer Woche aus Speichermangel gestorben war und ich keine Ahnung hatte, was den RAM frisst — Prometheus + Grafana hätte mir das in zwei Klicks gezeigt.

Heute läuft beides auf jedem Server, den ich neu aufsetze. Nicht weil's Pflicht ist, sondern weil's einmal eingerichtet praktisch wartungsfrei ist und Probleme zeigt, bevor sie auf das Frontend durchschlagen.

Was du wirklich brauchst

Für einen einzelnen VPS reichen drei Komponenten:

  • Node Exporter — sammelt System-Metriken (CPU, RAM, Disk, Netzwerk)
  • Prometheus — fragt regelmäßig die Exporter ab und speichert die Daten
  • Grafana — visualisiert die Daten

Optional dazu: Alertmanager für Mail- oder Telegram-Alerts. Ich nutze ihn, aber für den Anfang nicht zwingend.

Installation

Auf Debian/Ubuntu reichen die Pakete aus den offiziellen Repos:

apt install prometheus prometheus-node-exporter grafana

Wer aktuelle Versionen will, nimmt die Tarballs von prometheus.io und grafana.com. Mein Setup: Prometheus aus Tarball, Node Exporter und Grafana aus apt — Grafana macht regelmäßig Releases, Prometheus seltener, aber die Differenz zwischen Distro und Upstream ist bei Prometheus größer.

Prometheus konfigurieren

/etc/prometheus/prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']

Das nginx-Target braucht den separaten nginx-prometheus-exporter und nginx mit stub_status aktiviert. Lohnt sich für Web-Server, ist aber optional.

scrape_interval: 15s ist meiner Meinung nach das richtige Trade-off. 5s wäre zu viel I/O. 60s reicht oft nicht, um kurzfristige Spitzen zu sehen.

systemctl restart prometheus

Prometheus läuft auf Port 9090. Über :9090/targets siehst du, ob alle Exporter erreichbar sind.

Grafana einrichten

systemctl enable --now grafana-server

Läuft auf Port 3000. Erster Login: admin/admin, sofort ändern.

Datenquelle hinzufügen: Configuration → Data Sources → Prometheus → URL http://localhost:9090. Save & Test.

Statt eigene Dashboards zu bauen: importieren. Dashboard-ID 1860 ("Node Exporter Full") ist die Standard-Wahl für System-Metriken — fertige Visualisierungen für CPU, RAM, Disk I/O, Netzwerk-Verkehr, alles. Configuration → Dashboards → Import → 1860 → Prometheus als Datenquelle wählen.

Das ist 80 % von dem, was die meisten Leute brauchen, in 5 Minuten konfiguriert.

Was ich daraus gelernt habe

Nach ein paar Wochen Monitoring sah ich Sachen, die mir vorher entgangen waren:

  • Nginx-Worker, die alle 12 Stunden alle Verbindungen verlieren — Bug in einer alten Version
  • Eine Nachts-Cron-Aufgabe, die regelmäßig 95 % CPU für 8 Minuten frisst
  • Memory-Leak in einem Service, der über Tage langsam wuchs

Nichts davon hatte direkt sichtbare Auswirkungen, aber alle drei waren Indikatoren für Probleme, die später hätten weh tun können.

Alerting — wenn man ehrlich sein will

Alertmanager ist mächtig und konfigurationsintensiv. Für den Solo-Operator reicht oft ein simples Pattern: bei kritischen Schwellwerten (Disk > 90 %, Memory > 95 %, Service down) wird gemailt oder per Telegram-Bot benachrichtigt.

Beispiel-Rule in /etc/prometheus/rules.yml:

groups:
  - name: basic
    rules:
      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.1
        for: 5m
        annotations:
          summary: "Disk fast voll auf {{ $labels.instance }}"

Wichtig: for: 5m — der Alert feuert nur, wenn der Zustand 5 Minuten anhält. Sonst gibt's bei jedem kurzfristigen Spike eine Mail.

Was Prometheus nicht macht

Prometheus ist eine Metrik-Datenbank, kein Log-Aggregator. Wer Logs sammeln will, braucht Loki (passt gut zu Grafana) oder etwas wie Vector + ElasticSearch. Logs und Metriken sind zwei unterschiedliche Probleme — ein einzelner Tool-Stack für beides existiert, aber meist mit Kompromissen.

Für mich reicht Prometheus + Grafana. Logs schaue ich mir bei Bedarf per journalctl an, und das funktioniert genau dann, wenn Prometheus mir gezeigt hat, an welchem Punkt es spannend wird.