PromQL Abfragen schreiben
Ziel
In diesem Projekt lernst du, wie man PromQL-Abfragen formuliert, um Metriken im Explore-Tab von Grafana abzufragen. Dabei wirst du Schritt für Schritt:
- erste einfache Abfragen schreiben
- mit Labels und Filtern arbeiten
- Zeitintervalle und Funktionen nutzen
- Aggregationen und Kombinationen erstellen
Hilfsmittel
- Verwende die Prometheus Doku als Referenz.
Aufgabe 1 – In Grafana einloggen
- Öffne Grafana in deinem Browser:
- URL:
https://grafana.cluster.code-{ZAHL}.labs.corewire.de
(ersetze{ZAHL}
mit deiner Instanznummer) - Logge dich mit den Zugangsdaten ein, die dir der Trainer gegeben hat.
Aufgabe 2 – Erste Metriken anzeigen
- Öffne den Explore Tab in der Grafana Web-Oberfläche .
- Stelle sicher, dass oben rechts über der Eingabefläche für die Abfrage
Code
ausgewählt ist. - Formuliere die Abfrage
up
. - Führe sie durch drücken von
Run query
aus.
Die up
Metrik zeigt an, ob ein Target erreichbar ist. Der Wert ist 1 bei Erfolg, 0 bei Nichterreichbarkeit.
Aufgabe 3 – Labels nutzen
- Überprüfe, ob die Node-Exporter-Targets erreichbar sind. Formuliere dazu eine Abfrage, die nur Targets mit der
job
-Bezeichnungnode-exporter
berücksichtigt.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Beispiel:
up{job="node-exporter"}
- Filtere zusätzlich nach einem bestimmten Node Exporter über das
instance
-Feld.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Beispiel:
up{job="node-exporter", instance="10.0.0.1:9100"}
Aufgabe 4 – CPU-Auslastung berechnen
- Die Metrik
node_cpu_seconds_total
zählt die CPU-Zeit pro Modus (z. B. idle, user,
system). Da es sich um einen Zähler handelt, musst du mit rate() die Änderungsrate pro Sekunde berechnen. - Nutze die
rate
-Funktion, um die Zeit über 5 Minuten zu berechnen.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
rate(node_cpu_seconds_total[5m])
- Filtere nur nach
mode=idle
.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
rate(node_cpu_seconds_total{mode="idle"}[5m])
- Bilde den Duchschnitt über alle CPUs einer Node.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)
- Berechne den Teil der CPU-Zeit, der nicht im Idle-Modus ist.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)
Aufgabe 5 – Filesystem Auslastung
- Finde die Metriken
node_filesystem_size_bytes
undnode_filesystem_free_bytes
. - Berechne, wie viel Prozent des Dateisystems belegt sind für Devices mit
mountpoint="/"
.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Beispiel:
1-node_filesystem_free_bytes{mountpoint="/"}/node_filesystem_size_bytes{mountpoint="/"}
Aufgabe 6 – Aggregationen
- Verwende
avg
,sum
,min
,max
Funktionen. Berechne: - die durchschnittliche CPU-Auslastung über alle
idle
-Nodes
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Beispiel:
1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))
- den minimalen freien Speicher aller Systeme für den
mountpoint="/"
.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Beispiel:
min(node_filesystem_free_bytes{mountpoint="/"})
- die Summe aller empfangenen Netzwerkbytes (
node_network_receive_bytes_total
) an einem bestimmten Device.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Beispiel:
sum(node_network_receive_bytes_total{device="enp7s0"})
enp7s0
durch ein Interface, das bei dir existiert.)
Aufgabe 7 – Abfragen kombinieren (optional)
- Berechne die belegte Speichermenge je Node in Prozent. Nutze die
Metriken
node_memory_MemAvailable_bytes
undnode_memory_MemTotal_bytes
.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
- In einer zweiten Metrik node_uname_info findest du den Hostnamen (nodename) als Label.
- Kombiniere nun beide Metriken, sodass der Hostname (nodename) in der Ausgabe auftaucht. Verwende dazu
on
undgroup_left
.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * on(instance) group_left(nodename) node_uname_info