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 .
Možete pronaći u GitHub repozitoriju, koji pokreće instancu i uz demo aplikaciju za generiranje metrika, koje će izgledati otprilike ovako:

Također ćete pronaći popis mjera u primjeru, koje se prikazuju na nadzornoj ploči, zajedno s Prometheus upitima koji popunjavaju panele.
Podešavanje
Biblioteka ima brojne opcije konfiguracije, pogledajte u 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):
passU 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 statusuflask_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 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 .
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: 5sPogledajte potpuni primjer u . 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 ili .
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
— Ovaj exporter bočica za Prometheus
— Korištenje, primjeri i konfiguracijski parametri
— Primjeri postavljanja monitoringa Flask aplikacija na različite načine
— Ovaj projekt je na PyPI
— Službena klijentska biblioteka Prometheus za Python
Ako se odlučite isprobati, slobodno otvorite issue na GitHubu ili ostavite svoje komentare, povratne informacije i prijedloge!
Hvala!
Izvor: habr.com
