Monitoring Flask microservices cù Prometheus

Un paru di linee di codice è a vostra applicazione genera metrica, wow!

Per capisce cumu funziona prometheus_flacone_exporter un esempiu minimu hè abbastanza:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    return 'OK'

Hè tuttu ciò chì avete bisognu per inizià! Aghjunghjendu una importazione è una linea per l'inizializazione Prometheus Metrics, uttene metrica durata dumanda и richieste contatori, affissatu à u puntu finale / metrica l'applicazione Flask cù quale hè registratu, è ancu tutte e metriche predeterminate chì avete da a basa Biblioteca cliente Prometheus.

pudete truvà esempiu facile à aduprà in u repository GitHub chì esegue l'istanza Prometheus и Grafana inseme cù una applicazione demo per generà metriche chì pareranu cusì:

Monitoring Flask microservices cù Prometheus

Truverete ancu una lista di indicatori in README esempi chì appariscenu in u dashboard, inseme cù e dumande di Prometheus chì populanu i dashboards.

cutter

Ci hè parechje opzioni di cunfigurazione in a biblioteca, fighjate README esempi di prughjettu di elli cù una breve spiegazione.

A cunfigurazione di basa hè mostrata sopra. Basta à creà un esempiu Prometheus Metrics, chjamemu métrica, è dopu aduprate per definisce e metriche supplementari chì vulete cullà per decoru e funzioni:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

I contatori cuntanu e chjama, è altri recullanu metriche basate nantu à a durata di queste chjamate. Pudete definisce etichette per ognuna di queste, potenzialmente usendu proprietà di dumanda o risposta. Per esempiu:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# group by endpoint rather than path
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Number of invocations per collection', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

In l'esempiu sopra, clicchendu nantu à l'endpoint /collection/10002/item/76 farà chì u contatore aumenterà, per esempiu cnt_collection{collection = "10002", status = "200"}, in più uttene e metriche predeterminate (per ogni endpoint in questu esempiu) da a biblioteca predeterminata:

  • flask_http_request_duration_seconds - Durata di a dumanda HTTP in seconde per tutte e richieste Flask per metudu, percorsu è statutu

  • flask_http_request_total - U numeru tutale di dumande HTTP per metudi è stati

Ci sò opzioni per saltà u seguimentu di punti finali specifichi, registrà metriche predeterminate supplementari o saltate quelli elencati sopra, o applicà a stessa metrica persunalizata à parechji punti finali. Cuntrolla README prughjettu per vede ciò chì hè dispunibule.

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    pass  # requests tracked by default

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # default metrics are not collected

# custom metric to be applied to multiple endpoints
common_counter = metrics.counter(
    'by_endpoint_counter', 'Request count by endpoints',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # tracked by the custom and the default metrics

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # also tracked by the custom and the default metrics

# register additional default metrics
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Request count by request paths',
        labels={'path': lambda: request.path}
    )
)

A biblioteca hà estensioni convenienti per e librerie multiprocessing populari cum'è uWSGI è Gunicorn. Pudete ancu truvà picculi esempi di casi d'usu mirati, cumpresu u multiprocessing.

Cullizzioni di metrica

Cumu l'esitatu sopra, a biblioteca furnisce un endpoint per automaticamente / metrica in una applicazione Flask, chì pò serve cum'è mira per Prometheus builder.

In l'esempiu di u dashboard sopra, pudete indirizzà u vostru Prometheus à una applicazione Flask cù paràmetri predeterminati cù sta cunfigurazione:

scrape_configs:
  - job_name: 'example'

    dns_sd_configs:
      - names: ['app']
        port: 5000
        type: A
        refresh_interval: 5s

Vede l'esempiu cumpletu à Repository GitHub. Questu assume chì Prometheus pò truvà e vostre istanze di l'applicazione Flask http://app:5000/metrics, induve u nome di duminiu di l'applicazione puderia esse risolviri in parechje indirizzi IP, per esempiu, quandu eseguite Kubernetes o Sciame Docker.

Se l'esposizione di l'endpoint di metrica in questu modu ùn vi cunvene micca, forse perchè ùn vulete micca permette l'accessu esternu à questu, pudete facilmente disattivà passendu. caminu = nimu quandu crea un esempiu Prometheus Metrics.

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app, path=None)

...

metrics.start_http_server(5099)

Allora pudete aduprà start_http_server (portu)per apre stu endpoint in un altru portu HTTP, 5099 in l'esempiu sopra. In alternativa, sè site cuntentu chì l'endpoint sia in a stessa applicazione Flask, ma avete bisognu di cambià a so strada da / metrica, pudete passà un altru URI cum'è u paràmetru di u percorsu, o aduprà register_endpoint(..)per installallu dopu.

referenze

Se decide di pruvà, sentite liberu di apre un prublema in GitHub o lasciate i vostri cumenti, feedback è suggerimenti!

Grazie!

Source: www.habr.com

Add a comment