Kufuatilia Huduma ndogo za Flask na Prometheus

Laini kadhaa za msimbo na programu yako hutengeneza vipimo, wow!

Ili kuelewa jinsi prometheus_ inavyofanya kazichupa_nje mfano mdogo unatosha:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Hiyo ndiyo yote unayohitaji ili kuanza! Kwa kuongeza uingizaji na mstari wa kuanzishwa PrometheusMetrics, utapata vipimo muda wa ombi ΠΈ ombi vihesabio, iliyoonyeshwa kwenye sehemu ya mwisho / vipimo programu ya Flask ambayo imesajiliwa nayo, pamoja na metriki zote chaguo-msingi unazopata kutoka msingi Maktaba ya mteja wa Prometheus.

unaweza kupata rahisi kutumia mfano kwenye hazina ya GitHub inayoendesha mfano Prometheus ΠΈ grafana pamoja na ombi la onyesho la kutengeneza metriki ambazo zitaonekana kama hii:

Kufuatilia Huduma ndogo za Flask na Prometheus

Utapata pia orodha ya viashiria ndani README mifano inayoonekana kwenye dashibodi, pamoja na hoja za Prometheus zinazojaza dashibodi.

marekebisho

Kuna chaguzi nyingi za usanidi kwenye maktaba, angalia README mifano ya mradi wao na maelezo mafupi.

Usanidi wa msingi umeonyeshwa hapo juu. Unda tu mfano PrometheusMetrics, tuite metrics, na kisha uitumie kufafanua vipimo vya ziada unavyotaka kukusanya kwa kupamba vipengele:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Vihesabu huhesabu simu, na vingine hukusanya vipimo kulingana na muda wa simu hizo. Unaweza kufafanua lebo kwa kila moja ya hizi, uwezekano wa kutumia sifa za ombi au majibu. Kwa mfano:

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

Katika mfano hapo juu, kubonyeza mwisho /mkusanyiko/10002/item/76 itasababisha kaunta kuongezeka, kwa mfano cnt_collection{collection = "10002", hali = "200"}, pamoja na utapata vipimo chaguo-msingi (kwa kila ncha katika mfano huu) kutoka kwa maktaba chaguo-msingi:

  • flask_http_request_duration_seconds - Muda wa ombi la HTTP kwa sekunde kwa maombi yote ya Flask kwa njia, njia na hali

  • flask_http_request_total - Jumla ya idadi ya maombi ya HTTP kulingana na mbinu na hali

Kuna chaguo za kuruka ufuatiliaji wa ncha mahususi, kuweka vipimo vya ziada chaguo-msingi au kuruka zilizoorodheshwa hapo juu, au kutumia kipimo maalum sawa kwenye ncha nyingi. Angalia README mradi kuona kile kinachopatikana.

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

Maktaba ina viendelezi vinavyofaa kwa maktaba maarufu za usindikaji nyingi kama vile uWSGI na Gunicorn. Unaweza pia kupata mifano midogo ya kesi za utumiaji zilizolengwa, pamoja na usindikaji mwingi.

Mkusanyiko wa vipimo

Kama ilivyoelezwa hapo juu, maktaba hutoa mwisho kwa chaguo-msingi / vipimo katika programu tumizi ya Flask, ambayo inaweza kutumika kama lengo la Mjenzi wa Prometheus.

Katika mfano wa dashibodi hapo juu, unaweza kulenga Prometheus yako kwa programu tumizi ya Flask yenye mipangilio chaguomsingi na usanidi huu:

scrape_configs:
  - job_name: 'example'

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

Tazama mfano kamili kwenye Hifadhi za GitHub. Hii inadhania kuwa Prometheus anaweza kupata matukio ya programu yako ya Flask http://app:5000/metrics, ambapo jina la kikoa cha programu linaweza kutatua kwa anwani nyingi za IP, kwa mfano wakati wa kuingia Mabernet au Pumba la Docker.

Ikiwa kufichua sehemu ya mwisho ya vipimo kwa njia hii hakukufai, labda kwa sababu hutaki kuruhusu ufikiaji wa nje kwa hiyo, unaweza kuizima kwa urahisi kwa kupita. njia=Hakuna wakati wa kuunda mfano 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)

Kisha unaweza kutumia anza_http_server(bandari)kufungua mwisho huu kwenye bandari tofauti ya HTTP, 5099 katika mfano hapo juu. Vinginevyo, ikiwa unafurahiya na mwisho kuwa kwenye programu tumizi sawa ya Flask, lakini unahitaji kubadilisha njia yake kutoka / vipimo, unaweza kupitisha URI nyingine kama kigezo cha njia, au utumie rejista_mwisho(..)ili kusakinisha baadaye.

marejeo

Ukiamua kujaribu, jisikie huru kufungua suala kwenye GitHub au kuacha maoni yako, maoni na mapendekezo!

Asante!

Chanzo: mapenzi.com

Kuongeza maoni