Monitorimi i mikrosherbimeve Flask me Prometheus

Një sërë kodesh dhe aplikacioni juaj gjeneron metrika, wow!

Për të kuptuar si funksionon prometheus_flask_exporter mjafton një shembull minimal:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('\/')
def main():
    return 'OK'

Kjo është e gjitha çfarë ju nevojitet për të filluar! Duke shtuar importin dhe një rresht për inicializimin e PrometheusMetrics, do të merrni metrikat e kohëzgjatjeve të kërkesave dhe numëruesve të kërkesave, të shfaqura në pikën fundore /metrics të aplikacionit Flask, ku është regjistruar, si dhe të gjitha metrikat e paracaktuar që merrni nga biblioteka klientit të Prometheus.

Mund të gjeni një shembull të lehtë për t'u përdorur në depoznitë GitHub, që aktivizon një instancë Prometheus dhe Nëse tashmë e dini se çfarë është analiza e grupeve dhe se si ta bëni në SQL, kaloni menjëherë në seksionin e fundit. bashkë me një aplikacion demonstrues për të gjeneruar metrika që do të duken diçka si kjo:

Monitorimi i mikrosherbimeve Flask me Prometheus

Gjithashtu do të gjeni një listë të treguesve në README shembujt, që shfaqen në panelin e kontrollit, së bashku me kërkesat Prometheus që mbushin panelet.

Configuration

Biblioteka ka shumë opsione konfigurimi, shikoni në README projektin për shembujt e tyre me një shpjegim të shkurtër.

Konfigurimi bazë është i shfaqur në krye. Thjesht krijoni një instancë PrometheusMetrics, le të e quajmë metricat, dhe pastaj me ndihmën e saj përcaktoni metrikat shtesë që dëshironi të mbledhni, duke dekoruar funksionet:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Numëruesit llogarisin thirrjet, ndërsa të tjerat mbledhin metrika në varësi të kohëzgjatjeve të këtyre thirrjeve. Mund të përcaktoni etiketat për secilën prej tyre, duke potencuar përdorimin e pronave të kërkesave ose përgjigjeve. Për shembull:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# gruponi sipas pikës fundore në vend të rrugës
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('\/collection\/:collection_id\/item\/:item_id')
@metrics.counter(
    'cnt_collection', 'Numri i thirrjeve për çdo koleksion', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

Në shembullin e mësipërm, shtypja në pikën fundore /collection/10002/item/76 do të çojë në rritjen e numëruesit, për shembull cnt_collection{collection = «10002», status = «200»}, plus do të merrni metrikat e paracaktuara (për çdo pikë fundore në këtë shembull) nga biblioteka e paracaktuar:

  • flask_http_request_duration_seconds — Koha e kĂ«rkesĂ«s HTTP nĂ« sekonda pĂ«r tĂ« gjitha kĂ«rkesat Flask sipas metodĂ«s, rrugĂ«s dhe statusit

  • flask_http_request_total — Numri total i kĂ«rkesave HTTP sipas metodave dhe statusit

Ka janë mundësi për të anashkaluar ndjekjen e pikave të caktuara të përfundimit, për të regjistruar metrika shtesë si parazgjedhje ose për të anashkaluar ato që janë përmendur më sipër, ose për të aplikuar të njëjtën metrikë të personalizuar në disa pika përfundimi. Shihni README projekti për të parë se çfarë është në dispozicion.

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('\/')
def main():
    pass  # kërkesat e gjurmuara si parazgjedhje

@app.route('\/skip')
@metrics.do_not_track()
def skip():
    pass  # metrikat parazgjedhëse nuk janë mbledhur

# metrikë e personalizuar për t'u aplikuar në disa pika përfundimi
common_counter = metrics.counter(
    'by_endpoint_counter', 'Numri i kërkesave nga pikat e përfundimit',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('\/common\/one')
@common_counter
def endpoint_one():
    pass  # gjurmuar nga metrika e personalizuar dhe e parazgjedhur

@app.route('\/common\/two')
@common_counter
def endpoint_two():
    pass  # gjithashtu gjurmuar nga metrika e personalizuar dhe e parazgjedhur

# regjistroni metrika shtesë parazgjedhëse
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Numri i kërkesave sipas rrugëve të kërkesës',
        labels={'path': lambda: request.path}
    )
)

Biblioteka ka zgjerime të dobishme për bibliotekat e njohura me shumë procese, si uWSGI dhe Gunicorn. Ju gjithashtu mund të gjeni shembuj të vegjël të përdorimeve të synuara, përfshirë ato me shumë procese.

Mbledhja e metrikave

Siç është përmendur më sipër, biblioteka ofron një pikë përfundimi /metrics në aplikacionin Flask, që mund të shërbejë si një qëllim për mbledhësin Prometheus.

Në shembullin e mësipërm me panelin e kontrollit, mund të synoni Prometheusin tuaj në aplikacionin Flask me konfigurimet e parazgjedhura me një konfigurim të tillë:

scrape_configs:
  - job_name: 'example'

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

Shihni një shembull të plotë në repozitari GitHub. Kjo supozon se Prometheusi mund të gjejë instancat tuaja të aplikacionit Flask në http://app:5000/metrics, ku emri i domenit të aplikacionit mund të zgjidhet potencialisht në disa adresa IP, për shembull, kur punoni në Kubernetes ose Docker Swarm.

Nëse ky zbulim i pikës përfundimi të metrikave nuk ju përshtatet, ndoshta sepse dëshironi të parandaloni qasjen e jashtme në të, mund ta çaktivizoni lehtësisht duke kaluar path=None kur krijoni një instancë 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)

Pastaj mund të përdorni start_http_server(port), për të hapur këtë pikë përfundimi në një port tjetër HTTP, 5099 në shembullin e mësipërm. Si alternativë, nëse ju përshtatet që pika përfundimi ndodhet në të njëjtin aplikacion Flask, por ju nevojitet të ndryshoni rrugën e saj nga /metrics, mund të kaloni një URI tjetër si parametrin e rrugës, ose përdorni register_endpoint(..), për të vendosur këtë më vonë.

Linket

Nëse vendosni ta provoni, mos hezitoni të hapni një çështje në GitHub ose të lini komentet, vlerësimet dhe sugjerimet tuaja!

Faleminderit!

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster