Обертка Python для http API Prometheus и некоторые инструменты для обработки метрик.
Чтобы установить последнюю версию:
pip install prometheus-api-client
Для установки непосредственно из этой ветки:
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
Prometheus, проект Cloud Native Computing Foundation, представляет собой систему мониторинга систем и сервисов. Он собирает метрики (данные временных рядов) из настроенных целевых объектов через заданные интервалы времени, оценивает выражения правил, отображает результаты и может активировать оповещения, если какое-либо условие оказывается истинным. Необработанные данные временных рядов, полученные с хоста Prometheus, иногда бывает трудно интерпретировать. Чтобы лучше понять эти метрики, мы создали оболочку Python для http API Prometheus, упрощающую обработку и анализ метрик.
Библиотека prometheus-api-client
состоит из нескольких модулей, которые помогают подключаться к хосту Prometheus, получать необходимые метрики и выполнять различные операции агрегирования данных временных рядов.
Модуль библиотеки PrometheusConnect
можно использовать для подключения к хосту Prometheus. Этот модуль по сути представляет собой класс, созданный для сбора метрик с хоста Prometheus. Он хранит следующие параметры соединения:
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 ()
Вы также можете получить данные временных рядов для определенной метрики, используя пользовательские запросы, следующим образом:
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)" )
Мы также можем использовать собственные запросы для получения данных метрик за определенный интервал времени. Например, давайте попробуем получить данные за последние 2 дня для определенного показателя порциями по 1 дню:
# 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 ,
)
Дополнительные функции, включенные в модуль PrometheusConnect
, см. в этой документации.
Модуль MetricsList
инициализирует список объектов Metric для метрик, полученных с хоста Prometheus в результате запроса 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 " )
Каждый из элементов в списке metric_object_list
инициализируется как объект класса Metric
. Давайте посмотрим на одну из метрик из metric_object_list
чтобы узнать больше о классе Metric
:
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
Дополнительные функции, включенные в модуль MetricsList
и Metrics
, см. в этой документации.
Класс Metric
также поддерживает несколько функций, таких как сложение, приравнивание и построение различных метрических объектов.
Вы можете добавить два объекта метрик для одного и того же временного ряда следующим образом:
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``)
Оператор перегрузки =, чтобы проверить, являются ли две метрики одинаковыми (являются ли они одинаковыми временными рядами независимо от их данных)
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
Постройте очень простой линейный график для временного ряда показателей:
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 ()
Для выполнения анализа и обработки данных часто бывает полезно представить данные с помощью DataFrame pandas. В этой библиотеке есть два модуля, которые можно использовать для обработки необработанных метрик, полученных в DataFrame.
Модуль MetricSnapshotDataFrame
преобразует данные «текущего значения метрики» в представление DataFrame, а MetricRangeDataFrame
преобразует данные «значений диапазона показателей» в представление DataFrame. Пример использования этих классов можно увидеть ниже:
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 |
+-------------------------+-----------------+------------=-------+-------+
"""
Дополнительные функции, включенные в библиотеку prometheus-api-client
, можно найти в этой документации.
PROM_URL="http://demo.robustperception.io:9090/" pytest
Клиент Prometheus Api использует структуру предварительной фиксации для поддержки проверки кода и стиля кода Python.
AICoE-CI будет выполнять проверку перед фиксацией для каждого запроса на включение.
Мы призываем наших участников следовать той же схеме, внося свой вклад в код.
мы хотели бы сохранить тот же стандарт и поддерживать код для лучшего качества и читабельности.
Файл конфигурации предварительной фиксации присутствует в репозитории .pre-commit-config.yaml
Он содержит различные руководства по стилю кода и линтингу, которые мы используем для приложения.
нам просто нужно запустить предварительную фиксацию перед отправкой запроса на включение.
Следующую команду можно использовать для запуска предварительной фиксации:
pre-commit run --all-files
Если pre-commit не установлен в вашей системе, его можно установить с помощью: pip install pre-commit