Monitoraggio dei microservizi Flask con Prometheus

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 client di Prometheus.

Puoi trovare un esempio facile da usare nel repository GitHub che esegue un'istanza Prometheus e Grafana insieme a un'app demo per generare metriche che appariranno più o meno in questo modo:

Monitoraggio dei microservizi Flask con Prometheus

Troverai anche un elenco di indicatori in README 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 README 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):
    pass

Nell'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 stato

  • flask_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 README 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 il raccolto Prometheus.

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: 5s

Guarda l'esempio completo in repository GitHub. 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 Kubernetes o Docker Swarm.

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

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

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster