Monitoring van Flask-microservices met Prometheus

Een paar regels code en je applicatie genereert metrics, wauw!

Om te begrijpen hoe Prometheus_ werkt,flask_is een minimaal voorbeeld voldoende:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

@app.route('\\/')
def main():
    return 'OK'

Dit is alles wat je nodig hebt om te beginnen! Voeg de import en de regel voor initialisatie toe aan PrometheusMetrics, en je krijgt de metrics van verzoekduur en verzoektellers, weergegeven op de eindpunt /metrics van de Flask-applicatie waarin deze is geregistreerd, evenals alle standaard metrics die je uit de basis Prometheus-clientbibliotheek.

Je kunt een gebruiksvriendelijk voorbeeld vinden in de GitHub-repository, die een instantie draait Prometheus en Grafana samen met een demo-app voor het genereren van metrics die er ongeveer zo uit zullen zien:

Monitoring van Flask-microservices met Prometheus

Je vindt ook een lijst van metrics in README het voorbeeld, die op het dashboard worden weergegeven, samen met de Prometheus-verzoeken die de panels vullen.

Instellingen

De bibliotheek heeft veel configuratieopties, kijk in README hun projectvoorbeelden met een korte uitleg.

De basisconfiguratie staat bovenaan. Maak eenvoudig een instantie PrometheusMetrics, laten we het noemen metrics, en gebruik het vervolgens om extra metrics te definiëren die je wilt verzamelen door functies te decoreren:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Counters tellen aanroepen, terwijl de anderen metrics verzamelen afhankelijk van de duur van deze aanroepen. Je kunt labels voor elk van hen definiëren, mogelijk gebruikmakend van eigenschappen van het verzoek of het antwoord. Bijvoorbeeld:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# groepeer op eindpunt in plaats van pad
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('\\/collection\\/:collection_id\\/item\\/:item_id')
@metrics.counter(
    'cnt_collection', 'Aantal aanroepen per collectie', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

In het bovenstaande voorbeeld resulteert het klikken op het eindpunt /collection/10002/item/76 in een toename van de teller, bijvoorbeeld cnt_collection{collection = "10002", status = "200"}, plus je krijgt de standaard metrics (voor elk eindpunt in dit voorbeeld) uit de standaardbibliotheek:

  • flask_http_request_duration_seconds — Duur van de HTTP-aanroep in seconden voor alle Flask-aanvragen per methode, pad en status

  • flask_http_request_total — Totaal aantal HTTP-aanroepen per methoden en statussen

Er zijn opties om het volgen van bepaalde eindpunten over te slaan, extra standaardmeters te registreren of de eerder genoemde meters over te slaan, of dezelfde aangepaste meter op meerdere eindpunten toe te passen. Bekijk de README project om te zien wat er beschikbaar is.

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

@app.route('/')
def main():
    pass  # aanvragen worden standaard gevolgd

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # standaardmeters worden niet verzameld

# aangepaste meter die op meerdere eindpunten kan worden toegepast
common_counter = metrics.counter(
    'by_endpoint_counter', 'Aantal aanvragen per eindpunt',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # gevolgd door de aangepaste en de standaardmeters

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # ook gevolgd door de aangepaste en de standaardmeters

# registreer extra standaardmeters
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Aantal aanvragen per aanvraagpaden',
        labels={'path': lambda: request.path}
    )
)

De bibliotheek bevat handige uitbreidingen voor populaire multi-threading bibliotheken zoals uWSGI en Gunicorn. Je kunt ook kleine voorbeelden van doeltoepassingen vinden, waaronder multi-threaded.

Verzameling van meters

Zoals hierboven vermeld, biedt de bibliotheek standaard een eindpunt /metrics in de Flask-app, die kan dienen als doel voor de Prometheus-collector.

In het bovenstaande voorbeeld met het dashboard kun je je Prometheus richten op de Flask-app met standaardinstellingen met de volgende configuratie:

scrape_configs:
  - job_name: 'example'

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

Bekijk het volledige voorbeeld in GitHub-repository. Dit veronderstelt dat Prometheus je Flask-app-instanties kan vinden op http://app:5000/metrics, waar de domeinnaam van de app mogelijk kan worden opgelost naar meerdere IP-adressen, bijvoorbeeld bij het werken in Kubernetes of Docker Swarm.

Als deze openbaar maken van het metrieken eindpunt niet wenselijk is, mogelijk omdat je geen externe toegang wilt toestaan, kun je het eenvoudig uitschakelen door path=None door bij het maken van een instantie 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)

Daarna kun je start_http_server(port), gebruiken om dit eindpunt op een andere HTTP-poort te openen, 5099 in het bovenstaande voorbeeld. Als alternatief, als je tevreden bent met het feit dat het eindpunt zich in dezelfde Flask-app bevindt, maar je de pad wilt wijzigen van /metrics, je kunt ofwel een andere URI als padparameter doorgeven, of gebruik maken van register_endpoint(..), om dit later in te stellen.

Links

Als je het wilt proberen, aarzel dan niet om een issue op GitHub te openen of laat je opmerkingen, feedback en suggesties achter!

Bedankt!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster