Bastano poche righe di codice e la tua applicazione genera metriche, wow!
Per capire come funziona prometheus_flask_exporter è sufficiente un semplice esempio:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'Questo è tutto ciò che serve per iniziare! Aggiungendo l'import e la riga per l'inizializzazione PrometheusMetrics, otterrai metriche della durata delle richieste e contatori delle richieste, visualizzate nel punto finale /metrics dell'applicazione Flask in cui è registrato, oltre a tutte le metriche predefinite che ricevi dalla libreria .
Puoi trovare nel repository GitHub, che esegue un'istanza e insieme a un'app dimostrativa per generare metriche che appariranno più o meno così:

Troverai anche un elenco di metriche in esempio, visualizzate nel cruscotto, insieme alle query di Prometheus che popolano i pannelli.
Impostazione
La libreria offre molte opzioni di configurazione, dai un'occhiata ai progetti per i loro esempi con una breve spiegazione.
La configurazione di base è mostrata sopra. Basta creare un'istanza PrometheusMetrics, chiamiamola metriche, e poi usalo per determinare ulteriori metriche che desideri raccogliere decorando le funzioni:
@metrics.counter(..)@metrics.gauge(..)@metrics.summary(..)@metrics.histogram(..)
I contatori contano le chiamate, mentre gli altri raccolgono metriche in base alla durata di queste chiamate. Puoi definire etichette per ciascuno di essi, utilizzando potenzialmente le proprietà della richiesta o della risposta. Ad esempio:
from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
# raggruppa per endpoint piuttosto che per percorso
metrics = PrometheusMetrics(app, group_by='endpoint')
@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
'cnt_collection', 'Numero di invocazioni per collezione', labels={
'collection': lambda: request.view_args['collection_id'],
'status': lambda resp: resp.status_code
})
def get_item_from_collection(collection_id, item_id):
passNell'esempio sopra, fare clic sull'endpoint /collection/10002/item/76 porterà all'aumento del contatore, ad esempio cnt_collection{collection = «10002», status = «200»}, e otterrai metriche predefinite (per ogni endpoint in questo esempio) dalla libreria predefinita:
flask_http_request_duration_seconds— Durata della richiesta HTTP in secondi per tutte le richieste Flask secondo metodo, percorso e statoflask_http_request_total— Numero totale di richieste HTTP per metodi e stati
Esistono opzioni per ignorare il monitoraggio di determinati endpoint, registrare metriche aggiuntive predefinite o omettere quelle sopra indicate, oppure applicare la stessa metrica personalizzata a più endpoint. Scopri di più su progetto per vedere cosa è disponibile.
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
pass # richieste tracciate per impostazione predefinita
@app.route('/skip')
@metrics.do_not_track()
def skip():
pass # metriche predefinite non raccolte
# metrica personalizzata da applicare a più endpoint
common_counter = metrics.counter(
'by_endpoint_counter', 'Conteggio richieste per endpoint',
labels={'endpoint': lambda: request.endpoint}
)
@app.route('/common/one')
@common_counter
def endpoint_one():
pass # tracciato da metriche personalizzate e predefinite
@app.route('/common/two')
@common_counter
def endpoint_two():
pass # anche tracciato da metriche personalizzate e predefinite
# registrare metriche aggiuntive predefinite
metrics.register_default(
metrics.counter(
'by_path_counter', 'Conteggio richieste per percorsi di richiesta',
labels={'path': lambda: request.path}
)
)La libreria offre estensioni pratiche per le popolari librerie multi-processo, come uWSGI e Gunicorn. Puoi anche trovare piccoli esempi di casi d'uso target, inclusi quelli multi-processo.
Raccolta delle metriche
Come menzionato sopra, la libreria fornisce per impostazione predefinita un endpoint /metrics nell'app Flask, che può fungere da obiettivo per .
Nell'esempio sopra con il dashboard, puoi configurare il tuo Prometheus per puntare all'app Flask con le impostazioni predefinite usando questa configurazione:
scrape_configs:
- job_name: 'example'
dns_sd_configs:
- names: ['app']
port: 5000
type: A
refresh_interval: 5sGuarda un esempio completo in . Questo presuppone che Prometheus possa trovare le tue istanze dell'app Flask su http://app:5000/metrics, dove il nome di dominio dell'app può potenzialmente risolversi in più indirizzi IP, ad esempio, quando si opera in o .
Se tale esposizione del punto finale delle metriche non ti conviene, forse perché non vuoi consentire l'accesso esterno ad esso, puoi facilmente disattivarlo passando path=None quando crei un'istanza 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)Puoi quindi utilizzare start_http_server(port), per aprire questo punto finale su un'altra porta HTTP, 5099 nell'esempio sopra. In alternativa, se sei d'accordo che il punto finale si trovi nella stessa applicazione Flask, ma hai bisogno di cambiare il suo percorso da /metrics, puoi passare un altro URI come parametro del percorso o utilizzare register_endpoint(..), per impostarlo più tardi.
Link
— Questo è un esportatore Flask per Prometheus
— Utilizzo, esempi e parametri di configurazione
— Esempi di configurazione del monitoraggio delle applicazioni Flask in diversi modi
— Questo progetto su PyPI
— La libreria client ufficiale Prometheus per Python
Se decidi di provare, non esitare ad aprire un issue su GitHub o lasciare i tuoi commenti, feedback e suggerimenti!
Grazie!
Fonte: habr.com
