Моніторинг мікросервісів 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, який запускає екземпляр Прометей и Grafana разом з демонстраційним додатком для генерації метрик, які виглядатимуть приблизно так:

Моніторинг мікросервісів Flask за допомогою Prometheus

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

Налаштування

У бібліотеці є безліч опцій конфігурації, подивіться в README проекту їх приклади з коротким поясненням.

Базова конфігурація показана вгорі. Просто створіть екземпляр PrometheusMetrics, назвемо його показники, а потім за допомогою визначте додаткові метрики, які ви хочете збирати, декорувавши функції:

  • @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-адрес, наприклад, при роботі в Кубернетес або Докер-рій.

Якщо таке розкриття кінцевої точки метрик вам не підходить, можливо, тому, що ви не хочете дозволяти зовнішній доступ до неї, ви можете легко відключити її, передавши 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 або залишати свої коментарі, відгуки та пропозиції!

Спасибо!

Джерело: habr.com

Додати коментар або відгук