Um wrapper Python para a API http do Prometheus e algumas ferramentas para processamento de métricas.
Para instalar a versão mais recente:
pip install prometheus-api-client
Para instalar diretamente deste branch:
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
Prometheus, um projeto da Cloud Native Computing Foundation, é um sistema de monitoramento de sistemas e serviços. Ele coleta métricas (dados de série temporal) de alvos configurados em determinados intervalos, avalia expressões de regras, exibe os resultados e pode acionar alertas se alguma condição for considerada verdadeira. Os dados brutos de série temporal obtidos de um host Prometheus podem às vezes ser difíceis de interpretar. Para ajudar a entender melhor essas métricas, criamos um wrapper Python para a API http do Prometheus para facilitar o processamento e análise de métricas.
A biblioteca prometheus-api-client
consiste em vários módulos que auxiliam na conexão com um host Prometheus, buscando as métricas necessárias e executando várias operações de agregação nos dados da série temporal.
O módulo PrometheusConnect
da biblioteca pode ser usado para conectar-se a um host Prometheus. Este módulo é essencialmente uma classe criada para a coleta de métricas de um host Prometheus. Ele armazena os seguintes parâmetros de conexão:
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 ()
Você também pode buscar os dados de série temporal para uma métrica específica usando consultas personalizadas da seguinte maneira:
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)" )
Também podemos usar consultas personalizadas para buscar dados de métricas em um intervalo de tempo específico. Por exemplo, vamos tentar buscar dados dos últimos 2 dias para uma métrica específica em blocos de 1 dia:
# 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 obter mais funções incluídas no módulo PrometheusConnect
, consulte esta documentação.
O módulo MetricsList
inicializa uma lista de objetos Metric para as métricas obtidas de um host Prometheus como resultado de uma 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 um dos itens em metric_object_list
é inicializado como um objeto da classe Metric
. Vejamos uma das métricas de metric_object_list
para aprender mais sobre a classe Metric
:
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
Para obter mais funções incluídas no módulo MetricsList
e Metrics
, consulte esta documentação.
A classe Metric
também suporta múltiplas funções, como adicionar, igualar e plotar vários objetos métricos.
Você pode adicionar dois objetos de métrica para a mesma série temporal da seguinte maneira:
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 verificar se duas métricas são iguais (são a mesma série temporal, independentemente de seus dados)
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
Trace um gráfico de linha muito simples para a série 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álise e manipulação de dados, muitas vezes é útil ter os dados representados usando um DataFrame do pandas. Existem dois módulos nesta biblioteca que podem ser usados para processar as métricas brutas obtidas em um DataFrame.
O módulo MetricSnapshotDataFrame
converte dados de "valor métrico atual" em uma representação DataFrame, e o MetricRangeDataFrame
converte dados de "valores de intervalo métrico" em uma representação DataFrame. Um exemplo de uso dessas classes pode ser visto abaixo:
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 obter mais funções incluídas na biblioteca prometheus-api-client
, consulte esta documentação.
PROM_URL="http://demo.robustperception.io:9090/" pytest
O cliente Prometheus Api usa uma estrutura de pré-confirmação para manter o linting do código e o estilo do código python.
O AICoE-CI executaria a verificação pré-confirmação em cada solicitação pull.
Encorajamos nossos colaboradores a seguir o mesmo padrão ao contribuir com o código.
gostaríamos de manter o mesmo padrão e manter o código para melhor qualidade e legibilidade.
O arquivo de configuração pré-commit está presente no repositório .pre-commit-config.yaml
Ele contém os diferentes estilos de código e guia de linting que usamos para o aplicativo.
só precisamos executar o pré-commit antes de gerar uma solicitação pull.
O seguinte comando pode ser usado para executar o pré-commit:
pre-commit run --all-files
Se o pré-commit não estiver instalado em seu sistema, ele pode ser instalado com: pip install pre-commit