Monitoring Flask microservices mei Prometheus

In pear rigels koade en jo applikaasje genereart metriken, wow!

Om te begripen hoe't prometheus_ wurketflesse_eksporteur in minimaal foarbyld is genôch:

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 jo nedich hawwe om te begjinnen! Troch it tafoegjen fan in ymport en in rigel foar inisjalisaasje PrometheusMetrics, krije jo metriken fersyk doer и fersyk counters, werjûn op it einpunt /metrics de Flask-applikaasje wêrmei't it is registrearre, lykas alle standertmetriken dy't jo krije fan 'e basis Prometheus client bibleteek.

Do kinst fine maklik te brûken foarbyld yn it GitHub-repository dat it eksimplaar útfiert Prometheus и grafana tegearre mei in demo-applikaasje om metriken te generearjen dy't der sa útsjen sille:

Monitoring Flask microservices mei Prometheus

Jo sille ek in list fan yndikatoaren fine yn README foarbylden dy't ferskine yn it dashboard, tegearre mei Prometheus-fragen dy't de dashboards befolke.

oanpassing

Der binne in protte konfiguraasje opsjes yn de bibleteek, sjoch README projekt foarbylden fan harren mei in koarte útlis.

De basiskonfiguraasje wurdt hjirboppe werjûn. Meitsje gewoan in eksimplaar PrometheusMetrics, litte wy it neame metriken, en brûk it dan om de ekstra metriken te definiearjen dy't jo wolle sammelje troch de funksjes te dekorearjen:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Tellers telle oproppen, en oaren sammelje metriken basearre op de doer fan dy oproppen. Jo kinne labels foar elk fan dizze definiearje, mooglik mei help fan fersyk- of antwurdeigenskippen. Bygelyks:

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

Klikje yn it boppesteande foarbyld op it einpunt /kolleksje/10002/item/76 sil bygelyks de teller ferheegje cnt_collection{kolleksje = "10002", status = "200"}, plus jo krije de standertmetriken (foar elk einpunt yn dit foarbyld) fan 'e standertbibleteek:

  • flask_http_request_duration_seconds - HTTP-oanfraachdoer yn sekonden foar alle Flask-oanfragen per metoade, paad en status

  • flask_http_request_total - Totaal oantal HTTP-oanfragen per metoade en status

D'r binne opsjes om it folgjen fan spesifike einpunten oer te slaan, oanfoljende standertmetriken oan te loggen of de hjirboppe neamde oer te slaan, of deselde oanpaste metrik oan te passen op meardere einpunten. Betelje README projekt om te sjen wat der beskikber 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 bibleteek hat handige útwreidingen foar populêre multiprocessing bibleteken lykas uWSGI en Gunicorn. Jo kinne ek lytse foarbylden fine fan doelgerichte gebrûksgefallen, ynklusyf multiprocessing.

Metrics kolleksje

Lykas hjirboppe neamd, leveret de bibleteek standert in einpunt /metrics yn in Flask applikaasje, dat kin tsjinje as doel foar Prometheus bouwer.

Yn it dashboard-foarbyld hjirboppe kinne jo jo Prometheus rjochtsje op in Flask-applikaasje mei standertynstellingen mei dizze konfiguraasje:

scrape_configs:
  - job_name: 'example'

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

Sjoch folsleine foarbyld by GitHub repositories. Dit giet derfan út dat Prometheus kin fine jo Flask applikaasje eksimplaren op http://app:5000/metrics, wêr't de domeinnamme fan 'e applikaasje mooglik kin oplosse nei meardere IP-adressen, bygelyks by it rinnen Kubernetes of Docker swarm.

As it op dizze manier bleatstelle fan it metrike einpunt net by jo past, miskien om't jo gjin eksterne tagong ta wolle tastean, kinne jo it maklik útskeakelje troch troch te jaan path=Gjin by it meitsjen fan in eksimplaar 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 kinne jo brûke start_http_server (poarte)om dit einpunt op in oare HTTP-poarte te iepenjen, 5099 yn it boppesteande foarbyld. As alternatyf, as jo bliid binne mei it einpunt dat yn deselde Flask-applikaasje is, mar jo moatte it paad feroarje fan /metrics, Jo kinne in oare URI trochjaan as de paadparameter, of brûke register_endpoint(..)om it letter te ynstallearjen.

referinsjes

As jo ​​​​beslute om it te besykjen, fiel jo frij om in probleem op GitHub te iepenjen of jo opmerkings, feedback en suggestjes efter te litten!

Tankewol!

Boarne: www.habr.com

Add a comment