7.5 PromQL
Inhalt
Intro
PromQL ist die Abfragesprache, mit welcher wir die Daten in der Prometheus TSDB abfragen und verarbeiten können. PromQL erlaubt es uns, die Werte von Metriken abzufragen, Metriken anhand von Labels zu filtern, Metriken zu aggregieren (z.B. Durchschnitte oder Summen berechnen) und die Resultate grafisch darzustellen. Die Syntax von PromQL unterscheidet sich stark von anderen Abfragesprachen wie z.B. SQL. Um Abfragen zu starten, verwenden wir das Prometheus-Webinterface .
Die Bedeutung der Metriken in den folgenden Beispielen ist zweitrangig. Es geht primär darum, die Abfragesprache zu verstehen und weniger darum, die Bedeutung hinter der Metrik zu verstehen.
Einführung PromQL
Abfragen einer Metrik
Wir starten mit einer einfachen Abfrage, mit welcher wir uns alle Time Series der Metrik net_conntrack_dialer_conn_failed_total
anzeigen. Dazu geben wir den Namen der Metrik (net_conntrack_dialer_conn_failed_total
) im Expression Browser ein und klicken auf Execute:
In der Tabelle wird eine Liste aller Time Series mit diesem Namen angezeigt. Sie gehören alle zur gleichen Metrik, haben aber unterschiedliche Labels. Wie du siehst, kann eine Time Series auch mehrere Labels besitzen.
Filtern anhand von Labels
Anhand der Labels können wir das Resultat in der Liste nun filtern. Wenn wir beispielsweise nur die Time Series mit dem Label dialer_name="default"
sehen möchten, passen wir unser Query wie folgt an:
net_conntrack_dialer_conn_failed_total{dialer_name="default"}
Wir fügen das Label in geschweiften Klammern hinter dem Metriknamen hinzu. In der Tabelle sehen wir jetzt nur noch die Time Series mit dem Namen net_conntrack_dialer_conn_failed_total
und dem Label dialer_name="default"
. Wir können das Resultat noch weiter einschränken, indem wir ein weiteres Label hinzufügen:
net_conntrack_dialer_conn_failed_total{dialer_name="default",reason="refused"}
Diese Labels in PromQL Queries bezeichnen wir als Label selectors (Selektieren/Filtern von Metriken anhand bestimmter Labels). In diesem Beispiel haben wir Time Series mit einem bestimmten Label gesucht. Diese Logik kann jedoch auch verändert werden, indem anstelle des =
ein anderer matching operator verwendet wird. Dir stehen dabei folgende matching operators zur Verfügung:
=
: Wählt alle Metriken aus, deren Label-Wert exakt mit der angegebenen Zeichenkette übereinstimmt.!=
: Wählt alle Metriken aus, deren Label-Wert nicht mit der angegebenen Zeichenkette übereinstimmt.=~
: Wählt alle Metriken aus, deren Label-Wert mit dem angegebenen regulären Ausdruck (Regex) übereinstimmt.!
: Wählt alle Metriken aus, deren Label-Wert nicht mit dem angegebenen regulären Ausdruck übereinstimmt.
Hier ein paar Beispiele:
temp_celsius{raum="wohnzimmer"}
Selektiert die Time Series mit dem Namen temp_celsius
und dem Label raum="wohnzimmer"
.
temp_celsius{raum!="wohnzimmer"}
Selektiert die Time Series mit dem Namen temp_celsius
, welche im Label raum
nicht den Wert wohnzimmer
besitzen.
temp_celsius{raum=~".+zimmer"}
Selektiert die Time Series mit dem Namen temp_celsius
welche im Label raum
einen Wert besitzen, welcher auf zimmer
endet.
temp_celsius{raum!~".+zimmer"}
Selektiert die Time Series mit dem Namen temp_celsius
welche im Label raum
einen Wert besitzen, welcher nicht auf zimmer
endet.
Filtern anhand von Vergleichsoperatoren
Zusätzlich zum Filtern anhand von Labels können wir Time Series auch anhand ihres Sample Values filtern. Dazu stehen uns folgende Operatoren zur Verfügung:
==
: gleich!=
: ungleich>
: grösser als<
: kleiner als>=
: grösser oder gleich<=
: kleiner oder gleich
Wir machen einige Beispiele mit folgenden Time Series:
temp_celsius{raum="wohnzimmer", sensor="sensor1"} 21.2
temp_celsius{raum="wohnzimmer", sensor="sensor2"} 21.4
temp_celsius{raum="schlafzimmer", sensor="sensor1"} 18.1
temp_celsius{raum="schlafzimmer", sensor="sensor2"} 18.2
Beispiel mit dem ==
Operator:
temp_celsius == 18.1
Das Ergebnis beinhaltet sämtliche Time Series der Metrik temp_celsius
, deren Wert bei genau 18.1
liegt.
Beispiel mit dem >
Operator:
temp_celsius > 19
Das Ergebnis beinhaltet sämtliche Time Series der Metrik temp_celsius
, deren Wert grösser als 19 ist.
Natürlich lassen sich Label selectors und Vergleichsoperatoren auch kombinieren:
temp_celsius{raum="schlafzimmer"} > 19
Instant vector
Wir haben bereits einige Aspekte von Time Series/Zeitreihen beleuchtet. Beim Ausführen unserer PromQL Queries in der Tabellenansicht sehen wir je nach Label selector auch mehrere Resultate. Es ist aber wichtig zu verstehen, dass es sich dabei um mehrere Time Series handelt und nicht um eine Darstellung über die Zeit. Die Resultate in der Tabelle waren mit unseren bisherigen Queries immer das Ergebnis des letzten Scrapevorgangs und repräsentieren damit den aktuellsten Wert jeder einzelnen Time Series. Die Tabelle gab uns bisher aber keine Informationen darüber, wie sich die Time Series über die Zeit verhalten haben. Ein solches Resultat nennen wir Instant vector. Prometheus Queries können alternativ weitere Datentypen zurückgeben (auf diese gehen wir in den nächsten Unterkapitel ein).
Fazit
- PromQL ist die Abfragesprache, mit welcher wir Daten aus der TSDB abfragen können.
- Wir können Time Series abfragen, indem wir deren Namen im Prometheus Expression Browser eingeben.
- Wir können Time Series filtern, indem wir Label selectors definieren
Im nächsten Unterkapitel Arithmetik schauen wir uns an, wie wir mit PromQL Berechnungen durchführen können und was dabei Besonderes beachtet werden muss.