Spremljanje mikrostoritev Flask s Prometheusom

Nekaj ​​vrstic kode in vaša aplikacija ustvari meritve, vau!

Da bi razumeli, kako prometheus_ delujebučka_izvoznik zadostuje minimalen primer:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

To je vse, kar potrebujete za začetek! Z dodajanjem uvoza in vrstice za inicializacijo PrometheusMetrics, boste dobili meritve trajanje zahteve и števci zahtev, prikazan na končni točki /metrike aplikacijo Flask, s katero je registriran, kot tudi vse privzete metrike, ki jih dobite od baze Odjemalska knjižnica Prometheus.

lahko najdeš enostaven za uporabo primer v repozitoriju GitHub, ki izvaja primerek Prometej и grafana skupaj s predstavitveno aplikacijo za ustvarjanje meritev, ki bodo videti nekako takole:

Spremljanje mikrostoritev Flask s Prometheusom

Našli boste tudi seznam indikatorjev v README primeri, ki se prikažejo na nadzorni plošči, skupaj s poizvedbami Prometheus, ki zapolnijo nadzorne plošče.

prilagoditev

V knjižnici je veliko možnosti konfiguracije, poglejte README projektni primeri le-teh s kratko razlago.

Osnovna konfiguracija je prikazana zgoraj. Samo ustvarite primerek PrometheusMetrics, recimo temu meritvein ga nato uporabite za definiranje dodatnih meritev, ki jih želite zbrati, tako da okrasite funkcije:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Števci štejejo klice, drugi pa zbirajo meritve glede na trajanje teh klicev. Za vsako od teh lahko definirate oznake, potencialno z uporabo lastnosti zahteve ali odziva. Na primer:

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

V zgornjem primeru klik na končno točko /zbirka/10002/izdelek/76 povzroči na primer povečanje števca cnt_collection{zbirka = "10002", status = "200"}, poleg tega pa boste iz privzete knjižnice dobili privzete meritve (za vsako končno točko v tem primeru):

  • flask_http_request_duration_seconds — Trajanje zahteve HTTP v sekundah za vse zahteve Flask po metodi, poti in statusu

  • flask_http_request_total — Skupno število zahtev HTTP po metodah in statusih

Obstajajo možnosti za preskok sledenja določenim končnim točkam, beleženje dodatnih privzetih meritev ali preskok zgoraj navedenih ali uporabo iste meritve po meri za več končnih točk. Preveri README projekt, da vidite, kaj je na voljo.

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}
    )
)

Knjižnica ima priročne razširitve za priljubljene večprocesne knjižnice, kot sta uWSGI in Gunicorn. Najdete lahko tudi majhne primere ciljno usmerjenih primerov uporabe, vključno z večprocesiranjem.

Zbirka meritev

Kot je navedeno zgoraj, knjižnica privzeto zagotavlja končno točko /metrike v aplikaciji Flask, ki lahko služi kot tarča za Prometej graditelj.

V zgornjem primeru nadzorne plošče bi lahko svoj Prometheus usmerili na aplikacijo Flask s privzetimi nastavitvami s to konfiguracijo:

scrape_configs:
  - job_name: 'example'

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

Oglejte si celoten primer na Repozitoriji GitHub. To predvideva, da lahko Prometheus najde vaše primerke aplikacije Flask na http://app:5000/metrics, kjer bi lahko ime domene aplikacije potencialno razrešilo več naslovov IP, na primer pri zagonu Kubernetes ali Docker roj.

Če vam razkrivanje končne točke metrike na ta način ne ustreza, morda zato, ker ne želite dovoliti zunanjega dostopa do nje, jo lahko preprosto onemogočite s posredovanjem pot=Brez pri ustvarjanju primerka 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)

Potem lahko uporabite start_http_strežnik(vrata)da odprete to končno točko na drugih vratih HTTP, 5099 v zgornjem primeru. Če ste zadovoljni s tem, da je končna točka v isti aplikaciji Flask, vendar morate spremeniti njeno pot iz /metrike, lahko posredujete drug URI kot parameter poti ali uporabite register_endpoint(..)da ga namestite pozneje.

reference

Če se odločite poskusiti, odprite vprašanje na GitHubu ali pustite svoje komentarje, povratne informacije in predloge!

Hvala!

Vir: www.habr.com

Dodaj komentar