Overvåking av flaskemikrotjenester med Prometheus

Et par linjer med kode og applikasjonen din genererer beregninger, wow!

For å forstå hvordan prometheus_ fungererkolbe_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 du trenger for å komme i gang! Ved å legge til en import og en linje for initialisering PrometheusMetrics, vil du få beregninger forespørselsvarighet и forespørsel tellere, vist ved endepunktet /metrics Flask-applikasjonen den er registrert med, samt alle standardberegningene du får fra basen Prometheus klientbibliotek.

du kan finne enkelt å bruke eksempel i GitHub-depotet som kjører forekomsten Prometheus и grafana sammen med en demoapplikasjon for å generere beregninger som vil se omtrent slik ut:

Overvåking av flaskemikrotjenester med Prometheus

Du finner også en liste over indikatorer i README eksempler som vises i dashbordet, sammen med Prometheus-spørringer som fyller dashbordene.

justering

Det er mange konfigurasjonsmuligheter i biblioteket, se på README prosjekteksempler på dem med en kort forklaring.

Den grunnleggende konfigurasjonen er vist ovenfor. Bare lag en instans PrometheusMetrics, la oss kalle det beregninger, og bruk den til å definere de ekstra beregningene du vil samle inn ved å dekorere funksjonene:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Tellere teller samtaler, og andre samler inn beregninger basert på varigheten av disse samtalene. Du kan definere etiketter for hver av disse, potensielt ved å bruke forespørsels- eller svaregenskaper. 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 klikker du på endepunktet /collection/10002/item/76 vil føre til at telleren for eksempel øker cnt_collection{collection = "10002", status = "200"}, pluss at du får standardberegningene (for hvert endepunkt i dette eksemplet) fra standardbiblioteket:

  • flask_http_request_duration_seconds — HTTP-forespørselsvarighet i sekunder for alle Flask-forespørsler etter metode, bane og status

  • flask_http_request_total — Totalt antall HTTP-forespørsler etter metoder og statuser

Det finnes alternativer for å hoppe over sporing av spesifikke endepunkter, logge flere standardverdier eller hoppe over de som er oppført ovenfor, eller bruke den samme egendefinerte beregningen på flere endepunkter. Sjekk ut README prosjekt for å se hva som er tilgjengelig.

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 utvidelser for populære multiprosesseringsbiblioteker som uWSGI og Gunicorn. Du kan også finne små eksempler på målrettede brukstilfeller, inkludert multiprosessering.

Samling av beregninger

Som nevnt ovenfor gir biblioteket et endepunkt som standard /metrics i en Flask-applikasjon, som kan tjene som mål for Prometheus-bygger.

I dashbordeksemplet ovenfor kan du målrette Prometheus mot en Flask-applikasjon med standardinnstillinger med denne konfigurasjonen:

scrape_configs:
  - job_name: 'example'

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

Se fullstendig eksempel på GitHub-lagre. Dette forutsetter at Prometheus kan finne Flask-applikasjonsforekomstene dine på http://app:5000/metrics, der applikasjonens domenenavn potensielt kan løses til flere IP-adresser, for eksempel når den kjøres inn Kubernetes eller Docker sverm.

Hvis det ikke passer deg å eksponere metrikkendepunktet på denne måten, kanskje fordi du ikke vil tillate ekstern tilgang til det, kan du enkelt deaktivere det ved å bestå path=Ingen når du oppretter 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)

Da kan du bruke start_http_server(port)for å åpne dette endepunktet på en annen HTTP-port, 5099 i eksemplet ovenfor. Alternativt, hvis du er fornøyd med at endepunktet er i samme Flask-applikasjon, men du må endre banen fra /metrics, kan du enten sende en annen URI som baneparameter, eller bruke register_endpoint(..)for å installere det senere.

referanser

Hvis du bestemmer deg for å prøve det, kan du gjerne åpne et problem på GitHub eller legge igjen kommentarer, tilbakemeldinger og forslag!

Takk!

Kilde: www.habr.com

Legg til en kommentar