Un wrapper Python pour l'API http Prometheus et quelques outils pour le traitement des métriques.
Pour installer la dernière version :
pip install prometheus-api-client
Pour installer directement depuis cette branche :
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
Prometheus, un projet de la Cloud Native Computing Foundation, est un système de surveillance des systèmes et des services. Il collecte des métriques (données de séries chronologiques) à partir de cibles configurées à des intervalles donnés, évalue les expressions de règles, affiche les résultats et peut déclencher des alertes si une condition s'avère vraie. Les données brutes de séries chronologiques obtenues à partir d’un hôte Prometheus peuvent parfois être difficiles à interpréter. Pour vous aider à mieux comprendre ces métriques, nous avons créé un wrapper Python pour l'API http Prometheus afin de faciliter le traitement et l'analyse des métriques.
La bibliothèque prometheus-api-client
se compose de plusieurs modules qui aident à se connecter à un hôte Prometheus, à récupérer les métriques requises et à effectuer diverses opérations d'agrégation sur les données de séries chronologiques.
Le module PrometheusConnect
de la bibliothèque peut être utilisé pour se connecter à un hôte Prometheus. Ce module est essentiellement une classe créée pour la collecte de métriques à partir d'un hôte Prometheus. Il stocke les paramètres de connexion suivants :
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 ()
Vous pouvez également récupérer les données de séries chronologiques pour une métrique spécifique à l'aide de requêtes personnalisées comme suit :
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)" )
Nous pouvons également utiliser des requêtes personnalisées pour récupérer les données métriques dans un intervalle de temps spécifique. Par exemple, essayons de récupérer les données des deux derniers jours pour une métrique particulière par tranches d'un jour :
# 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 ,
)
Pour plus de fonctions incluses dans le module PrometheusConnect
, reportez-vous à cette documentation.
Le module MetricsList
initialise une liste d'objets Metric pour les métriques extraites d'un hôte Prometheus à la suite d'une requête promql.
# 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 " )
Chacun des éléments de metric_object_list
est initialisé en tant qu'objet de classe Metric
. Examinons l'une des métriques de la metric_object_list
pour en savoir plus sur la classe Metric
:
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
Pour plus de fonctions incluses dans le module MetricsList
et Metrics
, reportez-vous à cette documentation.
La classe Metric
prend également en charge plusieurs fonctions telles que l'ajout, l'assimilation et le traçage de divers objets métriques.
Vous pouvez ajouter deux objets métriques pour la même série temporelle comme suit :
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``)
Opérateur de surcharge =, pour vérifier si deux métriques sont identiques (sont les mêmes séries temporelles quelles que soient leurs données)
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
Tracez un graphique linéaire très simple pour la série temporelle métrique :
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 ()
Pour effectuer l'analyse et la manipulation des données, il est souvent utile de représenter les données à l'aide d'un DataFrame pandas. Il existe deux modules dans cette bibliothèque qui peuvent être utilisés pour traiter les métriques brutes récupérées dans un DataFrame.
Le module MetricSnapshotDataFrame
convertit les données de « valeur métrique actuelle » en représentation DataFrame, et MetricRangeDataFrame
convertit les données « valeurs de plage métrique » en représentation DataFrame. Un exemple d'utilisation de ces classes peut être vu ci-dessous :
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 |
+-------------------------+-----------------+------------=-------+-------+
"""
Pour plus de fonctions incluses dans la bibliothèque prometheus-api-client
, veuillez vous référer à cette documentation.
PROM_URL="http://demo.robustperception.io:9090/" pytest
Le client Prometheus Api utilise un framework de pré-validation pour maintenir le peluchage du code et le style du code Python.
L'AICoE-CI exécuterait la vérification préalable à la validation sur chaque demande d'extraction.
Nous encourageons nos contributeurs à suivre le même modèle, tout en contribuant au code.
nous souhaitons conserver le même standard et maintenir le code pour une meilleure qualité et lisibilité.
Le fichier de configuration de pré-commit est présent dans le référentiel .pre-commit-config.yaml
Il contient les différents guides de style de code et de peluchage que nous utilisons pour l'application.
nous avons juste besoin d'exécuter un pré-commit avant de lancer une Pull Request.
La commande suivante peut être utilisée pour exécuter le pré-commit :
pre-commit run --all-files
Si le pré-commit n'est pas installé sur votre système, il peut être installé avec : pip install pre-commit