Flask-microservices bewaken met Prometheus

Een paar regels code en uw applicatie genereert statistieken, wow!

Om te begrijpen hoe Prometheus werkt_kolf_exporteur 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'

Dat is alles wat u nodig hebt om te beginnen! Import- en initialisatieregel toevoegen PrometheusMetrics, u ontvangt statistieken queryduur и verzoektellers, weergegeven op het eindpunt /metriek Flask-applicatie waarmee het is geregistreerd, evenals alle standaardmetrieken die u van de basis krijgt Prometheus-clientbibliotheek.

u kunt vinden eenvoudig te gebruiken voorbeeld in de GitHub-repository die het exemplaar uitvoert Prometheus и grafana samen met een demo-applicatie voor het genereren van statistieken die er ongeveer zo uitziet:

Flask-microservices bewaken met Prometheus

Een lijst met indicatoren vindt u ook in README voorbeelden die in het dashboard worden weergegeven, samen met de Prometheus-query's die in de panelen worden weergegeven.

afstelling

Er zijn veel configuratieopties in de bibliotheek, bekijk deze eens README projecten, hun voorbeelden met een korte uitleg.

Hierboven ziet u de basisconfiguratie. Maak gewoon een instantie PrometheusMetrics, laten we het zo noemen metrieken gebruik het vervolgens om aanvullende statistieken te definiëren die u wilt verzamelen door de functies te decoreren:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Tellers tellen het aantal gesprekken, terwijl andere tellers statistieken verzamelen op basis van de duur van de gesprekken. U kunt voor elk van deze labels definiëren, eventueel met behulp van eigenschappen van de aanvraag of het antwoord. Bijvoorbeeld:

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

In het bovenstaande voorbeeld klikt u op het eindpunt /collectie/10002/item/76 zal ervoor zorgen dat de teller stijgt, bijvoorbeeld cnt_collection{collectie = "10002", status = "200"}, plus u ontvangt standaardmetrische gegevens (voor elk eindpunt in dit voorbeeld) uit de standaardbibliotheek:

  • flask_http_request_duration_seconds — HTTP-verzoekduur in seconden voor alle Flask-verzoeken per methode, pad en status

  • flask_http_request_total — Totaal aantal HTTP-verzoeken per methode en status

Er zijn opties om het volgen van bepaalde eindpunten over te slaan, extra standaardstatistieken te loggen, de hierboven vermelde statistieken over te slaan of dezelfde aangepaste statistiek op meerdere eindpunten toe te passen. Uitchecken README project om te zien wat er beschikbaar is.

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}
    )
)

De bibliotheek biedt handige uitbreidingen voor populaire multiprocessingbibliotheken zoals uWSGI en Gunicorn. U kunt ook kleine voorbeelden van doelgerichte use cases vinden, waaronder multiprocessing.

Metriekverzameling

Zoals hierboven vermeld, biedt de bibliotheek standaard een eindpunt /metriek in een Flask-toepassing die kan dienen als doelwit voor Prometheus-verzamelaar.

In het bovenstaande dashboardvoorbeeld kunt u uw Prometheus richten op een Flask-app met standaardinstellingen met deze configuratie:

scrape_configs:
  - job_name: 'example'

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

Zie het volledige voorbeeld op GitHub-opslagplaatsen. Hierbij wordt ervan uitgegaan dat Prometheus uw Flask-toepassingsinstanties kan vinden op http://app:5000/metrics, waarbij de domeinnaam van de toepassing mogelijk kan worden omgezet naar meerdere IP-adressen, zoals bij het uitvoeren van Kubernetes of Docker Zwerm.

Als het op deze manier blootstellen van het metrische eindpunt geen optie voor u is, misschien omdat u geen externe toegang tot het eindpunt wilt toestaan, kunt u het eenvoudig uitschakelen door pad=Geen 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)

Dan kun je gebruiken start_http_server(poort)om dit eindpunt op een andere HTTP-poort te openen, 5099 in het bovenstaande voorbeeld. Als alternatief, als u tevreden bent met het feit dat het eindpunt zich in dezelfde Flask-app bevindt, maar het pad ervan moet wijzigen, /metriekU kunt een andere URI als padparameter doorgeven of gebruiken register_eindpunt(..), om het later te installeren.

referenties

Als je het wilt proberen, kun je een probleem op GitHub openen of je opmerkingen, feedback en suggesties achterlaten!

Dank je wel!

Bron: www.habr.com