7.5.2 Funktionen 1
Inhalt
Funktion
PromQL bietet eine Vielzahl von Funktionen, um Time Series zu verarbeiten. Wir werden in den Labs nur auf die wichtigsten Funktionen eingehen. Eine Übersicht über sämtliche Funktionen findest du auf https://prometheus.io . In diesem Unterkapitel behandeln wir ausschliesslich Funktionen, welche als Eingabe einen Instant vector akzeptieren. Das Verarbeiten von Time Series wird im Verlauf dieses Labs auch als Aggregation bezeichnet.
Repetition Instant vector
Ein Instant vector ist das Resultat einer PromQL Expression. Er enthält eine oder mehrere Time Series, aber immer nur mit einem einzigen Value pro Serie (der aktuellsten Value).
Beispiel:
net_conntrack_dialer_conn_failed_total
Im Screenshot sehen wir, dass das Query 8 Time Series zurückgibt. Alle Values stammen vom gleichen Zeitpunkt, wir sehen nicht den Verlauf der Values über die Zeit.
sum()
Die Funktion sum()
summiert alle Time Series.
Beispiel:
sum(prometheus_http_requests_total)
Schau dir in deinem Prometheus die Metrik
prometheus_http_requests_total
ohne Aggregation an. Vergleiche dieses mit dem Resultat dersum()
Aggregation. Wie unterscheiden sich die Resultate dieser beiden Queries hinsichtlich der Labels?
count()
Die Funktion count()
zählt, wie viele Time Series der Funktion übergeben wurden.
Beispiel:
count(prometheus_http_requests_total)
avg()
Die avg()
Funktion rechnet den Durchschnitt über die Time Series.
Beispiel:
avg(prometheus_http_requests_total)
sort()
Diese Funktion sortiert die Time Series in der Tabelle nach ihren Values. Die Sortierung erfolgt aufsteigend.
Beispiel:
sort(prometheus_http_requests_total)
Für eine absteigende Sortierung kann die Funktion sort_desc()
verwendet werden.
Aggregationen und Labels
Wenn du einige dieser Queries ausführst, wirst du feststellen, dass das Resultat über keine Labels mehr verfügt:
Der Grund dafür ist, dass die Funktionen ohne weitere Parameter immer alle Labels aggregieren. Beim Query sum(prometheus_http_requests_total)
wird also die Summe über sämtliche Time Series (unabhängig von den Labels) berechnet (selbst wenn ein Label auf sämtlichen Time Series vorhanden ist). Manchmal ist es aber wünschenswert, bestimmte Labels/Dimensionen zu behalten. Um das besser zu verstehen, machen wir ein Beispiel mit den Temperaturmetriken aus Kapitel 2:
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
Mit folgendem Query können wir die Durchschnittstemperatur über alle Räume berechnen:
avg(temp_celsius)
Wir erhalten ein einziges Resultat ohne Labels mit dem Value 19.725
.
Es könnte aber auch interessant sein, die Durchschnittstemperatur pro Raum zu berechnen. Dazu können wir das by()
Keyword verwenden:
avg by(raum) (temp_celsius)
Mit diesem Query erhalten wir zwei Resultate:
{raum="wohnzimmer"} 21.3
{raum="schlafzimmer"} 18.15
Fazit
- Wir haben einige Funktionen von PromQL kennengelernt.
- Wir haben gelernt, wie Prometheus beim Aggregieren mit Labels umgeht.
Im nächsten Unterkapitel lernen wir Range Vectors sowie deren Funktionen kennen.