Overvågning af Flask-mikrotjenester med Prometheus

Et par linjer kode, og din applikation genererer metrics, wow!

For at forstå hvordan prometheus_ fungerer,flask_,er et minimalt eksempel tilstrækkeligt:

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 der skal til for at komme i gang! Ved at tilføje importen og en linje til initialisering af PrometheusMetrics, vil du få metrics for forespørgselsvarigheder, og forespørgsels tællere,, som vises på den endelige destination /metrics af Flask-applikationen, hvor den er registreret, samt alle standardmetrikker, du får fra den grundlæggende Prometheus-klientbibliotek..

Du kan finde et brugervenligt eksempel i GitHub-repositoriet, der kører en instans Prometheus og Grafana sammen med en demoapplikation til at generere metrics, som ser nogenlunde sådan ud:

Overvågning af Flask-mikrotjenester med Prometheus

Du vil også finde en liste over metrikker i README eksemplet, som vises på kontrolpanelet, sammen med Prometheus-forespørgsler, der fylder panelet.

Indstillinger

Biblioteket har mange konfigurationsindstillinger, se på README projektets eksempler med en kort forklaring.

Den grundlæggende konfiguration vises øverst. Opret ganske enkelt en instans PrometheusMetrics, lad os kalde den metrics, og brug den derefter til at definere yderligere metrikker, som du ønsker at indsamle, ved at dekorere funktioner:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Tællere tæller kald, mens de andre indsamler metrics afhængigt af varigheden af disse kald. Du kan definere labels for hver af dem, potentielt ved at bruge egenskaber fra anmodningen eller svaret. 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', 'Antal kald pr. samling', 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 det ovenstående eksempel vil et klik på slutpunktet /collection/10002/item/76 øge tælleren, for eksempel cnt_collection{collection = "10002", status = "200"}, plus du vil få standardmetrics (for hver slutpunkt i dette eksempel) fra standardbiblioteket:

  • flask_http_request_duration_seconds — Varighed af HTTP-anmodninger i sekunder for alle Flask-anmodninger efter metode, sti og status.

  • flask_http_request_total — Det samlede antal HTTP-anmodninger efter metoder og statuser.

Der er muligheder for at springe visse slutpunkter over for sporing, registrere yderligere standard metrikker eller springe dem, der er nævnt ovenfor over, eller anvende den samme brugerdefinerede metrik på flere slutpunkter. Læs mere om README projektet for at finde ud af, hvad der er tilgængeligt.

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    pass  # anmodninger sporet som standard

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # standard metrikker indsamles ikke

# brugerdefineret metrik, der skal anvendes på flere slutpunkter
common_counter = metrics.counter(
    'by_endpoint_counter', 'Antal anmodninger på slutpunkter',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # sporet af den brugerdefinerede og de standard metrikker

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # også sporet af den brugerdefinerede og de standard metrikker

# registrer yderligere standard metrikker
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Antal anmodninger efter anmodningsstier',
        labels={'path': lambda: request.path}
    )
)

Biblioteket har praktiske udvidelser til populære multiprocessbiblioteker som uWSGI og Gunicorn. Du kan også finde små eksempler på målrettede anvendelser, herunder multiprocess.

Indsamling af metrikker

Som nævnt tidligere giver biblioteket som standard et slutpunkt /metrics i Flask-applikationen, som kan fungere som mål for Prometheus-indsamleren.

I det ovenfor nævnte dashboard-eksempel kan du sigte din Prometheus mod Flask-applikationen med standardindstillingerne ved hjælp af følgende konfiguration:

scrape_configs:
  - job_name: 'example'

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

Se det fulde eksempel i GitHub-repositoriet. Dette antager, at Prometheus kan finde dine instanser af Flask-applikationen på http://app:5000/metrics, hvor domænenavnet for applikationen potentielt kan opløses til flere IP-adresser, for eksempel når der arbejdes i Kubernetes eller Docker Swarm.

Hvis en sådan eksponering af metrikslutpunktet ikke passer til dig, muligvis fordi du ikke ønsker at tillade ekstern adgang til det, kan du nemt deaktivere det ved at videregive path=None under oprettelsen af instansen 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)

Derefter kan du bruge start_http_server(port), for at åbne dette slutpunkt på en anden HTTP-port, 5099 i det ovenfor nævnte eksempel. Alternativt, hvis du er tilfreds med, at slutpunktet er i den samme Flask-applikation, men du har brug for at ændre dets sti fra /metrics, du kan enten videresende en anden URI som stinavnparameter, eller bruge register_endpoint(..), for at indstille dette senere.

Links

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

Tak!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster