Praćenje mikroservisa Flask pomoću Prometheusa

Nekoliko redaka koda i vaša aplikacija generira metrike, wow!

Da biste razumjeli kako radi prometheus_flask_exporter, potreban je minimalni 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 vam treba za početak! Dodavanjem uvoza i retka za inicijalizaciju PrometheusMetrics, dobit ćete metrike trajanja zahtjeva i brojače zahtjeva, prikazane na krajnjoj točki /metrics Flask aplikacije, u kojoj je registrirano, kao i sve zadane metrike koje dobivate iz osnovne klijentske biblioteke Prometheus.

Možete pronaći jednostavan primjer u GitHub repozitoriju, koji pokreće instancu Prometheus i Grafana uz demo aplikaciju za generiranje metrika, koje će izgledati otprilike ovako:

Praćenje mikroservisa Flask pomoću Prometheusa

Također ćete pronaći popis mjera u README primjeru, koje se prikazuju na nadzornoj ploči, zajedno s Prometheus upitima koji popunjavaju panele.

Podešavanje

Biblioteka ima brojne opcije konfiguracije, pogledajte u README projekta njihove primjere s kratkim objašnjenjem.

Osnovna konfiguracija je prikazana gore. Samo stvorite instancu PrometheusMetrics, nazovimo je metrics, a zatim s njom definirajte dodatne metrike koje želite prikupljati, dekorirajući funkcije:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Brojači broje pozive, dok ostali prikupljaju metrike na temelju trajanja tih poziva. Možete definirati oznake za svaku 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__)

# grupiraj po krajnjoj točki umjesto po putu
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Broj poziva po kolekciji', 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, pritisak na krajnju točku /collection/10002/item/76 uzrokovat će povećanje brojača, na primjer cnt_collection{collection = "10002", status = "200"}, plus dobit ćete zadane metrike (za svaku krajnju točku u ovom primjeru) iz biblioteke po zadanim postavkama:

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

  • flask_http_request_total — Ukupni broj HTTP zahtjeva po metodama i statusima

Postoje opcije za preskočiti praćenje određenih krajnjih točaka, registrirati dodatne metrike prema zadanim postavkama ili preskočiti one navedene iznad, ili primijeniti istu prilagođenu metriku na više krajnjih točaka. Pogledajte README projekt da saznate što je dostupno.

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

@app.route(' / ')
def main():
    pass  # zahtjevi se prate prema zadanim postavkama

@app.route(' / skip')
@metrics.do_not_track()
def skip():
    pass  # zadatne metrike se ne prikupljaju

# prilagođena metrika koja se primjenjuje na više krajnjih točaka
common_counter = metrics.counter(
    'by_endpoint_counter', 'Broj zahtjeva po krajnjim točkama',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route(' / common / one')
@common_counter
def endpoint_one():
    pass  # praćena prilagođenom i zadatnom metrikom

@app.route(' / common / two')
@common_counter
def endpoint_two():
    pass  # također praćena prilagođenom i zadatnom metrikom

# registrirajte dodatne zadatne metrike
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Broj zahtjeva po putanjama zahtjeva',
        labels={'path': lambda: request.path}
    )
)

U biblioteci postoje korisni dodaci za popularne višedretvene biblioteke, kao što su uWSGI i Gunicorn. Također možete pronaći male primjere ciljanih slučajeva upotrebe, uključujući višedretvene.

Prikupljanje metrika

Kao što je spomenuto, biblioteka prema zadanim postavkama pruža krajnju točku /metrics u aplikaciji Flask koja može služiti kao cilj za prikupljač Prometheus.

U gornjem primjeru s nadzornom pločom možete usmjeriti svoj Prometheus na aplikaciju Flask s zadanim postavkama s ovom konfiguracijom:

scrape_configs:
  - job_name: 'example'

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

Pogledajte potpuni primjer u GitHub repozitoriju. To pretpostavlja da Prometheus može pronaći vaše instance aplikacije Flask na http://app:5000/metrics, gdje se ime domene aplikacije može potencijalno rezolvirati na više IP adresa, primjerice, kada radi u Kubernetes ili Docker Swarm.

Ako vam takvo otkrivanje krajnje točke metrika ne odgovara, možda zato što ne želite omogućiti vanjski pristup toj točki, možete je lako onemogućiti prenoseći path=None prilikom stvaranja 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)

Zatim možete koristiti start_http_server(port), da otvorite ovu krajnju točku na drugom HTTP portu, 5099 u gornjem primjeru. Kao alternativu, ako vam ne smeta da se krajnja točka nalazi u istoj aplikaciji Flask, ali vam je potrebno promijeniti njezin put od /metrics, možete ili proslijediti drugu URI kao parametar putanje, ili koristiti register_endpoint(..), kako biste to postavili kasnije.

Linkovi

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

Hvala!

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster