Ein Python-Wrapper für die Prometheus-HTTP-API und einige Tools für die Metrikverarbeitung.
So installieren Sie die neueste Version:
pip install prometheus-api-client
So installieren Sie direkt von diesem Zweig aus:
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
Prometheus, ein Projekt der Cloud Native Computing Foundation, ist ein System- und Dienstüberwachungssystem. Es sammelt Metriken (Zeitreihendaten) von konfigurierten Zielen in bestimmten Intervallen, wertet Regelausdrücke aus, zeigt die Ergebnisse an und kann Warnungen auslösen, wenn beobachtet wird, dass eine Bedingung wahr ist. Die von einem Prometheus-Host erhaltenen rohen Zeitreihendaten können manchmal schwer zu interpretieren sein. Um diese Metriken besser zu verstehen, haben wir einen Python-Wrapper für die Prometheus-HTTP-API erstellt, um die Verarbeitung und Analyse von Metriken zu erleichtern.
Die prometheus-api-client
-Bibliothek besteht aus mehreren Modulen, die dabei helfen, eine Verbindung zu einem Prometheus-Host herzustellen, die erforderlichen Metriken abzurufen und verschiedene Aggregationsvorgänge für die Zeitreihendaten durchzuführen.
Mit dem PrometheusConnect
Modul der Bibliothek kann eine Verbindung zu einem Prometheus-Host hergestellt werden. Bei diesem Modul handelt es sich im Wesentlichen um eine Klasse, die für die Erfassung von Metriken von einem Prometheus-Host erstellt wurde. Es speichert die folgenden Verbindungsparameter:
from prometheus_api_client import PrometheusConnect
prom = PrometheusConnect ( url = "<prometheus-host>" , disable_ssl = True )
# Get the list of all the metrics that the Prometheus host scrapes
prom . all_metrics ()
Sie können die Zeitreihendaten für eine bestimmte Metrik auch mithilfe benutzerdefinierter Abfragen wie folgt abrufen:
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
prom . get_current_metric_value ( metric_name = 'up' , label_config = my_label_config )
# Here, we are fetching the values of a particular metric name
prom . custom_query ( query = "prometheus_http_requests_total" )
# Now, lets try to fetch the `sum` of the metrics
prom . custom_query ( query = "sum(prometheus_http_requests_total)" )
Wir können auch benutzerdefinierte Abfragen verwenden, um die Metrikdaten in einem bestimmten Zeitintervall abzurufen. Versuchen wir beispielsweise, die Daten der letzten zwei Tage für eine bestimmte Metrik in Blöcken von jeweils einem Tag abzurufen:
# Import the required datetime functions
from prometheus_api_client . utils import parse_datetime
from datetime import timedelta
start_time = parse_datetime ( "2d" )
end_time = parse_datetime ( "now" )
chunk_size = timedelta ( days = 1 )
metric_data = prom . get_metric_range_data (
"up{cluster='my_cluster_id'}" , # this is the metric name and label config
start_time = start_time ,
end_time = end_time ,
chunk_size = chunk_size ,
)
Weitere im PrometheusConnect
Modul enthaltene Funktionen finden Sie in dieser Dokumentation.
Das MetricsList
Modul initialisiert eine Liste von Metric-Objekten für die Metriken, die als Ergebnis einer Promql-Abfrage von einem Prometheus-Host abgerufen wurden.
# Import the MetricsList and Metric modules
from prometheus_api_client import PrometheusConnect , MetricsList , Metric
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
metric_data = prom . get_metric_range_data ( metric_name = 'up' , label_config = my_label_config )
metric_object_list = MetricsList ( metric_data ) # metric_object_list will be initialized as
# a list of Metric objects for all the
# metrics downloaded using get_metric query
# We can see what each of the metric objects look like
for item in metric_object_list :
print ( item . metric_name , item . label_config , " n " )
Jedes der Elemente in der metric_object_list
wird als Metric
Klassenobjekt initialisiert. Schauen wir uns eine der Metriken aus der metric_object_list
an, um mehr über die Metric
-Klasse zu erfahren:
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
Weitere im MetricsList
und Metrics
Modul enthaltene Funktionen finden Sie in dieser Dokumentation.
Die Metric
-Klasse unterstützt auch mehrere Funktionen wie das Hinzufügen, Gleichsetzen und Zeichnen verschiedener metrischer Objekte.
Sie können wie folgt zwei Metrikobjekte für dieselbe Zeitreihe hinzufügen:
metric_1 = Metric ( metric_data_1 )
metric_2 = Metric ( metric_data_2 )
metric_12 = metric_1 + metric_2 # will add the data in ``metric_2`` to ``metric_1``
# so if any other parameters are set in ``metric_1``
# will also be set in ``metric_12``
# (like ``oldest_data_datetime``)
Überladungsoperator =, um zu überprüfen, ob zwei Metriken gleich sind (unabhängig von ihren Daten die gleichen Zeitreihen sind)
metric_1 = Metric ( metric_data_1 )
metric_2 = Metric ( metric_data_2 )
print ( metric_1 == metric_2 ) # will print True if they belong to the same time-series
Zeichnen Sie ein sehr einfaches Liniendiagramm für die metrische Zeitreihe:
from prometheus_api_client import PrometheusConnect , MetricsList , Metric
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
metric_data = prom . get_metric_range_data ( metric_name = 'up' , label_config = my_label_config )
metric_object_list = MetricsList ( metric_data )
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
my_metric_object . plot ()
Um Datenanalysen und -manipulationen durchzuführen, ist es oft hilfreich, die Daten mithilfe eines Pandas-DataFrames darstellen zu lassen. In dieser Bibliothek gibt es zwei Module, die zum Verarbeiten der in einen DataFrame abgerufenen Rohmetriken verwendet werden können.
Das MetricSnapshotDataFrame
Modul konvertiert „aktuelle Metrikwerte“-Daten in eine DataFrame-Darstellung, und das MetricRangeDataFrame
konvertiert „Metrikbereichswerte“-Daten in eine DataFrame-Darstellung. Beispiele für die Verwendung dieser Klassen finden Sie unten:
import datetime as dt
from prometheus_api_client import PrometheusConnect , MetricSnapshotDataFrame , MetricRangeDataFrame
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
# metric current values
metric_data = prom . get_current_metric_value (
metric_name = 'up' ,
label_config = my_label_config ,
)
metric_df = MetricSnapshotDataFrame ( metric_data )
metric_df . head ()
""" Output:
+-------------------------+-----------------+------------+-------+
| __name__ | cluster | label_2 | timestamp | value |
+==========+==============+=================+============+=======+
| up | cluster_id_0 | label_2_value_2 | 1577836800 | 0 |
+-------------------------+-----------------+------------+-------+
| up | cluster_id_1 | label_2_value_3 | 1577836800 | 1 |
+-------------------------+-----------------+------------+-------+
"""
# metric values for a range of timestamps
metric_data = prom . get_metric_range_data (
metric_name = 'up' ,
label_config = my_label_config ,
start_time = ( dt . datetime . now () - dt . timedelta ( minutes = 30 )),
end_time = dt . datetime . now (),
)
metric_df = MetricRangeDataFrame ( metric_data )
metric_df . head ()
""" Output:
+------------+------------+-----------------+--------------------+-------+
| | __name__ | cluster | label_2 | value |
+-------------------------+-----------------+--------------------+-------+
| timestamp | | | | |
+============+============+=================+====================+=======+
| 1577836800 | up | cluster_id_0 | label_2_value_2 | 0 |
+-------------------------+-----------------+--------------------+-------+
| 1577836801 | up | cluster_id_1 | label_2_value_3 | 1 |
+-------------------------+-----------------+------------=-------+-------+
"""
Weitere in der prometheus-api-client
-Bibliothek enthaltenen Funktionen finden Sie in dieser Dokumentation.
PROM_URL="http://demo.robustperception.io:9090/" pytest
Der Prometheus-API-Client verwendet ein Pre-Commit-Framework, um das Code-Linting und den Python-Code-Stil beizubehalten.
Das AICoE-CI würde die Pre-Commit-Prüfung bei jeder Pull-Anfrage durchführen.
Wir ermutigen unsere Mitwirkenden, bei der Mitarbeit am Code dem gleichen Muster zu folgen.
Wir möchten den gleichen Standard beibehalten und den Code für eine bessere Qualität und Lesbarkeit beibehalten.
Die Pre-Commit-Konfigurationsdatei ist im Repository .pre-commit-config.yaml
vorhanden
Es enthält die verschiedenen Code-Styling- und Linting-Anleitungen, die wir für die Anwendung verwenden.
Wir müssen lediglich Pre-Commit ausführen, bevor wir eine Pull-Anfrage stellen.
Der folgende Befehl kann zum Ausführen des Pre-Commits verwendet werden:
pre-commit run --all-files
Wenn pre-commit nicht in Ihrem System installiert ist, kann es mit pip install pre-commit
installiert werden