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:
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:
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.