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

Маніторынг мікрасэрвісаў 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-адрасоў, напрыклад, пры працы ў Kubernetes або Докерскі рой.

Калі такое раскрыццё канчатковай кропкі метрык вам не падыходзіць, магчыма, таму што вы не хочаце дазваляць знешні доступ да яе, вы можаце лёгка адключыць яе, перадаўшы 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

Дадаць каментар