[Flask, Python, DevOps] Мониторинг микросервисов Flask с помощью Prometheus (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Пара строк кода и ваше приложение генерирует метрики, вау!Для того что бы понять как работает 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(..), чтобы установить это позже.Ссылки
- rycus86/prometheus_flask_exporter - Этот экспортер флаконов для Prometheus
- prometheus-flask-exporter README - Использование, примеры и параметры конфигурации
- prometheus-flask-exporter examples - Примеры настройки мониторинга приложений Flask разными способами
- prometheus-flask-exporter on PyPI - Этот проект на PyPI
- prometheus/client_python - Официальная клиентская библиотека Prometheus для Python
Если вы решите попробовать, не стесняйтесь откройте issue на GitHub или оставлять свои комментарии, отзывы и предложения!Спасибо!
===========
Источник:
habr.com
===========
===========
Автор оригинала: Viktor Adam
===========Похожие новости:
- [Nginx, JavaScript, DevOps] Я сделал свой PyPI-репозитарий с авторизацией и S3. На Nginx
- [DevOps, Kubernetes] Простое объяснение CRD в Kubernetes и как его использовать (перевод)
- [GTK+, Python] Автоматический переводчик на Python+GTK3. Альтернатива Яндексу
- [*nix, DevOps, Git, Kubernetes, Системное администрирование] Разбираемся с Custom Tooling в Argo CD
- [Python, Обработка изображений] Определение положения и скорости тележки мостового крана с помощью цифровой камеры и OpenCV
- [DevOps, Kubernetes] Как мы выпускаем исправления к ПО в GitLab (перевод)
- [DevOps, Системное администрирование] Ускоряем Ansible
- [Amazon Web Services, DevOps, IT-инфраструктура, Системное программирование] Описание инфраструктуры в Terraform на будущее. Антон Бабенко (2018г)
- [Python, Data Mining, Открытые данные] Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 2
- [Python, Data Mining, Открытые данные] Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 1
Теги для поиска: #_flask, #_python, #_devops, #_flask, #_python, #_python3, #_metrics, #_prometheus, #_openmetrics, #_devops, #_flask, #_python, #_devops
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 16:53
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Пара строк кода и ваше приложение генерирует метрики, вау!Для того что бы понять как работает 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' Вы также найдете список показателей в READMEпримера, которые отображаются на панели управления, вместе с запросами Prometheus, которые заполняют панели.НастройкаВ библиотеке есть множество опций конфигурации, посмотрите в README проекта их примеры с кратким объяснением.Базовая конфигурация показана вверху. Просто создайте экземпляр PrometheusMetrics, назовем его metrics, а затем с его помощью определите дополнительные метрики, которые вы хотите собирать, декорировав функции:
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
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} ) ) scrape_configs:
- job_name: 'example' dns_sd_configs: - names: ['app'] port: 5000 type: A refresh_interval: 5s from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics app = Flask(__name__) metrics = PrometheusMetrics(app, path=None) ... metrics.start_http_server(5099)
=========== Источник: habr.com =========== =========== Автор оригинала: Viktor Adam ===========Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 16:53
Часовой пояс: UTC + 5