Monitorizarea microserviciilor Flask cu ajutorul Prometheus

Câteva linii de cod și aplicația ta generează metrici, wow!

Pentru a înțelege cum funcționează prometheus_flask_exporter este suficient un exemplu minim:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Acesta este tot ce ai nevoie pentru a începe! Adăugând importul și linia pentru inițializare PrometheusMetrics, vei obține metrici timpului de răspuns al cererilor și contorii cererilor, afișați în endpoint /metrics aplicației Flask, în care acesta este înregistrat, precum și toate metricile implicite pe care le primești din biblioteca client Prometheus.

Poți găsi un exemplu ușor de utilizat în repository-ul GitHub, care rulează o instanță Prometheus și Grafana împreună cu aplicația demonstrativă pentru generarea metricilor, care vor arăta cam așa:

Monitorizarea microserviciilor Flask cu ajutorul Prometheus

De asemenea, vei găsi lista metodelor în README exemplul afișat pe tabloul de bord, împreună cu cererile Prometheus care umplu tablourile.

Configurare

Biblioteca are o mulțime de opțiuni de configurare, verifică în README proiectul lor exemple cu explicații sumare.

Configurația de bază este prezentată mai sus. Pur și simplu creează o instanță PrometheusMetrics, să o numim metrics, apoi folosește-o pentru a defini metricile suplimentare pe care vrei să le colectezi, decorând funcțiile:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Contorii numără apelurile, iar ceilalți colectează metrici în funcție de durata acestor apeluri. Poți defini etichete pentru fiecare dintre ele, folosind potențial proprietățile cererii sau răspunsului. De exemplu:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# grupare după endpoint mai degrabă decât după cale
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Numărul apelurilor per colecție', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

În exemplul de mai sus, accesarea endpoint-ului /collection/10002/item/76 va duce la creșterea contorului, de exemplu cnt_collection{collection = "10002", status = "200"}, plus vei primi metricile implicite (pentru fiecare endpoint în acest exemplu) din biblioteca implicită:

  • flask_http_request_duration_seconds — Durata cererii HTTP în secunde pentru toate cererile Flask după metodă, cale și status

  • flask_http_request_total — Numărul total de cereri HTTP după metode și statusuri

Există opțiuni pentru a ocoli urmărirea unor puncte finale specifice, pentru a înregistra metrici suplimentare în mod implicit sau pentru a sări peste cele menționate mai sus, sau pentru a aplica aceeași metrică personalizată mai multor puncte finale. Consultați README proiectului pentru a vedea ce este disponibil.

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

@app.route(' / ')
def main():
    pass  # cererile sunt urmărite implicit

@app.route(' / skip')
@metrics.do_not_track()
def skip():
    pass  # metricile implicite nu sunt colectate

# metric personalizat care să fie aplicat mai multor puncte finale
common_counter = metrics.counter(
    'by_endpoint_counter', 'Numărul de cereri pe puncte finale',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route(' / common / one')
@common_counter
def endpoint_one():
    pass  # urmărit de metricile personalizate și cele implicite

@app.route(' / common / two')
@common_counter
def endpoint_two():
    pass  # de asemenea, urmărit de metricile personalizate și cele implicite

# înregistrați metrici suplimentare implicite
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Numărul de cereri pe căile de cerere',
        labels={'path': lambda: request.path}
    )
)

Biblioteca oferă extensii convenabile pentru biblioteci populare multi-threading, cum ar fi uWSGI și Gunicorn. De asemenea, puteți găsi exemple mici de cazuri de utilizare țintă, inclusiv cele multi-threading.

Colectarea metricilor

După cum s-a menționat mai sus, biblioteca oferă implicit un punct final /metrics în aplicația Flask, care poate servi ca țintă pentru colectorul Prometheus.

În exemplul de mai sus cu tabloul de bord, puteți să vă îndreptați Prometheus către aplicația Flask cu setările implicite folosind următoarea configurație:

scrape_configs:
  - job_name: 'example'

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

Consultati un exemplu complet în repozitoriul GitHub. Aceasta presupune că Prometheus poate găsi instanțele aplicației Flask pe http://app:5000/metrics, unde numele de domeniu al aplicației poate fi rezolvat potențial la mai multe adrese IP, de exemplu, în cazul în care funcționează în Kubernetes sau Dar înseamnă asta că puteți folosi același fișier docker-compose în.

Dacă astfel de dezvăluiri ale endpointului metricilor nu vi se potrivesc, poate pentru că nu doriți să permiteți acces extern la acesta, îl puteți dezactiva cu ușurință, prin transmiterea path=None la crearea unei instanțe 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)

Apoi puteți folosi start_http_server(port), pentru a deschide acest punct final pe un alt port HTTP, 5099 în exemplul de mai sus. Ca alternativă, dacă nu aveți probleme cu faptul că endpointul se află în aceeași aplicație Flask, dar trebuie să schimbați calea acesteia /metrics, puteți fie să transmiteți un alt URI ca parametru al căii, fie să folosiți register_endpoint(..), pentru a stabili asta mai târziu.

Linkuri

Dacă decideți să încercați, nu ezitați să deschideți un issue pe GitHub sau să lăsați comentarii, feedback și sugestii!

Mulțumesc!

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster