Flask-microservices monitoren met Prometheus

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

Om te begrijpen hoe prometheus_ werktfles_exporteur een minimaal voorbeeld is 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 heeft om aan de slag te gaan! Door een import en een regel voor initialisatie toe te voegen PrometheusMetrics, krijgt u statistieken duur van aanvraag и tellers aanvragen, weergegeven op het eindpunt /statistieken de Flask-applicatie waarmee het is geregistreerd, evenals alle standaardstatistieken die u van de basis krijgt Prometheus-clientbibliotheek.

u kunt vinden makkelijk te gebruiken voorbeeld in de GitHub-repository waarin de instantie wordt uitgevoerd Prometheus и grafana samen met een demo-applicatie om statistieken te genereren die er ongeveer zo uit zullen zien:

Flask-microservices monitoren met Prometheus

Een lijst met indicatoren vindt u ook in README voorbeelden die in het dashboard verschijnen, samen met Prometheus-query's die de dashboards vullen.

afstelling

Er zijn veel configuratie-opties in de bibliotheek, kijk naar README projectvoorbeelden ervan met een korte uitleg.

De basisconfiguratie is hierboven weergegeven. Maak gewoon een exemplaar PrometheusMetrics, laten we het noemen metrieken gebruik het vervolgens om de aanvullende statistieken te definiëren die u wilt verzamelen door de functies te decoreren:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Tellers tellen oproepen en andere verzamelen statistieken op basis van de duur van die oproepen. U kunt voor elk hiervan labels definiëren, mogelijk met behulp van aanvraag- of antwoordeigenschappen. 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 zorgt er bijvoorbeeld voor dat de teller wordt verhoogd cnt_collection{collectie = "10002", status = "200"}, plus u krijgt de standaardstatistieken (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 specifieke eindpunten over te slaan, aanvullende standaardstatistieken te registreren of de hierboven genoemde 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 heeft handige uitbreidingen voor populaire multiprocessing-bibliotheken zoals uWSGI en Gunicorn. U kunt ook kleine voorbeelden vinden van gerichte gebruiksscenario's, waaronder multiprocessing.

Verzameling van statistieken

Zoals hierboven vermeld, biedt de bibliotheek standaard een eindpunt /statistieken in een Flask-applicatie, die als doelwit kan dienen Prometheus-bouwer.

In het dashboardvoorbeeld hierboven kunt u uw Prometheus richten op een Flask-applicatie 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 http://app:5000/metrics, waarbij de applicatiedomeinnaam mogelijk kan worden omgezet in meerdere IP-adressen, bijvoorbeeld bij het uitvoeren ervan Kubernetes of Docker Zwerm.

Als het op deze manier blootleggen van het metrische eindpunt niet bij u past, misschien omdat u er geen externe toegang toe wilt toestaan, kunt u dit eenvoudig uitschakelen door pad=Geen bij het maken van een exemplaar 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 kunt u gebruik maken van 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-toepassing bevindt, maar u het pad ervan moet wijzigen /statistieken, kunt u een andere URI als padparameter doorgeven, of gebruiken register_eindpunt(..)om het later te installeren.

referenties

Als je besluit het eens te proberen, open dan gerust een probleem op GitHub of laat je opmerkingen, feedback en suggesties achter!

Dank je wel!

Bron: www.habr.com

Voeg een reactie