Overvågning af Flask-mikrotjenester med Prometheus
Et par linjer kode og din applikation genererer metrics, wow!
For at forstå, hvordan prometheus virker_kolbe_eksportør et minimalt eksempel er nok:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'
Det er alt hvad du behøver for at komme i gang! Ved at tilføje en import og en linje til initialisering Prometheus Metrics, vil du få metrics anmodningens varighed и anmodningstællerevises ved slutpunktet /metrics Flask-appen, den er registreret med, plus eventuelle standardmetrikker, du får fra basen Prometheus klientbibliotek.
du kan finde let at bruge eksempel i GitHub-lageret, der starter instansen Prometheus и grafana sammen med en demoapplikation til generering af metrics, der ville se sådan ud:
Du finder også en liste over indikatorer i README eksempler, der vises i dashboardet sammen med Prometheus-forespørgsler, der udfylder dashboards.
justering
Biblioteket har en masse konfigurationsmuligheder, se på README projicere deres eksempler med en kort forklaring.
Den grundlæggende konfiguration er vist ovenfor. Bare instansier Prometheus Metrics, lad os kalde det målinger, og brug den derefter til at definere yderligere metrics, du vil indsamle ved at dekorere funktioner:
@metrics.counter(..)
@metrics.gauge(..)
@metrics.summary(..)
@metrics.histogram(..)
Tællerne tæller opkald, og resten indsamler metrics baseret på varigheden af disse opkald. Du kan definere etiketter for hver af disse, muligvis ved at bruge anmodnings- eller svaregenskaber. For eksempel:
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
I eksemplet ovenfor, klik på slutpunktet /samling/10002/item/76 vil få tælleren til at stige, f.eks. cnt_collection{samling = "10002", status = "200"}, plus du får standardmetrics (for hvert slutpunkt i dette eksempel) fra standardbiblioteket:
flask_http_request_duration_seconds - HTTP-anmodningsvarighed i sekunder for alle Flask-anmodninger efter metode, sti og status
flask_http_request_total — Samlet antal HTTP-anmodninger efter metoder og statusser
Der er muligheder for at springe over sporing af bestemte endepunkter, registrere yderligere standardmålinger eller springe ovenstående over eller anvende den samme tilpassede måling på flere endepunkter. Tjek ud README projekt for at se, hvad der er tilgængeligt.
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}
)
)
Biblioteket har praktiske udvidelser til populære multiprocessorbiblioteker såsom uWSGI og Gunicorn. Du kan også finde små eksempler på target use cases, herunder multiprocessing.
Indsamling af metrics
Som nævnt ovenfor giver standardbiblioteket et slutpunkt /metrics i en Flask-applikation, som kan tjene som mål for samler Prometheus.
I dashboardeksemplet ovenfor kan du målrette din Prometheus til en Flask-app med standardindstillinger som denne:
Se det fulde eksempel på GitHub-depoter. Dette forudsætter, at Prometheus kan finde dine Flask-applikationsforekomster på http://app:5000/metrics, hvor applikationens domænenavn potentielt kan løses til flere IP-adresser, f.eks. når den kører ind Kubernetes eller Docker sværm.
Hvis det ikke passer dig at eksponere metric-slutpunktet på denne måde, måske fordi du ikke vil tillade ekstern adgang til det, kan du nemt deaktivere det ved at bestå sti=Ingen ved instansiering 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)
Så kan du bruge start_http_server(port)for at åbne dette endepunkt på en anden HTTP-port, 5099 i ovenstående eksempel. Alternativt, hvis du er tilfreds med, at slutpunktet er i den samme Flask-app, men har brug for at ændre dets sti fra /metrics, kan du enten sende en anden URI som stiparameter eller bruge register_endpoint(..)for at installere det senere.