Övervakning av Flask Microservices med Prometheus

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:

Övervakning av Flask Microservices med Prometheus

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:

scrape_configs:
  - job_name: 'example'

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

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.

referenser

Om du bestämmer dig för att ge det ett försök, öppna gärna ett problem på GitHub eller lämna dina kommentarer, feedback och förslag!

Tack!

Källa: will.com

Lägg en kommentar