Câteva linii de cod și aplicația ta generează metrici, wow!
Pentru a înțelege cum funcționează prometheus_flask_exporter este suficient un exemplu minim:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('')
def main():
return 'OK'Acesta este tot ce ai nevoie pentru a începe! Adăugând importul și linia pentru inițializare PrometheusMetrics, vei obține metrici timpului de răspuns al cererilor și contorii cererilor, afișați în endpoint /metrics aplicației Flask, în care acesta este înregistrat, precum și toate metricile implicite pe care le primești din biblioteca .
Poți găsi în repository-ul GitHub, care rulează o instanță și împreună cu aplicația demonstrativă pentru generarea metricilor, care vor arăta cam așa:

De asemenea, vei găsi lista metodelor în exemplul afișat pe tabloul de bord, împreună cu cererile Prometheus care umplu tablourile.
Configurare
Biblioteca are o mulțime de opțiuni de configurare, verifică în proiectul lor exemple cu explicații sumare.
Configurația de bază este prezentată mai sus. Pur și simplu creează o instanță PrometheusMetrics, să o numim metrics, apoi folosește-o pentru a defini metricile suplimentare pe care vrei să le colectezi, decorând funcțiile:
@metrics.counter(..)@metrics.gauge(..)@metrics.summary(..)@metrics.histogram(..)
Contorii numără apelurile, iar ceilalți colectează metrici în funcție de durata acestor apeluri. Poți defini etichete pentru fiecare dintre ele, folosind potențial proprietățile cererii sau răspunsului. De exemplu:
from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
# grupare după endpoint mai degrabă decât după cale
metrics = PrometheusMetrics(app, group_by='endpoint')
@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
'cnt_collection', 'Numărul apelurilor per colecție', labels={
'collection': lambda: request.view_args['collection_id'],
'status': lambda resp: resp.status_code
})
def get_item_from_collection(collection_id, item_id):
passÎn exemplul de mai sus, accesarea endpoint-ului /collection/10002/item/76 va duce la creșterea contorului, de exemplu cnt_collection{collection = "10002", status = "200"}, plus vei primi metricile implicite (pentru fiecare endpoint în acest exemplu) din biblioteca implicită:
flask_http_request_duration_seconds— Durata cererii HTTP în secunde pentru toate cererile Flask după metodă, cale și statusflask_http_request_total— Numărul total de cereri HTTP după metode și statusuri
Există opțiuni pentru a ocoli urmărirea unor puncte finale specifice, pentru a înregistra metrici suplimentare în mod implicit sau pentru a sări peste cele menționate mai sus, sau pentru a aplica aceeași metrică personalizată mai multor puncte finale. Consultați proiectului pentru a vedea ce este disponibil.
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route(' / ')
def main():
pass # cererile sunt urmărite implicit
@app.route(' / skip')
@metrics.do_not_track()
def skip():
pass # metricile implicite nu sunt colectate
# metric personalizat care să fie aplicat mai multor puncte finale
common_counter = metrics.counter(
'by_endpoint_counter', 'Numărul de cereri pe puncte finale',
labels={'endpoint': lambda: request.endpoint}
)
@app.route(' / common / one')
@common_counter
def endpoint_one():
pass # urmărit de metricile personalizate și cele implicite
@app.route(' / common / two')
@common_counter
def endpoint_two():
pass # de asemenea, urmărit de metricile personalizate și cele implicite
# înregistrați metrici suplimentare implicite
metrics.register_default(
metrics.counter(
'by_path_counter', 'Numărul de cereri pe căile de cerere',
labels={'path': lambda: request.path}
)
)Biblioteca oferă extensii convenabile pentru biblioteci populare multi-threading, cum ar fi uWSGI și Gunicorn. De asemenea, puteți găsi exemple mici de cazuri de utilizare țintă, inclusiv cele multi-threading.
Colectarea metricilor
După cum s-a menționat mai sus, biblioteca oferă implicit un punct final /metrics în aplicația Flask, care poate servi ca țintă pentru .
În exemplul de mai sus cu tabloul de bord, puteți să vă îndreptați Prometheus către aplicația Flask cu setările implicite folosind următoarea configurație:
scrape_configs:
- job_name: 'example'
dns_sd_configs:
- names: ['app']
port: 5000
type: A
refresh_interval: 5sConsultati un exemplu complet în . Aceasta presupune că Prometheus poate găsi instanțele aplicației Flask pe http://app:5000/metrics, unde numele de domeniu al aplicației poate fi rezolvat potențial la mai multe adrese IP, de exemplu, în cazul în care funcționează în sau .
Dacă astfel de dezvăluiri ale endpointului metricilor nu vi se potrivesc, poate pentru că nu doriți să permiteți acces extern la acesta, îl puteți dezactiva cu ușurință, prin transmiterea path=None la crearea unei instanțe 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)Apoi puteți folosi start_http_server(port), pentru a deschide acest punct final pe un alt port HTTP, 5099 în exemplul de mai sus. Ca alternativă, dacă nu aveți probleme cu faptul că endpointul se află în aceeași aplicație Flask, dar trebuie să schimbați calea acesteia /metrics, puteți fie să transmiteți un alt URI ca parametru al căii, fie să folosiți register_endpoint(..), pentru a stabili asta mai târziu.
Linkuri
— Acest exporter Flask pentru Prometheus
— Utilizare, exemple și parametrii de configurare
— Exemple de configurare a monitorizării aplicațiilor Flask în diverse moduri
— Acest proiect este disponibil pe PyPI
— Biblioteca oficială client Prometheus pentru Python
Dacă decideți să încercați, nu ezitați să deschideți un issue pe GitHub sau să lăsați comentarii, feedback și sugestii!
Mulțumesc!
Sursa: habr.com
