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:

Overvågning af Flask-mikrotjenester med Prometheus

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:

scrape_configs:
  - job_name: 'example'

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

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.

RЎSЃS <P "RєRё

Hvis du beslutter dig for at prøve det, er du velkommen til at åbne et problem på GitHub eller efterlade dine kommentarer, feedback og forslag!

Tak!

Kilde: www.habr.com

Tilføj en kommentar