Monitoraggio dei microservizi Flask con Prometheus

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

Puoi trovare un esempio facile da usare nel repository GitHub, che esegue un'istanza Prometheus e Grafana insieme a un'app dimostrativa per generare metriche che appariranno più o meno così:

Monitoraggio dei microservizi Flask con Prometheus

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

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

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

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

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

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

Se decidi di provare, non esitare ad aprire un issue su GitHub o lasciare i tuoi commenti, feedback e suggerimenti!

Grazie!

Fonte: habr.com

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