Monitering van Flask-mikrodienste met Prometheus

'n Paar reëls kode en jou toepassing genereer statistieke, sjoe!

Om te verstaan ​​hoe prometheus werk_fles_uitvoerder 'n minimale voorbeeld is genoeg:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Dit is al wat jy nodig het om te begin! Deur 'n invoer en 'n lyn vir inisialisering by te voeg PrometheusMetrics, sal jy metrieke kry versoek duur и versoek tellersvertoon by die eindpunt /metrieke die Flask-toepassing waarmee dit geregistreer is, plus enige verstekmaatstawwe wat jy van die basis af kry Prometheus kliënt biblioteek.

jy kan vind maklik om te gebruik voorbeeld in die GitHub-bewaarplek wat die instansie begin Prometheus и grafana saam met 'n demo-toepassing vir die generering van statistieke wat so iets sal lyk:

Monitering van Flask-mikrodienste met Prometheus

Jy sal ook 'n lys van aanwysers vind in README voorbeelde wat in die dashboard verskyn, saam met Prometheus-navrae wat die dashboards vul.

aanpassing

Die biblioteek het baie konfigurasie opsies, kyk gerus na README projekteer hul voorbeelde met 'n kort verduideliking.

Die basiese konfigurasie word hierbo getoon. Instansieer net PrometheusMetrics, kom ons noem dit statistieke, en gebruik dit dan om bykomende maatstawwe te definieer wat jy wil versamel deur funksies te versier:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Die tellers tel oproepe, en die res versamel maatstawwe gebaseer op die duur van daardie oproepe. Jy kan etikette vir elk van hierdie definieer, moontlik deur versoek- of reaksie-eienskappe te gebruik. Byvoorbeeld:

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 die voorbeeld hierbo, klik op die eindpunt /versameling/10002/item/76 sal die teller laat toeneem, bv. cnt_collection{versameling = "10002", status = "200"}, plus jy sal die verstek statistieke (vir elke eindpunt in hierdie voorbeeld) van die verstek biblioteek kry:

  • flask_http_request_duration_seconds - HTTP-versoekduur in sekondes vir alle Flesk-versoeke volgens metode, pad en status

  • flask_http_request_total - Totale aantal HTTP-versoeke volgens metodes en statusse

Daar is opsies om die dop van sekere eindpunte oor te slaan, bykomende verstekmaatstawwe te registreer of dié hierbo oor te slaan, of dieselfde pasgemaakte maatstaf op veelvuldige eindpunte toe te pas. Uitteken README projek om te sien wat beskikbaar 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}
    )
)

Die biblioteek het handige uitbreidings vir gewilde multiverwerkerbiblioteke soos uWSGI en Gunicorn. Jy kan ook klein voorbeelde van teikengebruiksgevalle vind, insluitend multiverwerkings.

Versameling van statistieke

Soos hierbo genoem, verskaf die verstekbiblioteek 'n eindpunt /metrieke in 'n Flask-toepassing, wat kan dien as 'n teiken vir samesteller Prometheus.

In die dashboard-voorbeeld hierbo kan jy jou Prometheus teiken op 'n Flask-toepassing met verstekinstellings soos hierdie:

scrape_configs:
  - job_name: 'example'

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

Sien volledige voorbeeld by GitHub-bewaarplekke. Dit veronderstel dat Prometheus jou Flask-toepassingsgevalle by kan vind http://app:5000/metrics, waar die toepassingsdomeinnaam moontlik na veelvuldige IP-adresse kan omskep, soos wanneer dit ingevoer word Kubernetes of Docker -swerm.

As die blootlegging van die metrieke eindpunt soos hierdie jou nie pas nie, miskien omdat jy nie eksterne toegang daartoe wil toelaat nie, kan jy dit maklik deaktiveer deur te slaag pad=Geen wanneer instansieer 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 kan jy gebruik begin_http_bediener (poort)om hierdie eindpunt op 'n ander HTTP-poort oop te maak, 5099 in die voorbeeld hierbo. Alternatiewelik, as jy tevrede is dat die eindpunt in dieselfde Flask-toepassing is, maar sy pad moet verander vanaf /metrieke, jy kan óf 'n ander URI as die padparameter deurgee óf gebruik register_eindpunt(..)om dit later te installeer.

verwysings

As jy besluit om dit te probeer, maak gerus 'n kwessie op GitHub oop of laat jou kommentaar, terugvoer en voorstelle!

Dankie!

Bron: will.com

Voeg 'n opmerking