Praćenje Flask mikroservisa s Prometheusom

Nekoliko redaka koda i vaša aplikacija generira metriku, vau!

Da bismo razumjeli kako radi prometheus_boca_izvoznik dovoljan je minimalan primjer:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

To je sve što trebate za početak! Dodavanjem uvoza i linije za inicijalizaciju PrometheusMetrics, dobit ćete metriku trajanje zahtjeva и brojači zahtjeva, prikazan na krajnjoj točki /metrika aplikaciju Flask na koju je registriran, kao i sve zadane metrike koje dobivate iz baze Prometheus klijentska biblioteka.

možeš naći jednostavan za korištenje primjer u GitHub repozitoriju koji pokreće instancu Prometej и grafana zajedno s demo aplikacijom za generiranje metrike koja će izgledati otprilike ovako:

Praćenje Flask mikroservisa s Prometheusom

Također ćete pronaći popis indikatora u README primjeri koji se pojavljuju na nadzornoj ploči, zajedno s Prometheus upitima koji popunjavaju nadzorne ploče.

podešavanje

Postoji mnogo opcija konfiguracije u knjižnici, pogledajte README projicirati njihove primjere uz kratko obrazloženje.

Osnovna konfiguracija prikazana je gore. Samo stvorite instancu PrometheusMetrics, nazovimo to metrika, a zatim ga upotrijebite za definiranje dodatnih metrika koje želite prikupiti ukrašavanjem funkcija:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Brojači broje pozive, a drugi prikupljaju metriku na temelju trajanja tih poziva. Možete definirati oznake za svaki od njih, potencijalno koristeći svojstva zahtjeva ili odgovora. Na primjer:

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

U gornjem primjeru, klik na krajnju točku /zbirka/10002/stavka/76 uzrokovat će, na primjer, povećanje brojača cnt_collection{zbirka = "10002", status = "200"}, uz to ćete dobiti zadanu metriku (za svaku krajnju točku u ovom primjeru) iz zadane biblioteke:

  • flask_http_request_duration_seconds — Trajanje HTTP zahtjeva u sekundama za sve Flask zahtjeve po metodi, putu i statusu

  • flask_http_request_total — Ukupan broj HTTP zahtjeva po metodama i statusima

Postoje opcije za preskakanje praćenja određenih krajnjih točaka, bilježenje dodatnih zadanih mjernih podataka ili preskakanje gore navedenih ili za primjenu iste prilagođene mjerne vrijednosti na više krajnjih točaka. Provjeri README projekt da vidite što je dostupno.

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 prikladna proširenja za popularne višeprocesne biblioteke kao što su uWSGI i Gunicorn. Također možete pronaći male primjere ciljanih slučajeva upotrebe, uključujući višeprocesiranje.

Zbirka metrike

Kao što je gore spomenuto, biblioteka prema zadanim postavkama pruža krajnju točku /metrika u aplikaciji Flask, koja može poslužiti kao cilj za Prometej graditelj.

U gornjem primjeru nadzorne ploče, mogli biste ciljati svoj Prometheus na aplikaciju Flask sa zadanim postavkama s ovom konfiguracijom:

scrape_configs:
  - job_name: 'example'

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

Pogledajte cijeli primjer na GitHub repozitoriji. Ovo pretpostavlja da Prometheus može pronaći vaše instance Flask aplikacije na http://app:5000/metrics, gdje se naziv domene aplikacije potencijalno može razriješiti na više IP adresa, na primjer kada se izvodi Kubernetes ili Docker Roj.

Ako vam izlaganje krajnje točke metrike na ovaj način ne odgovara, možda zato što ne želite dopustiti vanjski pristup njoj, možete je jednostavno onemogućiti prosljeđivanjem put=Ništa prilikom kreiranja instance 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)

Tada možete koristiti start_http_server(port)za otvaranje ove krajnje točke na drugom HTTP priključku, 5099 u gornjem primjeru. Alternativno, ako ste zadovoljni time što je krajnja točka u istoj Flask aplikaciji, ali trebate promijeniti njen put iz /metrika, možete proslijediti drugi URI kao parametar staze ili koristiti krajnja_točka_registra(..)da biste ga kasnije instalirali.

reference

Ako odlučite isprobati, slobodno otvorite problem na GitHubu ili ostavite svoje komentare, povratne informacije i prijedloge!

Hvala vam!

Izvor: www.habr.com

Dodajte komentar