Monitoraġġ tal-Mikroservizzi tal-Flask ma' Prometheus

Koppja ta' linji ta' kodiċi u l-applikazzjoni tiegħek tiġġenera metriċi, naqra!

Sabiex tifhem kif jaħdem prometheus_flask_esportatur eżempju minimu huwa biżżejjed:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Dak kollu li għandek bżonn biex tibda! Billi żżid importazzjoni u linja għall-inizjalizzazzjoni PrometheusMetrics, inti se tikseb metriċi it-tul tat-talba и counters talba, murija fl-aħħar /metriċi l-applikazzjoni tal-Flask li hija rreġistrata magħha, kif ukoll il-metriċi default kollha li tikseb mill-bażi Librerija tal-klijenti Prometheus.

tista 'ssib eżempju faċli biex tużah fir-repożitorju GitHub li jmexxi l-istanza Prometheus и grafana flimkien ma' applikazzjoni demo biex tiġġenera metriċi li jidhru xi ħaġa bħal din:

Monitoraġġ tal-Mikroservizzi tal-Flask ma' Prometheus

Issib ukoll lista ta’ indikaturi fi README eżempji li jidhru fid-dashboard, flimkien ma’ mistoqsijiet tal-Prometheus li jimlew id-dashboards.

aġġustament

Hemm ħafna għażliet ta 'konfigurazzjoni fil-librerija, ħares lejn README eżempji tal-proġett tagħhom bi spjegazzjoni qasira.

Il-konfigurazzjoni bażika tidher hawn fuq. Oħloq biss eżempju PrometheusMetrics, ejja nsejħulha metriċi, u mbagħad użaha biex tiddefinixxi l-metriċi addizzjonali li trid tiġbor billi żżejjen il-funzjonijiet:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Il-counters jgħoddu s-sejħiet, u oħrajn jiġbru metriċi bbażati fuq it-tul ta 'dawk is-sejħiet. Tista' tiddefinixxi tikketti għal kull waħda minn dawn, potenzjalment billi tuża proprjetajiet ta' talba jew rispons. Pereżempju:

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

Fl-eżempju ta 'hawn fuq, tikklikkja fuq l-endpoint /collection/10002/item/76 se jikkawża li l-counter jiżdied, pereżempju cnt_collection{ġbir = "10002", status = "200"}, kif ukoll int se tikseb il-metriċi default (għal kull endpoint f'dan l-eżempju) mil-librerija default:

  • flask_http_request_duration_seconds — It-tul tat-talba HTTP f'sekondi għat-talbiet kollha tal-Flask skont il-metodu, il-mogħdija u l-istatus

  • flask_http_request_total — Numru totali ta’ talbiet HTTP skont il-metodi u l-istatus

Hemm għażliet biex taqbeż it-traċċar ta' endpoints speċifiċi, tilloggja metriċi awtomatiċi addizzjonali jew taqbeż dawk elenkati hawn fuq, jew tapplika l-istess metrika personalizzata għal endpoints multipli. Iċċekkja README proġett biex tara x'hemm disponibbli.

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

Il-librerija għandha estensjonijiet konvenjenti għal libreriji multiproċessar popolari bħal uWSGI u Gunicorn. Tista' ssib ukoll eżempji żgħar ta' każijiet ta' użu mmirati, inkluż multiproċessar.

Ġbir tal-metriċi

Kif imsemmi hawn fuq, il-librerija tipprovdi endpoint awtomatikament /metriċi f'applikazzjoni Flask, li tista' sservi bħala mira għal bennej Prometheus.

Fl-eżempju tad-dashboard ta’ hawn fuq, tista’ timmira l-Prometheus tiegħek lejn applikazzjoni ta’ Flask b’settings default b’din il-konfigurazzjoni:

scrape_configs:
  - job_name: 'example'

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

Ara eżempju sħiħ fuq Repożitorji GitHub. Dan jassumi li Prometheus jista' jsib l-istanzi tal-applikazzjoni tal-Flask tiegħek fuq http://app:5000/metrics, fejn l-isem tad-dominju tal-applikazzjoni jista' potenzjalment jirrisolvi għal indirizzi IP multipli, pereżempju meta taħdem Kubernetes jew Docker swarm.

Jekk tesponi l-endpoint tal-metriċi b'dan il-mod ma taqbilx għalik, forsi għax ma tridx tħalli aċċess estern għalih, tista' faċilment tiddiżattivah billi tgħaddi mogħdija=Xejn meta toħloq istanza 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)

Imbagħad tista 'tuża start_http_server(port)biex tiftaħ dan l-endpoint fuq port HTTP differenti, 5099 fl-eżempju ta’ hawn fuq. Inkella, jekk inti kuntent bl-endpoint ikun fl-istess applikazzjoni tal-Flask, imma trid tibdel it-triq tiegħu minn /metriċi, tista' jew tgħaddi URI ieħor bħala l-parametru tal-passaġġ, jew tuża register_endpoint(..)biex tinstallah aktar tard.

referenzi

Jekk tiddeċiedi li tipprovaha, tħossok liberu li tiftaħ kwistjoni fuq GitHub jew tħalli l-kummenti, ir-rispons u s-suġġerimenti tiegħek!

Grazzi!

Sors: www.habr.com

Żid kumment