7.5.1 Arithmetik
Inhalt
Arithmetik
PromQL unterstützt arithmetische Operationen wie Addition, Subtraktion, Multiplikation usw. Damit lassen sich die Resultate von PromQL Queries verändern.
Die Operationen haben immer nur Einfluss auf die Resultate der Queries. Die den Queries zugrundeliegenden Daten in der TSDB sind read only und können nicht verändert werden.
Als Operanden können folgende Datentypen verwendet werden:
- Scalar (einfache Zahlen, welche nicht zu einer Metrik gehören)
- Instant vectors (Resultate aus einem Query wie z.B.
net_conntrack_dialer_conn_failed_total{dialer_name="default"}
)
Hier einige Beispiele:
Scalar + Scalar:
1 + 2
Beide Operanden (1
und 2
) sind Scalars. Sie gehören zu keiner Metrik, PromQL funktioniert in diesem Beispiel wie ein Taschenrechner.
Instant vector + scalar:
net_conntrack_dialer_conn_failed_total + 1
Der erste Operand ist ein Instant vector, der zweite ist ein Scalar. Prometheus holt dabei zuerst alle Time Series mit dem Namen net_conntrack_dialer_conn_failed_total
und addiert zu jeder Time Series 1 dazu. Die folgende Grafik veranschaulicht das Verhalten:
Instant vector + Instant vector
Das dritte Beispiel ist etwas komplizierter. Hier versuchen wir, zwei instant vectors zu addieren:
prometheus_api_notification_active_subscribers + prometheus_http_requests_total{handler="/", code="200"}
Gib dieses Query im Expression Browser deines Prometheus ein. Du wirst feststellen, dass dieses Query kein Resultat liefert. Versuche anhand des “Explain” Tabs in Prometheus herauszufinden warum, bevor du deine Erkenntnisse mit folgender Erklärung abgleichst:
Erklärung
Bestehen bei einer arithmetischen Operation beide Operanden aus Instant vectors, muss Prometheus wissen, welche Time Series des ersten Operanden mit welcher Time Series des zweiten Operanden addiert werden soll. Nehmen wir an, in der Prometheus TSDB sind folgende Time Series gespeichert:
prometheus_api_notification_active_subscribers{job="test", foo="bar"} 1
prometheus_api_notification_active_subscribers{job="test", foo="baz"} 2
prometheus_http_requests_total{job="test", handler="/", code="200"} 3
Im PromQL Ausdruck haben wir definiert, dass wir die Time Series der Metrik prometheus_api_notification_active_subscribers
zu den Time Series der Metrik prometheus_http_requests_total{handler="/", code="200"}
addieren möchten. Prometheus versucht nun herauszufinden, welche Time Series auf diesen beiden Seiten des +
zusammengehören. Dabei sind die Labels entscheidend. Die Zuordnung ist nur erfolgreich, wenn auf beiden Seiten eine Time Series mit identischen Labels vorhanden ist. Der Ablauf ist grob wie folgt:
- Prometheus holt aus der Datenbank die erste Time Series der Metrik
prometheus_api_notification_active_subscribers
. In unserem Fall lautet dieseprometheus_api_notification_active_subscribers{job="test", foo="bar"}
. - Nun sucht Prometheus nach der Metrik
prometheus_http_requests_total
mit den identischen Labels, in unserem Fall wäre dasprometheus_http_requests_total{job="test", foo="bar"}
. - Wie du siehst, existiert diese Time Series nicht. Wir haben nur
prometheus_http_requests_total{job="test", handler="/", code="200"}
, die Labels stimmen aber nicht überein. - Prometheus kann also diese Addition nicht durchführen und versucht das gleiche jetzt noch mit der zweiten Time Series unserer Metrik
prometheus_api_notification_active_subscribers
. Allerdings stimmen auch hier die Labels nicht überein. Prometheus beendet das Query, ohne ein Resultat zu liefern.
Über den “Explain” Tab in Prometheus lässt sich dieser Ablauf visualisieren:
Anstatt dass Prometheus selbstständig versucht, die Time Series der beiden Operanden miteinander zu verbinden, können wir mit dem Keyword on()
manuell definieren, welche Labels berücksichtigt werden sollen. Passe dein Query wie folgt an:
prometheus_api_notification_active_subscribers + on(job) prometheus_http_requests_total{handler="/", code="200"}
Damit sollte Prometheus nun ein Resultat zurückgeben. Mit on(job)
haben wir definiert, dass Prometheus ausschliesslich auf das Label job
achten soll. Alle weiteren Labels werden fürs Matching der Operanden ignoriert.
Weitere arithmetische Operationen
Zusätzlich zum +
Operator werden noch weitere Operatoren unterstützt:
-
: Subtraktion*
: Multiplikation/
: Division%
: Modulo^
: Potenzierung
Fazit
- PromQL unterstützt arithmetische Operationen.
- Diese Operationen können auf Scalars (Zahlen ohne Bezug zu einer Time Series) oder Instant vectors (das Resultat einer Time Series zu einem definierten Zeitpunkt) angewendet werden.
- Bestehen beide Operanden aus einem Instant vector, müssen die Labels beider Time Series übereinstimmen. Alternativ dazu, kann mit dem
on()
Keyword fürs Matching zu verwendende Labelset definiert werden.
Im nächsten Unterkapitel beschäftigen wir uns mit den in PromQL verfügbaren Funktionen.