Un contenedor de Python para la API http de Prometheus y algunas herramientas para el procesamiento de métricas.
Para instalar la última versión:
pip install prometheus-api-client
Para instalar directamente desde esta rama:
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
Prometheus, un proyecto de Cloud Native Computing Foundation, es un sistema de monitoreo de sistemas y servicios. Recopila métricas (datos de series temporales) de objetivos configurados en intervalos determinados, evalúa expresiones de reglas, muestra los resultados y puede activar alertas si se observa que alguna condición es verdadera. Los datos de series temporales sin procesar obtenidos de un host de Prometheus a veces pueden resultar difíciles de interpretar. Para ayudar a comprender mejor estas métricas, hemos creado un contenedor de Python para la API http de Prometheus para facilitar el procesamiento y análisis de métricas.
La biblioteca prometheus-api-client
consta de varios módulos que ayudan a conectarse a un host de Prometheus, obtener las métricas requeridas y realizar varias operaciones de agregación en los datos de series temporales.
El módulo PrometheusConnect
de la biblioteca se puede utilizar para conectarse a un host Prometheus. Este módulo es esencialmente una clase creada para la recopilación de métricas de un host de Prometheus. Almacena los siguientes parámetros de conexión:
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 ()
También puede recuperar los datos de series temporales para una métrica específica mediante consultas personalizadas de la siguiente manera:
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)" )
También podemos utilizar consultas personalizadas para recuperar los datos de las métricas en un intervalo de tiempo específico. Por ejemplo, intentemos recuperar los datos de los últimos 2 días para una métrica particular en partes de 1 día:
# 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 ,
)
Para obtener más funciones incluidas en el módulo PrometheusConnect
, consulte esta documentación.
El módulo MetricsList
inicializa una lista de objetos Metric para las métricas obtenidas de un host Prometheus como resultado de una consulta 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 " )
Cada uno de los elementos de metric_object_list
se inicializa como un objeto de clase Metric
. Veamos una de las métricas de metric_object_list
para obtener más información sobre la clase Metric
:
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
Para obtener más funciones incluidas en el módulo MetricsList
y Metrics
, consulte esta documentación.
La clase Metric
también admite múltiples funciones como sumar, igualar y trazar varios objetos métricos.
Puede agregar dos objetos de métricas para la misma serie temporal de la siguiente manera:
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``)
Operador de sobrecarga =, para comprobar si dos métricas son iguales (son la misma serie temporal independientemente de sus datos)
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
Traza un gráfico lineal muy simple para la serie temporal métrica:
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 ()
Para realizar análisis y manipulación de datos, suele ser útil representar los datos mediante un DataFrame de pandas. Hay dos módulos en esta biblioteca que se pueden usar para procesar las métricas sin procesar recuperadas en un DataFrame.
El módulo MetricSnapshotDataFrame
convierte datos de "valores de métricas actuales" en una representación de DataFrame, y MetricRangeDataFrame
convierte datos de "valores de rango de métricas" en una representación de DataFrame. A continuación se puede ver un ejemplo de uso de estas clases:
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 |
+-------------------------+-----------------+------------=-------+-------+
"""
Para obtener más funciones incluidas en la biblioteca prometheus-api-client
, consulte esta documentación.
PROM_URL="http://demo.robustperception.io:9090/" pytest
El cliente Prometheus Api utiliza un marco de confirmación previa para mantener el código y el estilo del código Python.
El AICoE-CI ejecutaría la verificación previa a la confirmación en cada solicitud de extracción.
Alentamos a nuestros contribuyentes a seguir el mismo patrón mientras contribuyen al código.
Nos gustaría mantener el mismo estándar y mantener el código para una mejor calidad y legibilidad.
El archivo de configuración previo a la confirmación está presente en el repositorio .pre-commit-config.yaml
Contiene las diferentes guías de estilo y linting de código que utilizamos para la aplicación.
solo necesitamos ejecutar una confirmación previa antes de generar una solicitud de extracción.
Se puede utilizar el siguiente comando para ejecutar la confirmación previa:
pre-commit run --all-files
Si la confirmación previa no está instalada en su sistema, puede instalarla con: pip install pre-commit