6 Anhang A

6.1 PromQL

6.1.1 Grundlagen von PromQL

PromQL (Prometheus Query Language) ist eine flexible und leistungsfähige Abfragesprache, die speziell für das Arbeiten mit Zeitreihendaten in Prometheus entwickelt wurde. Dieses Kapitel behandelt die grundlegenden Konzepte, die Syntax und die wichtigsten Operatoren und Funktionen von PromQL.

6.1.1.1 Syntax und Struktur

PromQL-Abfragen bestehen aus Ausdrücken, die auf Zeitreihen-Daten operieren. Die grundlegende Syntax von PromQL kann in folgende Elemente unterteilt werden:

Beispiele:

# Instant Query: gibt den aktuellen Wert der Metrik 'node_cpu_seconds_total' zurück
node_cpu_seconds_total

# Range Query: gibt den Durchschnittswert der Metrik 'node_cpu_seconds_total' über die letzten 5 Minuten zurück
avg_over_time(node_cpu_seconds_total[5m])

6.1.1.2 Operatoren und Funktionen

PromQL bietet eine Vielzahl von Operatoren und Funktionen, um komplexe Abfragen zu formulieren und Daten zu analysieren. Hier sind einige der wichtigsten:

6.1.1.2.1 Operatoren

Beispiele:

# Arithmetische Operation: addiert zwei Metriken
node_cpu_seconds_total + node_memory_MemFree_bytes

# Vergleichsoperation: filtert Zeitreihen, die größer als ein bestimmter Wert sind
node_filesystem_size_bytes > 1e12

# Logische Operation: kombiniert zwei Bedingungen
up == 1 and node_load1 > 0.5
6.1.1.2.2 Funktionen

PromQL bietet eine Vielzahl von Funktionen, die auf Zeitreihendaten angewendet werden können. Hier sind einige der wichtigsten Aggregations- und Analysefunktionen, die häufig verwendet werden:

Beispiele:

# Summe der CPU-Zeit über alle Kerne
sum(node_cpu_seconds_total)

# Durchschnittlicher Speicherverbrauch
avg(node_memory_MemAvailable_bytes)

# Maximaler Plattenplatz eines Dateisystems
max(node_filesystem_size_bytes)

# Minimaler Plattenplatz eines Dateisystems
min(node_filesystem_size_bytes)

Beispiele:

# Änderungsrate der CPU-Zeit über die letzten 5 Minuten
rate(node_cpu_seconds_total[5m])

# Sofortige Änderungsrate der CPU-Zeit
irate(node_cpu_seconds_total[5m])

# Gesamter Anstieg des Festplattenplatzes über die letzten 24 Stunden
increase(node_filesystem_size_bytes[24h])

Beispiele:

# Top 5 CPU-Verbraucher
topk(5, node_cpu_seconds_total)

# Bottom 5 Speicherverbraucher
bottomk(5, node_memory_MemAvailable_bytes)

Mit diesen Grundlagen können Sie komplexe Abfragen erstellen und tiefere Einblicke in Ihre Metriken gewinnen. In den folgenden Kapiteln werden wir uns mit spezifischen Abfragen und erweiterten Techniken in PromQL beschäftigen.

6.1.1.3 Unterschied zwischen rate und irate

In PromQL gibt es zwei wichtige Funktionen zur Berechnung der Änderungsrate: rate() und irate(). Beide Funktionen werden verwendet, um die Änderungsrate von Zählern über einen bestimmten Zeitraum zu berechnen, jedoch gibt es wesentliche Unterschiede in ihrer Anwendung und den Ergebnissen, die sie liefern.

6.1.1.3.1 rate()

Die Funktion rate() berechnet die durchschnittliche Änderungsrate pro Sekunde über ein angegebenes Zeitfenster. Diese Funktion ist nützlich, um langfristige Trends und durchschnittliche Änderungsraten zu beobachten. Sie glättet die Daten über das Zeitfenster und ist weniger empfindlich gegenüber kurzfristigen Schwankungen.

Beispiel:

# Berechnet die durchschnittliche Änderungsrate der CPU-Zeit über die letzten 5 Minuten
rate(node_cpu_seconds_total[5m])
6.1.1.3.2 irate()

Die Funktion irate() berechnet die sofortige Änderungsrate zwischen den letzten beiden Stichproben im angegebenen Zeitfenster. Diese Funktion liefert einen genaueren und aktuelleren Wert der Änderungsrate, da sie nur die letzten beiden Datenpunkte berücksichtigt. irate() ist nützlich, um schnelle, kurzfristige Änderungen zu erkennen.

Beispiel:

# Berechnet die sofortige Änderungsrate der CPU-Zeit über die letzten 5 Minuten
irate(node_cpu_seconds_total[5m])
6.1.1.3.3 Zusammenfassung der Unterschiede
6.1.1.3.4 Einfache Veranschaulichung mit Beispiel

Stellen Sie sich vor, Sie möchten die Änderungsrate der CPU-Auslastung auf Ihrem Server über die letzten 5 Minuten beobachten.

  1. rate() Beispiel:
  2. irate() Beispiel:

Kurz gesagt, rate() gibt Ihnen einen Durchschnitt über eine längere Zeit, um allgemeine Trends zu sehen, während irate() Ihnen die sofortige Änderungsrate zeigt, um schnelle, kurzfristige Änderungen zu erkennen.

6.1.1.4 Matchers in PromQL

Matchers sind ein wesentlicher Bestandteil von PromQL, da sie es ermöglichen, spezifische Zeitreihen auszuwählen und zu filtern. Matchers werden in geschweiften Klammern {} verwendet und bestehen aus Labels und Bedingungen, die angeben, welche Zeitreihen in die Abfrage einbezogen werden sollen.

6.1.1.4.1 Arten von Matchern

Es gibt verschiedene Arten von Matchern, die in PromQL verwendet werden können:

  1. Gleichheitsmatcher (=)
  2. Ungleichheitsmatcher (!=)
  3. Regex-Matcher (=~)
  4. Negierter Regex-Matcher (!~)
6.1.1.4.2 Gleichheitsmatcher (=)

Der Gleichheitsmatcher wird verwendet, um Zeitreihen auszuwählen, deren Labels exakt mit dem angegebenen Wert übereinstimmen.

Beispiele:

# Wählt alle Zeitreihen aus, bei denen das Label 'instance' genau 'host1' ist
node_cpu_seconds_total{instance="host1"}
6.1.1.4.3 Ungleichheitsmatcher (!=)

Der Ungleichheitsmatcher wird verwendet, um Zeitreihen auszuwählen, deren Labels nicht mit dem angegebenen Wert übereinstimmen.

Beispiele:

# Wählt alle Zeitreihen aus, bei denen das Label 'instance' nicht 'host1' ist
node_cpu_seconds_total{instance!="host1"}
6.1.1.4.4 Regex-Matcher (=~)

Der Regex-Matcher wird verwendet, um Zeitreihen auszuwählen, deren Labels mit einem regulären Ausdruck übereinstimmen. Dies ist besonders nützlich, um Muster in den Labels zu finden.

Beispiele:

# Wählt alle Zeitreihen aus, bei denen das Label 'instance' mit 'host' beginnt und mit einer Zahl endet
node_cpu_seconds_total{instance=~"host[0-9]+"}
6.1.1.4.5 Negierter Regex-Matcher (!~)

Der negierte Regex-Matcher wird verwendet, um Zeitreihen auszuwählen, deren Labels nicht mit einem regulären Ausdruck übereinstimmen.

Beispiele:

# Wählt alle Zeitreihen aus, bei denen das Label 'instance' nicht mit 'host' beginnt und mit einer Zahl endet
node_cpu_seconds_total{instance!~"host[0-9]+"}
6.1.1.4.6 Kombination von Matchern

Matchers können kombiniert werden, um spezifischere Abfragen zu erstellen. Dies ermöglicht es, Zeitreihen anhand mehrerer Bedingungen gleichzeitig zu filtern.

Beispiele:

# Wählt alle Zeitreihen aus, bei denen das Label 'instance' 'host1' ist und das Label 'mode' 'user' ist
node_cpu_seconds_total{instance="host1", mode="user"}

# Wählt alle Zeitreihen aus, bei denen das Label 'instance' nicht 'host1' ist und das Label 'mode' nicht 'idle' ist
node_cpu_seconds_total{instance!="host1", mode!="idle"}
6.1.1.4.7 Beispiele für komplexe Regex-Matcher

Regex-Matcher können komplexere Muster abdecken und sind nützlich, um flexible und dynamische Filterkriterien zu erstellen.

Beispiele:

# Wählt alle Zeitreihen aus, bei denen das Label 'job' mit 'node_exporter' beginnt und beliebigen Zeichen folgt
node_cpu_seconds_total{job=~"node_exporter.*"}

# Wählt alle Zeitreihen aus, bei denen das Label 'mode' entweder 'user' oder 'system' ist
node_cpu_seconds_total{mode=~"^(user|system)$"}

Matcher sind ein wichtiges Werkzeug in PromQL, das Ihnen erlaubt, präzise und flexible Abfragen zu erstellen. Durch die Verwendung von Gleichheits- und Ungleichheitsmatchern, sowie regulären Ausdrücken, können Sie spezifische Zeitreihen effizient filtern und analysieren. Das Verständnis und die richtige Anwendung von Matchern sind entscheidend, um das volle Potenzial von PromQL auszuschöpfen und detaillierte Einblicke in Ihre Überwachungsdaten zu erhalten.

6.1.2 Abfragen mit PromQL

PromQL bietet eine Vielzahl von Möglichkeiten, um Daten abzufragen und zu analysieren. In diesem Kapitel werden verschiedene Arten von Abfragen vorgestellt, die Sie in Ihrer Überwachungsumgebung verwenden können.

6.1.2.1 Basisabfragen

Basisabfragen sind einfache Abfragen, die den aktuellen Wert einer Metrik oder eine Reihe von Metriken zurückgeben. Diese Abfragen sind nützlich, um sofortige Werte oder Zustände zu erfassen.

Beispiele:

# Gibt den aktuellen Wert der Metrik 'node_cpu_seconds_total' zurück
node_cpu_seconds_total

# Gibt die freien Speichermengen in Bytes zurück
node_memory_MemFree_bytes

6.1.2.2 Aggregationsabfragen

Aggregationsabfragen werden verwendet, um Metriken zusammenzufassen und statistische Informationen zu erhalten. PromQL bietet mehrere Aggregationsfunktionen, die nützlich sind, um Durchschnittswerte, Summen und andere aggregierte Daten zu berechnen.

Beispiele:

# Summiert die CPU-Zeit über alle Kerne
sum(node_cpu_seconds_total)

# Durchschnittlicher Speicherverbrauch
avg(node_memory_MemAvailable_bytes)

# Maximaler Plattenplatz eines Dateisystems
max(node_filesystem_size_bytes)

# Minimaler Plattenplatz eines Dateisystems
min(node_filesystem_size_bytes)

6.1.2.3 Zeitfensterabfragen

Zeitfensterabfragen sind nützlich, um Änderungen über einen bestimmten Zeitraum zu analysieren. Sie helfen dabei, Trends und Muster zu erkennen, indem sie Daten über einen definierten Zeitraum aggregieren.

Beispiele:

# Berechnet die durchschnittliche Änderungsrate der CPU-Zeit über die letzten 5 Minuten
rate(node_cpu_seconds_total[5m])

# Berechnet die sofortige Änderungsrate der CPU-Zeit
irate(node_cpu_seconds_total[5m])

# Gesamter Anstieg des Festplattenplatzes über die letzten 24 Stunden
increase(node_filesystem_size_bytes[24h])

6.1.2.4 Vergleichende Abfragen

Vergleichende Abfragen ermöglichen es, Metriken zu vergleichen und Bedingungen zu prüfen. Sie können verwendet werden, um spezifische Werte herauszufiltern oder Beziehungen zwischen verschiedenen Metriken zu analysieren.

Beispiele:

# Filtert Zeitreihen, die größer als ein bestimmter Wert sind
node_filesystem_size_bytes > 1e12

# Kombiniert zwei Bedingungen
up == 1 and node_load1 > 0.5

6.1.2.5 Zusammengesetzte Abfragen

Zusammengesetzte Abfragen kombinieren mehrere einfache Abfragen, um komplexere Analysen durchzuführen. Diese Abfragen können verwendet werden, um verschiedene Metriken zu vergleichen oder neue Metriken zu berechnen.

Beispiele:

# Kombination von CPU- und Speicherverbrauch
sum(node_cpu_seconds_total) / sum(node_memory_MemAvailable_bytes)

# Verhältnis von freiem zu gesamtem Speicher
(node_memory_MemFree_bytes / node_memory_MemTotal_bytes) * 100

6.1.2.6 Subqueries und verschachtelte Abfragen

Subqueries und verschachtelte Abfragen ermöglichen die Durchführung komplexer Abfragen, bei denen die Ergebnisse einer Abfrage als Eingabe für eine andere verwendet werden. Dies ist nützlich für detaillierte Analysen und die Erstellung komplexer Metriken.

Beispiele:

# Durchschnittlicher CPU-Verbrauch über alle Kerne in den letzten 10 Minuten
avg_over_time(sum(node_cpu_seconds_total)[10m:1m])

# Der maximale Wert des minimalen freien Speichers in den letzten 24 Stunden
max(min_over_time(node_memory_MemFree_bytes[24h:1h]))

6.1.2.7 Mathematische Ausdrücke und Berechnungen

PromQL ermöglicht auch die Verwendung mathematischer Ausdrücke und Berechnungen zur Analyse von Metriken. Dies kann verwendet werden, um neue Metriken zu erstellen oder vorhandene Metriken zu transformieren.

Beispiele:

# CPU-Auslastung in Prozent
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Verhältnis von verfügbarem zu insgesamt verfügbarem Speicher
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

Mit diesen Abfragetypen und Techniken können Sie leistungsstarke und detaillierte Analysen Ihrer Überwachungsdaten durchführen. PromQL bietet Ihnen die Flexibilität und die Werkzeuge, die Sie benötigen, um wertvolle Einblicke in die Leistung und den Zustand Ihrer Systeme zu gewinnen.

6.1.3 Erweiterte PromQL-Techniken

PromQL bietet erweiterte Techniken, die es Ihnen ermöglichen, tiefere Einblicke in Ihre Metriken zu gewinnen und komplexere Analysen durchzuführen. Dieses Kapitel behandelt einige der fortgeschritteneren Funktionen und Methoden, die in PromQL verfügbar sind.

6.1.3.1 Zusammengesetzte Abfragen

Zusammengesetzte Abfragen kombinieren mehrere einfache Abfragen, um komplexere Analysen durchzuführen. Diese Abfragen können verwendet werden, um verschiedene Metriken zu vergleichen oder neue Metriken zu berechnen.

Beispiele:

# Kombination von CPU- und Speicherverbrauch
sum(node_cpu_seconds_total) / sum(node_memory_MemAvailable_bytes)

# Verhältnis von freiem zu gesamtem Speicher
(node_memory_MemFree_bytes / node_memory_MemTotal_bytes) * 100

6.1.3.2 Subqueries und verschachtelte Abfragen

Subqueries und verschachtelte Abfragen ermöglichen die Durchführung komplexer Abfragen, bei denen die Ergebnisse einer Abfrage als Eingabe für eine andere verwendet werden. Dies ist nützlich für detaillierte Analysen und die Erstellung komplexer Metriken.

Beispiele:

# Durchschnittlicher CPU-Verbrauch über alle Kerne in den letzten 10 Minuten
avg_over_time(sum(node_cpu_seconds_total)[10m:1m])

# Der maximale Wert des minimalen freien Speichers in den letzten 24 Stunden
max(min_over_time(node_memory_MemFree_bytes[24h:1h]))

6.1.3.3 Mathematische Ausdrücke und Berechnungen

PromQL ermöglicht auch die Verwendung mathematischer Ausdrücke und Berechnungen zur Analyse von Metriken. Dies kann verwendet werden, um neue Metriken zu erstellen oder vorhandene Metriken zu transformieren.

Beispiele:

# CPU-Auslastung in Prozent
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Verhältnis von verfügbarem zu insgesamt verfügbarem Speicher
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

6.1.3.4 Temporale Operatoren

Temporale Operatoren erlauben es, Daten über verschiedene Zeitpunkte hinweg zu vergleichen und zu analysieren. Dies ist besonders nützlich für die Trendanalyse und die Überwachung von Veränderungen im Laufe der Zeit.

Beispiele:

# Vergleich des aktuellen Werts mit dem vor 1 Stunde
node_memory_MemAvailable_bytes - node_memory_MemAvailable_bytes offset 1h

# Der Unterschied im CPU-Verbrauch im Vergleich zur letzten Stunde
delta(node_cpu_seconds_total[1h])

6.1.3.5 Verwendung von Labels

Labels spielen eine wichtige Rolle in PromQL, da sie es ermöglichen, Metriken zu filtern und zu gruppieren. Sie können Labels verwenden, um spezifische Zeitreihen zu isolieren oder aggregierte Statistiken zu erstellen.

Beispiele:

# CPU-Verbrauch nach Instanz gruppiert
sum by(instance) (rate(node_cpu_seconds_total[5m]))

# Speicherverbrauch für einen bestimmten Host
node_memory_MemAvailable_bytes{instance="host1"}

6.1.3.6 Operatoren für Zusammenführungen und Set-Operationen

PromQL unterstützt Operatoren für Zusammenführungen und Set-Operationen, die es ermöglichen, Zeitreihen zu kombinieren oder zu vergleichen.

Beispiele:

# Union von zwei Zeitreihen
node_cpu_seconds_total{mode="user"} or node_cpu_seconds_total{mode="system"}

# Schnittmenge von zwei Zeitreihen
node_cpu_seconds_total{mode="user"} and node_cpu_seconds_total{mode="system"}

# Differenz von zwei Zeitreihen
node_cpu_seconds_total{mode="user"} unless node_cpu_seconds_total{mode="system"}

Mit diesen erweiterten Techniken können Sie tiefere Einblicke in Ihre Daten gewinnen und komplexere Analysen durchführen. PromQL bietet eine breite Palette von Funktionen und Operatoren, die es Ihnen ermöglichen, Ihre Überwachungs- und Analysefähigkeiten zu erweitern und detaillierte Einblicke in die Leistung und den Zustand Ihrer Systeme zu erhalten.