Prometheus
Prometheus ist das De-facto-Standard-Tool fürs Metrik-Monitoring: eine eingebettete Zeitreihen-Datenbank, die Messwerte selbstständig von deinen Geräten und Services abholt. Ideal für IoT-, OT- und Infrastruktur-Überwachung.
Wer Sensoren, Edge-Gateways oder Server betreibt, will wissen, wie es ihnen geht: CPU-Last, Speicher, Temperatur, Durchsatz, Fehlerraten. Genau dafür ist Prometheus gebaut. Es ist gleichzeitig ein Monitoring-System und eine spezialisierte Zeitreihen-Datenbank (TSDB), die Messwerte über die Zeit speichert und abfragbar macht. In dieser Anleitung erfährst du, was Prometheus ausmacht, wofür es sich im IoT-/Infrastruktur-Umfeld eignet und wie du es mit Docker und persistentem Speicher startest.
Was ist Prometheus?
Prometheus ist ein quelloffenes Monitoring- und Alerting-System mit einer eingebauten Zeitreihen-Datenbank. Es speichert numerische Messwerte (Metriken) zusammen mit einem Zeitstempel und beliebigen Labels, sodass du später gezielt auswerten kannst, wie sich ein Wert über Minuten, Stunden oder Tage entwickelt hat. Das Besondere: Prometheus arbeitet im Pull-Modell. Statt darauf zu warten, dass Geräte ihre Werte einschicken, holt Prometheus die Daten in festen Intervallen aktiv von definierten Zielen (Targets) ab, indem es deren HTTP-Endpoint /metrics abfragt (scraping). Ausgewertet wird mit der mächtigen Abfragesprache PromQL, die Aggregationen, Raten und Schwellwert-Vergleiche direkt auf den Zeitreihen erlaubt.
Wofür eignet es sich?
Infrastruktur- und Server-Monitoring. In Kombination mit dem node_exporter überwachst du CPU, RAM, Festplatten, Netzwerk und Last deiner Linux-Hosts und Gateways - der Klassiker für jedes Homelab und jede Produktivumgebung.
IoT- und OT-Metriken. Edge-Geräte und viele Industrie-Komponenten exponieren Messwerte (Temperatur, Durchsatz, Verbindungsstatus) über einen /metrics-Endpoint oder einen passenden Exporter, den Prometheus regelmässig abholt.
Alerting auf Schwellwerte. Über Regeln definierst du Bedingungen (etwa Speicher unter 10 Prozent), die bei Verletzung an den Alertmanager weitergereicht und von dort als Mail, Webhook oder Chat-Nachricht zugestellt werden.
Datenquelle für Dashboards. Prometheus liefert die Zahlen, Grafana macht die Bilder daraus - die Kombination ist der gängige Stack für Live-Dashboards und historische Trendanalysen.
Konzepte und Grenzen
Pull statt Push. Prometheus zieht Daten aktiv von Targets. Für kurzlebige Batch-Jobs, die nicht dauerhaft erreichbar sind, gibt es das Pushgateway als Zwischenspeicher.
Lokale TSDB, kein Cluster. Die eingebettete Datenbank ist auf einen einzelnen Knoten und kurze bis mittlere Aufbewahrung ausgelegt. Für langfristige oder hochverfügbare Speicherung kombiniert man Prometheus mit Remote-Storage-Lösungen wie Thanos oder Cortex/Mimir.
Numerische Metriken, keine Logs. Prometheus ist für Zahlenreihen gedacht, nicht für Volltext-Logs oder Traces - dafür kommen ergänzende Werkzeuge zum Einsatz.
Konfiguration als Datei. Scrape-Ziele und Regeln stehen in der prometheus.yml. Änderungen werden per Neustart oder Reload (z.B. POST auf /-/reload bei aktiviertem --web.enable-lifecycle) aktiv - versioniere diese Datei am besten in Git.
Prometheus speichert nur numerische Zeitreihen und visualisiert selbst kaum etwas. In der Praxis kombinierst du es fast immer mit Grafana (Dashboards) und optional dem Alertmanager (Benachrichtigungen). Die Metriken liefern Exporter wie der node_exporter - Prometheus holt sie dort aktiv ab.
Installation mit Docker
Prometheus selbst läuft als einzelner Container aus dem offiziellen Image prom/prometheus. Wichtig sind zwei Pfade: Die Zeitreihen-Datenbank liegt im Container unter /prometheus - dieser Pfad muss als benanntes Volume persistiert werden, sonst sind nach jedem Neustart alle Messwerte weg. Die Konfiguration liest Prometheus aus /etc/prometheus/prometheus.yml; diese Datei mountest du als Bind-Mount von deinem Host hinein, damit du Scrape-Ziele bequem pflegen und versionieren kannst. Lege dazu zuerst eine lokale prometheus.yml an. Hinweis: Beide Pfade sind bereits die Standardwerte des Images (--config.file und --storage.tsdb.path) - wir setzen die Flags in run und compose trotzdem explizit, damit beide Varianten identisch und nachvollziehbar sind.
1# 1) Minimale Konfiguration anlegen (scrapt sich selbst)2cat > prometheus.yml <<'EOF'3global:4 scrape_interval: 15s5scrape_configs:6 - job_name: 'prometheus'7 static_configs:8 - targets: ['localhost:9090']9EOF1011# 2) Container mit benanntem Volume fuer die TSDB starten12docker run -d \13 --name prometheus \14 -p 9090:9090 \15 -v prometheus_data:/prometheus \16 -v "$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml:ro" \17 prom/prometheus \18 --config.file=/etc/prometheus/prometheus.yml \19 --storage.tsdb.path=/prometheus
Oder als wiederverwendbare docker-compose.yml:
1services:2 prometheus:3 image: prom/prometheus4 container_name: prometheus5 restart: unless-stopped6 ports:7 - "9090:9090"8 volumes:9 - prometheus_data:/prometheus10 - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro11 command:12 - '--config.file=/etc/prometheus/prometheus.yml'13 - '--storage.tsdb.path=/prometheus'1415 # Optional: Host-Metriken liefern (CPU, RAM, Disk) - Prometheus scrapt :910016 # Wichtig: host-Namespaces + rootfs-Mount, sonst misst der Exporter nur den Container,17 # nicht den echten Host.18 node-exporter:19 image: prom/node-exporter20 container_name: node-exporter21 restart: unless-stopped22 pid: host23 network_mode: host24 volumes:25 - /:/host:ro,rslave26 command:27 - '--path.rootfs=/host'2829volumes:30 prometheus_data:
Das Volume prometheus_data hält deine gesamte Messhistorie - lösche es nicht versehentlich mit docker volume rm. Die prometheus.yml ist read-only gemountet (:ro), damit der Container sie nicht verändert; pflege Scrape-Ziele also auf dem Host. Stelle Port 9090 niemals ungeschützt ins Internet: Prometheus bringt von Haus aus keine Authentifizierung mit, also sichere es über einen Reverse-Proxy mit Login oder ein internes Netz ab. Damit der node_exporter im Compose-Beispiel auch erfasst wird, ergänze ihn als Target in der prometheus.yml. Weil er hier mit network_mode: host läuft, erreichst du ihn unter der Host-Adresse, z.B. targets: ['<host-ip>:9100'] - im Container-Netz (172.x) ist 'node-exporter:9100' dann NICHT auflösbar.
Nach dem Start prüfst du, ob die Web-Oberfläche erreichbar ist und Prometheus bereits Daten sammelt:
1# Health-Check der API (gibt "Prometheus Server is Healthy." zurueck)2curl http://localhost:9090/-/healthy34# Im Browser oeffnen und unter Status > Targets pruefen5# http://SERVER:9090
Fazit
Prometheus ist der Quasi-Standard für Metrik-Monitoring - leichtgewichtig im Betrieb, aber mit einer mächtigen Abfragesprache und einer robusten eingebetteten Zeitreihen-Datenbank. Für den Einstieg reicht ein einziger Container, sofern du den Datenpfad /prometheus als benanntes Volume sicherst und die prometheus.yml sauber pflegst. Sein volles Potenzial entfaltet es im Verbund: Exporter liefern die Metriken, Prometheus speichert und wertet sie aus, Grafana visualisiert und der Alertmanager schlägt Alarm. Damit hast du eine offene, herstellerneutrale Monitoring-Basis, die vom Homelab bis zur IoT-Flotte mitwächst.
