Ukuqapha I-Flask Microservices nge-Prometheus

Imigqa embalwa yekhodi kanye nohlelo lwakho lokusebenza lukhiqiza amamethrikhi, wow!

Ukuze uqonde ukuthi i-prometheus_ isebenza kanjanii-flask_othumela ngaphandle isibonelo esincane sanele:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Yilokho kuphela okudingayo ukuze uqalise! Ngokungeza ukungenisa kanye nomugqa wokuqalisa I-PrometheusMetrics, uzothola amamethrikhi ubude besicelo ΠΈ izicelo zokubala, kuboniswe ekugcineni /amamethrikhi uhlelo lokusebenza lwe-Flask ebhaliswe ngalo, kanye nawo wonke amamethrikhi azenzakalelayo owathola kusisekelo Ilabhulali yeklayenti le-Prometheus.

ungathola kulula ukuyisebenzisa isibonelo endaweni yokugcina ye-GitHub eqhuba isibonelo Prometheus ΠΈ UGrafana kanye nohlelo lokusebenza lwedemo lokukhiqiza amamethrikhi azobukeka kanjena:

Ukuqapha I-Flask Microservices nge-Prometheus

Uzothola nohlu lwezinkomba ku README izibonelo ezivela kudeshibhodi, kanye nemibuzo ye-Prometheus egcwalisa amadeshibhodi.

Yenza ngokwezifiso

Ziningi izinketho zokumisa emtapweni wolwazi, bheka README izibonelo zephrojekthi yazo enencazelo emfushane.

Ukucushwa okuyisisekelo kukhonjisiwe ngenhla. Vele udale isibonelo I-PrometheusMetrics,asiyibize amamethrikhi, bese uyisebenzisela ukuchaza amamethrikhi engeziwe ofuna ukuwaqoqa ngokuhlobisa imisebenzi:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Izibali zibala amakholi, kanti ezinye ziqoqa amamethrikhi asuselwe kubude besikhathi salezo zingcingo. Ungachaza amalebula ngakunye kwalokhu, okungenzeka usebenzise izici zokucela noma zokuphendula. Ngokwesibonelo:

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

Esibonelweni esingenhla, ngokuchofoza iphuzu lokugcina /iqoqo/10002/item/76 izobangela ukuba ikhawunta ikhule, isibonelo cnt_collection{collection = "10002", status = "200"}, futhi uzothola amamethrikhi azenzakalelayo (ephoyinti lesiphetho ngalinye kulesi sibonelo) kusuka kulabhulali ezenzakalelayo:

  • flask_http_request_duration_seconds - Ubude besicelo se-HTTP ngemizuzwana yazo zonke izicelo ze-Flask ngendlela, indlela kanye nesimo

  • flask_http_request_total - Isamba senani lezicelo ze-HTTP ngezindlela nezimo

Kunezinketho zokweqa ukulandelelwa kwamaphoyinti athile okugcina, ungene kumamethrikhi azenzakalelayo engeziwe noma weqe lawo asohlwini olungenhla, noma usebenzise imethrikhi yangokwezifiso efanayo kumaphoyinti okugcina amaningi. Hlola README iphrojekthi ukuze ubone ukuthi yini etholakalayo.

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

Umtapo wolwazi unezandiso ezilula zemitapo yolwazi esebenza kaningi efana ne-uWSGI ne-Gunicorn. Ungathola futhi izibonelo ezincane zezimo zokusetshenziswa eziqondisiwe, okuhlanganisa ukucutshungulwa okuningi.

Iqoqo lamamethrikhi

Njengoba kushiwo ngenhla, umtapo wolwazi uhlinzeka ngesiphetho ngokuzenzakalelayo /amamethrikhi kuhlelo lokusebenza lwe-Flask, olungasebenza njengendawo okuhloswe ngayo Umakhi we-Prometheus.

Esibonelweni sedeshibhodi esingenhla, ungakhomba i-Prometheus yakho kuhlelo lokusebenza lwe-Flask enezilungiselelo ezizenzakalelayo ngalokhu kulungiselelwa:

scrape_configs:
  - job_name: 'example'

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

Bona isibonelo esigcwele kokuthi I-GitHub yokugcina. Lokhu kucabanga ukuthi u-Prometheus angathola izimo zohlelo lwakho lokusebenza lwe-Flask http://app:5000/metrics, lapho igama lesizinda sohlelo lokusebenza lingakwazi ukuxazulula amakheli amaningi e-IP, isibonelo uma lisebenza Kubernetes noma I-Docker Swarm.

Uma ukuveza indawo yokugcina yamamethrikhi ngale ndlela kungakufanelanga, mhlawumbe ngenxa yokuthi awufuni ukuvumela ukufinyelela kwangaphandle kukho, ungakwazi ukukukhubaza kalula ngokudlula. indlela=Akukho lapho udala isibonelo I-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)

Khona ungasebenzisa qala_http_iseva(imbobo)ukuze uvule lesi siphetho endaweni ehlukile ye-HTTP, 5099 kulesi sibonelo esingenhla. Ngaphandle kwalokho, uma ujabulile ngokuthi isiphetho sisohlelweni olufanayo lwe-Flask, kodwa udinga ukushintsha indlela yakho ukusuka ku- /amamethrikhi, ungadlula enye i-URI njengepharamitha yendlela, noma usebenzise rejista_iphoyinti lokugcina(..)ukuyifaka kamuva.

izithenjwa

Uma unquma ukuyizama, zizwe ukhululekile ukuvula udaba ku-GitHub noma ushiye imibono, impendulo, neziphakamiso zakho!

Siyabonga!

Source: www.habr.com

Engeza amazwana