Due righe di codice e la tua applicazione genera metriche, wow!
Per comprendere come funziona prometheus_flask_exporter è sufficiente un esempio minimo:
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 durata delle richieste e contatori delle richieste, visualizzati all'endpoint /metrics dell'applicazione Flask dove è registrato, così come tutte le metriche predefinite che ottieni dalla libreria .
Puoi trovare nel repository GitHub che esegue un'istanza e insieme a un'app demo per generare metriche che appariranno più o meno in questo modo:

Troverai anche un elenco di indicatori in dell'esempio, che sono visualizzati nel pannello di controllo, insieme alle richieste Prometheus che riempiono i pannelli.
Configurazione
Nella libreria ci sono molte opzioni di configurazione, dai un'occhiata nel progetto per i loro esempi con una breve spiegazione.
La configurazione di base è mostrata in alto. Basta creare un'istanza PrometheusMetrics, chiamiamola metriche, e poi con essa definisci ulteriori metriche che desideri raccogliere, decorando le funzioni:
@metrics.counter(..)@metrics.gauge(..)@metrics.summary(..)@metrics.histogram(..)
I contatori conteggiano le chiamate, mentre gli altri raccolgono metriche a seconda della 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, premere l'endpoint /collection/10002/item/76 porterà all'incremento del contatore, ad esempio cnt_collection{collection = "10002", status = "200"}, inoltre otterrai metriche predefinite (per ogni endpoint in questo esempio) dalla libreria predefinita:
flask_http_request_duration_seconds— La durata delle richieste HTTP in secondi per tutte le richieste Flask per metodo, percorso e statoflask_http_request_total— Il numero totale delle richieste HTTP per metodi e stati
Ci sono opzioni per saltare il tracciamento di endpoint specifici, registrare metriche aggiuntive per impostazione predefinita o saltare quelle indicate sopra, oppure applicare la stessa metrica personalizzata a più endpoint. Consulta il progetto per scoprire 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 # le metriche predefinite non vengono 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 dalle metriche personalizzate e predefinite
@app.route('/common/two')
@common_counter
def endpoint_two():
pass # tracciato anche dalle metriche personalizzate e predefinite
# registrare metriche predefinite aggiuntive
metrics.register_default(
metrics.counter(
'by_path_counter', 'Conteggio richieste per percorsi di richiesta',
labels={'path': lambda: request.path}
)
)La libreria offre estensioni convenienti 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 accennato in precedenza, la libreria fornisce per impostazione predefinita un endpoint /metrics nell'applicazione Flask, che può servire come obiettivo per .
Nell'esempio fornito con il dashboard, puoi puntare il tuo Prometheus all'applicazione Flask con le impostazioni predefinite con questa configurazione:
scrape_configs:
- job_name: 'example'
dns_sd_configs:
- names: ['app']
port: 5000
type: A
refresh_interval: 5sGuarda l'esempio completo in . Questo presuppone che Prometheus possa trovare le tue istanze dell'applicazione Flask su http://app:5000/metrics, dove il nome di dominio dell'applicazione potrebbe potenzialmente risolversi in più indirizzi IP, ad esempio, quando si è in o .
Se tale esposizione dell'endpoint delle metriche non è adatta a te, forse perché non desideri consentire accesso esterno a esso, puoi facilmente disabilitarlo 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)Poi puoi usare start_http_server(port), per aprire questo endpoint su un'altra porta HTTP, 5099 nell'esempio sopra. In alternativa, se ti va bene che l'endpoint sia nella stessa applicazione Flask, ma hai bisogno di modificare il suo percorso da /metrics, puoi fornire un altro URI come parametro del percorso oppure usare register_endpoint(..), per impostarlo in seguito.
Link
— Questo è un esportatore Flask per Prometheus
— Utilizzo, esempi e parametri di configurazione
— Esempi di configurazione del monitoraggio delle applicazioni Flask in vari modi
— Questo progetto è su PyPI
— La libreria client ufficiale di Prometheus per Python
Se decidi di provare, non esitare ad aprire un issue su GitHub o a lasciare i tuoi commenti, feedback e suggerimenti!
Grazie!
Fonte: habr.com
