Мониторинг микросервисов Flask с помощью Prometheus

от автора

Пара строк кода и ваше приложение генерирует метрики, вау!

Для того что бы понять как работает prometheus_flask_exporter достаточно минимального примера:

from flask import Flask from prometheus_flask_exporter import PrometheusMetrics  app = Flask(__name__) metrics = PrometheusMetrics(app)  @app.route('/') def main():     return 'OK'

Это все что нужно для начала! Добавив импорт и строку для инициализации PrometheusMetrics, вы получите метрики продолжительности запросов и счетчики запросов, отображаемые в конечной точке /metrics приложения Flask, в котором оно зарегистрировано, а также все метрики по умолчанию, которые вы получаете из базовой клиентской библиотеки Prometheus.

Вы можете найти простой в использовании пример в репозитории GitHub, который запускает экземпляр Prometheus и Grafana вместе с демонстрационным приложением для генерации метрик, которые будут выглядеть примерно так:

Вы также найдете список показателей в README примера, которые отображаются на панели управления, вместе с запросами Prometheus, которые заполняют панели.

Настройка

В библиотеке есть множество опций конфигурации, посмотрите в README проекта их примеры с кратким объяснением.

Базовая конфигурация показана вверху. Просто создайте экземпляр PrometheusMetrics, назовем его metrics, а затем с его помощью определите дополнительные метрики, которые вы хотите собирать, декорировав функции:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Счетчики подсчитывают вызовы, а остальные собирают метрики в зависимости от продолжительности этих вызовов. Вы можете определить метки для каждого из них, потенциально используя свойства запроса или ответа. Например:

from flask import Flask, request from prometheus_flask_exporter import PrometheusMetrics  app = Flask(__name__)  # group by endpoint rather than path metrics = PrometheusMetrics(app, group_by='endpoint')  @app.route('/collection/:collection_id/item/:item_id') @metrics.counter(     'cnt_collection', 'Number of invocations per collection', labels={         'collection': lambda: request.view_args['collection_id'],         'status': lambda resp: resp.status_code     }) def get_item_from_collection(collection_id, item_id):     pass

В приведенном выше примере нажатие на конечную точку /collection/10002/item/76 приведет к увеличению счетчика, например cnt_collection{collection = «10002», status = «200»}, плюс вы получите метрики по умолчанию (для каждой конечной точки в этом примере ) из библиотеки по умолчанию:

  • flask_http_request_duration_seconds — Продолжительность HTTP-запроса в секундах для всех запросов Flask по методу, пути и статусу

  • flask_http_request_total — Общее количество HTTP-запросов по методам и статусам

Есть варианты пропустить отслеживание определенных конечных точек, зарегистрировать дополнительные метрики по умолчанию или пропустить те, что указаны выше, или применить одну и ту же настраиваемую метрику к нескольким конечным точкам. Ознакомьтесь с README проекта, чтобы узнать, что доступно.

app = Flask(__name__) metrics = PrometheusMetrics(app)  @app.route('/') def main():     pass  # requests tracked by default  @app.route('/skip') @metrics.do_not_track() def skip():     pass  # default metrics are not collected  # custom metric to be applied to multiple endpoints common_counter = metrics.counter(     'by_endpoint_counter', 'Request count by endpoints',     labels={'endpoint': lambda: request.endpoint} )  @app.route('/common/one') @common_counter def endpoint_one():     pass  # tracked by the custom and the default metrics  @app.route('/common/two') @common_counter def endpoint_two():     pass  # also tracked by the custom and the default metrics  # register additional default metrics metrics.register_default(     metrics.counter(         'by_path_counter', 'Request count by request paths',         labels={'path': lambda: request.path}     ) )

В библиотеке есть удобные расширения для популярных многопроцессорных библиотек, таких как uWSGI и Gunicorn. Вы также можете найти небольшие примеры целевых вариантов использования, в том числе многопроцессорных.

Сбор метрик

Как упоминалось выше, библиотека по умолчанию предоставляет конечную точку /metrics в приложении Flask, которая может служить целью для сборщика Prometheus.

В приведенном выше примере с дашбордом вы можете нацелить свой Prometheus на приложение Flask с настройками по умолчанию с такой конфигурацией:

scrape_configs:   - job_name: 'example'      dns_sd_configs:       - names: ['app']         port: 5000         type: A         refresh_interval: 5s

Смотрите полный пример в репозитории GitHub. Это предполагает, что Prometheus может найти ваши экземпляры приложения Flask на http://app:5000/metrics, где имя домена приложения может потенциально разрешаться на несколько IP-адресов, например, при работе в Kubernetes или Docker Swarm.

Если такое раскрытие конечной точки метрик вам не подходит, возможно, потому что вы не хотите разрешать внешний доступ к ней, вы можете легко отключить ее, передав path=None при создании экземпляра PrometheusMetrics.

from flask import Flask, request from prometheus_flask_exporter import PrometheusMetrics  app = Flask(__name__) metrics = PrometheusMetrics(app, path=None)  ...  metrics.start_http_server(5099)

Затем вы можете использовать start_http_server(port), чтобы открыть эту конечную точку на другом HTTP-порту, 5099 в приведенном выше примере. В качестве альтернативы, если вас устраивает то, что конечная точка находится в том же приложении Flask, но вам нужно изменить ее путь от /metrics, вы можете либо передать другой URI в качестве параметра пути, либо использовать register_endpoint(..), чтобы установить это позже.

Ссылки

Если вы решите попробовать, не стесняйтесь откройте issue на GitHub или оставлять свои комментарии, отзывы и предложения!

Спасибо!


ссылка на оригинал статьи https://habr.com/ru/articles/518122/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *