Ett par rader kod och din applikation genererar mätvärden, wow!
För att förstå hur prometheus_ fungerarflaska_exportör ett minimalt exempel räcker:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'
Det är allt du behöver för att komma igång! Genom att lägga till en import och en rad för initiering PrometheusMetrics, får du mätvärden begärans varaktighet и begäran räknare, visas vid slutpunkten /metrik Flask-applikationen den är registrerad med, samt alla standardmått du får från basen Prometheus klientbibliotek.
du kan hitta lättanvänt exempel i GitHub-förvaret som kör instansen Prometheus и grafana tillsammans med en demoapplikation för att generera mätvärden som kommer att se ut ungefär så här:
Du hittar också en lista med indikatorer i README exempel som visas i instrumentpanelen, tillsammans med Prometheus-frågor som fyller instrumentpanelerna.
justering
Det finns många konfigurationsalternativ i biblioteket, titta på README projektexempel på dem med en kort förklaring.
Den grundläggande konfigurationen visas ovan. Skapa bara en instans PrometheusMetrics, låt oss kalla det metrik, och använd den sedan för att definiera de ytterligare mätvärden du vill samla in genom att dekorera funktionerna:
@metrics.counter(..)
@metrics.gauge(..)
@metrics.summary(..)
@metrics.histogram(..)
Räknare räknar samtal, och andra samlar in mätvärden baserat på varaktigheten av dessa samtal. Du kan definiera etiketter för var och en av dessa, eventuellt med hjälp av förfrågnings- eller svarsegenskaper. Till exempel:
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 exemplet ovan klickar du på slutpunkten /collection/10002/item/76 kommer att få räknaren att öka till exempel cnt_collection{collection = "10002", status = "200"}, plus att du får standardmåtten (för varje slutpunkt i det här exemplet) från standardbiblioteket:
flask_http_request_duration_seconds — HTTP-förfrågningslängd i sekunder för alla Flask-förfrågningar efter metod, sökväg och status
flask_http_request_total — Totalt antal HTTP-förfrågningar efter metoder och status
Det finns alternativ för att hoppa över spårning av specifika slutpunkter, logga ytterligare standardmått eller hoppa över de som anges ovan, eller tillämpa samma anpassade mätvärde på flera slutpunkter. Kolla upp README projekt för att se vad som finns tillgängligt.
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 bekväma tillägg för populära multiprocessorbibliotek som uWSGI och Gunicorn. Du kan också hitta små exempel på målinriktade användningsfall, inklusive multiprocessing.
Insamling av statistik
Som nämnts ovan tillhandahåller biblioteket en slutpunkt som standard /metrik i en Flask-applikation, som kan fungera som mål för Prometheus byggare.
I instrumentpanelsexemplet ovan kan du rikta din Prometheus till en Flask-applikation med standardinställningar med denna konfiguration:
Se hela exemplet på GitHub-förråd. Detta förutsätter att Prometheus kan hitta dina Flask-applikationsinstanser på http://app:5000/metrics, där applikationens domännamn potentiellt kan lösas till flera IP-adresser, till exempel när den körs in Kubernetes eller Docker svärm.
Om det inte passar dig att exponera mätändpunkten på detta sätt, kanske för att du inte vill tillåta extern åtkomst till den, kan du enkelt inaktivera den genom att passera path=Ingen när du skapar en instans 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)
Då kan du använda start_http_server(port)för att öppna denna slutpunkt på en annan HTTP-port, 5099 i exemplet ovan. Alternativt, om du är nöjd med att slutpunkten finns i samma Flask-applikation, men du måste ändra dess sökväg från /metrik, kan du antingen skicka en annan URI som sökvägsparameter eller använda register_endpoint(..)för att installera det senare.