Siveyans Flask Microservices ak Prometheus

Yon koup nan liy kòd ak aplikasyon w lan jenere mezi, wow!

Pou w ka konprann kijan prometheus_ travayflask_ekspòtatè yon egzanp minim ase:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Se tout sa ou bezwen pou kòmanse! Lè w ajoute yon enpòte ak yon liy pou inisyalizasyon PrometheusMetrics, ou pral jwenn mezi demann dire и kontè demann, parèt nan pwen final la /metrik aplikasyon an Flask li anrejistre ak, osi byen ke tout mezi default ou jwenn nan baz la Bibliyotèk kliyan Prometheus.

ou ka jwenn egzanp fasil pou itilize nan depo GitHub ki kouri egzanp lan Prometheus и grafana ansanm ak yon aplikasyon Demo pou jenere mezi ki pral gade yon bagay tankou sa a:

Siveyans Flask Microservices ak Prometheus

Ou pral jwenn tou yon lis endikatè nan README egzanp ki parèt nan tablodbò a, ansanm ak demann Prometheus ki peple tablodbò yo.

ajisteman

Gen anpil opsyon konfigirasyon nan bibliyotèk la, gade nan README egzanp pwojè yo ak yon eksplikasyon tou kout.

Konfigirasyon debaz la montre pi wo a. Jis kreye yon egzanp PrometheusMetrics, ann rele li mesures, epi sèvi ak li pou defini mezi adisyonèl ou vle kolekte pa dekore fonksyon yo:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Counters konte apèl yo, ak lòt moun kolekte mezi ki baze sou dire apèl sa yo. Ou ka defini etikèt pou chak nan sa yo, potansyèlman itilize pwopriyete demann oswa repons. Pa egzanp:

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

Nan egzanp ki anwo a, klike sou pwen final la /collection/10002/item/76 pral lakòz kontwa a ogmante, pou egzanp cnt_collection{koleksyon = "10002", estati = "200"}, Anplis de sa, w ap jwenn mezi default yo (pou chak pwen final nan egzanp sa a) nan bibliyotèk default la:

  • flask_http_request_duration_seconds — Dire demann HTTP an segonn pou tout demann Flask pa metòd, chemen ak estati

  • flask_http_request_total — Kantite total demann HTTP pa metòd ak estati

Gen opsyon pou sote swiv pwen final espesifik yo, konekte lòt mezi default oswa sote sa yo ki nan lis pi wo a, oswa aplike menm metrik koutim nan plizyè pwen final. Tcheke README pwojè pou wè sa ki disponib.

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

Bibliyotèk la gen ekstansyon pratik pou bibliyotèk popilè miltipwosesis tankou uWSGI ak Gunicorn. Ou ka jwenn tou ti egzanp ka itilizasyon vize, ki gen ladan multiprocessing.

Koleksyon metrik

Kòm mansyone pi wo a, bibliyotèk la bay yon pwen final pa default /metrik nan yon aplikasyon Flacon, ki ka sèvi kòm yon sib pou mason Prometheus.

Nan egzanp tablodbò ki anwo a, ou ta ka vize Prometheus ou a nan yon aplikasyon Flask ak paramèt default ak konfigirasyon sa a:

scrape_configs:
  - job_name: 'example'

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

Gade tout egzanp nan Repozitwa GitHub. Sa a sipoze ke Prometheus ka jwenn ka aplikasyon Flask ou sou http://app:5000/metrics, kote non domèn aplikasyon an kapab potansyèlman rezoud nan plizyè adrès IP, pou egzanp lè w ap kouri nan Kubernetes oswa Docker swarm.

Si ekspoze pwen final mezi yo nan fason sa a pa apwopriye pou ou, petèt paske ou pa vle pèmèt aksè ekstèn nan li, ou ka fasilman enfim li lè w pase. chemen = Okenn lè w ap kreye yon egzanp 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)

Lè sa a, ou ka itilize start_http_server(pò)pou louvri pwen final sa a sou yon pò HTTP diferan, 5099 nan egzanp ki anwo a. Altènativman, si ou kontan ak pwen final la nan menm aplikasyon Flask la, men ou bezwen chanje chemen li soti nan /metrik, ou ka swa pase yon lòt URI kòm paramèt chemen an, oswa itilize register_endpoint(..)enstale li pita.

Referans

Si ou deside eseye li, santi yo lib yo louvri yon pwoblèm sou GitHub oswa kite kòmantè ou, fidbak, ak sijesyon!

Mèsi!

Sous: www.habr.com

Add nouvo kòmantè