Monitorimi i mikroshërbimeve Flask me Prometheus

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

Për të kuptuar se 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ë gjithçka që ju nevojitet për të filluar! Duke shtuar importimin dhe rreshtin për inicializimin e PrometheusMetrics, do të merrni metrika të kohës së kërkesave dhe numëruesit e kërkesave, të shfaqura në pikën e përfundimit /metrics të aplikacionit Flask, ku është regjistruar, si dhe të gjitha metrikat e paracaktuara që merrni nga biblioteka bazë klientit Prometheus.

Mund të gjeni një shembull të thjeshtë në përdorim në depo GitHub, e cila ekzekuton një instancë Prometheus dhe Grafana në bashkëpunim me një aplikacion demonstrues për të gjeneruar metrika, të cilat do të duken kryesisht kështu:

Monitorimi i mikroshërbimeve Flask me Prometheus

Do të gjeni gjithashtu një listë të treguesve në README shembuj, të cilat shfaqen në panelin e kontrollit, së bashku me kërkesat e Prometheus që mbushin panelet.

Konfigurimi

Biblioteka ka shumë opsione konfigurimi, shikoni në README projektin e tyre shembuj me shpjegime të shkurtra.

Konfigurimi bazë është treguar lart. Thjesht krijoni një instancë PrometheusMetrics, le ta quajmë metrikat, dhe pastaj me të përcaktoni metrikat shtesë që dëshironi të mbani, duke dekoruar funksionet:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Numëruesit numërojnë thirrjet, ndërsa të tjerët mbledhin metrika në varësi të kohës së këtyre thirrjeve. Ju mund të përcaktoni etiketa për secilën prej tyre, potencialisht duke përdorur vetitë e kërkesës ose përgjigjes. Për shembull:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# grupi sipas pikës përfundimtare qytetari se sa sa rrugë
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Numri i thirrjeve për 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, klikimi në pikën përfundimtare /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ë përfundimtare në këtë shembull) nga biblioteka e paracaktuar:

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

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

Ka mundësi të shmangni ndjekjen e disa pikëve përfundimtare, të regjistroni metrika shtesë të paracaktuara ose të lini jashtë ato që përmenden më sipër, ose të shqetësoni të njëjtën metrikë të jashtëzakonshme në disa pika përfundimtare. Shikoni README projektin për të parë se çfarë është në dispozicion.

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

@app.route('/')
def main():
    pass  # kërkesat e ndjekura nga parazgjedhja

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # metrikat e parazgjedhura nuk mblidhen

# metrika e personalizuar për t'u aplikuar në disa pika përfundimtare
common_counter = metrics.counter(
    'by_endpoint_counter', 'Numri i kërkesave sipas pikave përfundimtare',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # i ndjekur nga metrika e personalizuar dhe e parazgjedhura

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

# regjistro metrikat shtesë të parazgjedhura
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Numri i kërkesave sipas rrugëve të kërkesave',
        labels={'path': lambda: request.path}
    )
)

Biblioteka ka shtesa të lehta për bibliotekat më të njohura multi-procesorë, si uWSGI dhe Gunicorn. Mund të gjeni gjithashtu shembuj të vegjël të përdorimeve të synuara, duke përfshirë multi-procesorin.

Grumbullimi i metrikave

Siç u përmend më lart, biblioteka parazgjedhje siguron një pikë përfundimtare /metrics në aplikacionin Flask, e cila mund të shërbejë si një qëllim për grumbulluesin Prometheus.

Në shembullin e mësipërm me panelin, mund ta synoni Prometheus tuaj në aplikacionin Flask me konfigurimet e parazgjedhura me këtë konfigurations:

scrape_configs:
  - job_name: 'shembuj'

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

Shikoni shembujin e plotë në repo GitHub. Kjo supozon që Prometheus 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, gjatë punës në Kubernetes ose Docker Swarm.

Nëse kjo e zbrazje e pikës përfundimtare të metrikave nuk është për ju, ndoshta sepse nuk dëshironi të lejoni qasjen e jashtme në të, mund ta çaktivizoni lehtësisht, duke kaluar path=None kur krijoni instancën 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ërfundimtare në një port tjetër HTTP, 5099 në shembullin e mësipërm. Alternativisht, nëse ju përshtatet që pika përfundimtare të qëndrojë në të njëjtin aplikacion Flask, por duhet ta ndryshoni rrugën e saj nga /metrics, mund të kaloni një URI tjetër si parametër rrugë ose të përdorni register_endpoint(..), për ta vendosur më vonë.

Linke

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

Faleminderit!

Burimi: habr.com

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