Nadgledanje Flask Microservices sa Prometheusom

Nekoliko linija koda i vaša aplikacija generiše metriku, wow!

Da biste razumjeli kako prometheus_ radipljoska_izvoznik dovoljan 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 da započnete! Dodavanjem uvoza i linije za inicijalizaciju PrometheusMetrics, dobićete metriku trajanje zahtjeva и brojači zahteva, prikazano na krajnjoj tački /metrics Flask aplikaciju za koju je registrovan, kao i sve podrazumevane metrike koje dobijate iz baze Prometheus klijentska biblioteka.

Mozeš naci primjer jednostavan za korištenje u GitHub spremištu koje pokreće instancu Prometej и grafana zajedno s demo aplikacijom za generiranje metrike koja će izgledati otprilike ovako:

Nadgledanje Flask Microservices sa Prometheusom

Takođe ćete pronaći listu indikatora u README primjeri koji se pojavljuju na kontrolnoj tabli, zajedno sa Prometheus upitima koji popunjavaju nadzorne ploče.

podešavanje

Postoji mnogo opcija konfiguracije u biblioteci, pogledajte README projektne primjere istih sa kratkim objašnjenjem.

Osnovna konfiguracija je prikazana iznad. Samo kreirajte instancu PrometheusMetrics, nazovimo to metrike, a zatim ga upotrijebite da definirate dodatne metrike koje želite prikupiti ukrašavanjem funkcija:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Brojači broje pozive, a drugi prikupljaju metriku na osnovu 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__)

# 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, klikom na krajnju tačku /collection/10002/item/76 će uzrokovati povećanje brojača, na primjer cnt_collection{collection = "10002", status = "200"}, plus dobit ćete zadanu metriku (za svaku krajnju tačku u ovom primjeru) iz zadane biblioteke:

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

  • flask_http_request_total — Ukupan broj HTTP zahtjeva prema metodama i statusima

Postoje opcije za preskakanje praćenja određenih krajnjih tačaka, evidentiranje dodatnih zadanih metrika ili preskakanje gore navedenih ili primjenu iste prilagođene metrike na više krajnjih tačaka. Provjeri README projekta da vidite šta 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}
    )
)

Biblioteka ima zgodne ekstenzije za popularne biblioteke za više procesa kao što su uWSGI i Gunicorn. Također možete pronaći male primjere ciljanih slučajeva upotrebe, uključujući višeprocesiranje.

Kolekcija metrika

Kao što je gore pomenuto, biblioteka podrazumevano obezbeđuje krajnju tačku /metrics u Flask aplikaciji, koja može poslužiti kao meta za Prometej graditelj.

U gornjem primjeru kontrolne ploče, možete ciljati svoj Prometheus na Flask aplikaciju sa zadanim postavkama s ovom konfiguracijom:

scrape_configs:
  - job_name: 'example'

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

Cijeli primjer pogledajte na GitHub spremišta. Ovo pretpostavlja da Prometheus može pronaći instance vaše Flask aplikacije http://app:5000/metrics, gdje se naziv domene aplikacije potencijalno može razlučiti na više IP adresa, na primjer kada se pokreće Kubernet ili Docker roj.

Ako vam izlaganje krajnje tačke metrike na ovaj način ne odgovara, možda zato što ne želite dopustiti vanjski pristup njoj, možete je jednostavno onemogućiti propuštanjem path=Nijedan 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)

Onda možete koristiti start_http_server(port)da otvorite ovu krajnju tačku na drugom HTTP portu, 5099 u gornjem primjeru. Alternativno, ako ste zadovoljni što je krajnja tačka u istoj Flask aplikaciji, ali morate promijeniti njenu putanju iz /metrics, možete ili proslijediti drugi URI kao parametar putanje ili koristiti register_endpoint(..)da ga kasnije instalirate.

reference

Ako odlučite da pokušate, slobodno otvorite problem na GitHubu ili ostavite svoje komentare, povratne informacije i prijedloge!

Hvala vam!

izvor: www.habr.com

Dodajte komentar