Ka nānā ʻana i nā Flask Microservices me Prometheus

Hoʻopuka kekahi mau laina code a me kāu noi i nā metric, wow!

I mea e maopopo ai ka hana ana o prometheus_ipu_ʻO ka mea hoʻopuka i kahi laʻana liʻiliʻi ua lawa:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

ʻO ia wale nō kāu pono e hoʻomaka ai! Ma ka hoʻohui ʻana i kahi hoʻokomo a me kahi laina no ka hoʻomaka ʻana PrometheusMetrics, e loaʻa iā ʻoe nā metric noi lōʻihi и noi helu helu, hōʻike ʻia ma ka hope /meka ka palapala Flask i hoʻopaʻa inoa ʻia me ia, a me nā metric paʻamau a pau āu e loaʻa ai mai ka waihona hale waihona mea kūʻai Prometheus.

hiki iā ʻoe ke loaʻa laʻana maʻalahi e hoʻohana i loko o ka waihona waihona GitHub e holo ana i ka hiʻohiʻona IHILA и grafana me kahi noi demo e hana i nā metric e like me kēia:

Ka nānā ʻana i nā Flask Microservices me Prometheus

E ʻike pū ʻoe i kahi papa inoa o nā hōʻailona ma README nā laʻana i ʻike ʻia ma ka dashboard, me nā nīnau Prometheus e hoʻopiha ana i nā dashboards.

hoʻoponopono

Nui nā koho hoʻonohonoho i ka waihona, e nānā README nā laʻana papahana o lākou me ka wehewehe pōkole.

Hōʻike ʻia ka hoʻonohonoho kumu ma luna. E hana wale i kahi laʻana PrometheusMetrics, e kāhea kākou nā kaulike, a laila e hoʻohana iā ia e wehewehe i nā metric hou āu e makemake ai e hōʻiliʻili ma ka hoʻonani ʻana i nā hana:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Helu nā mea helu kelepona, a ʻohi nā mea ʻē aʻe i nā ana ma muli o ka lōʻihi o ia mau kelepona. Hiki iā ʻoe ke wehewehe i nā lepili no kēlā me kēia, me ka hoʻohana ʻana i nā waiwai noi a pane paha. ʻo kahi laʻana:

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

Ma ka laʻana i luna, e kaomi i ka hopena /collection/10002/item/76 e hoʻonui i ka counter, no ka laʻana cnt_collection{collection = "10002", kūlana = "200"}, a e loaʻa iā ʻoe nā metric paʻamau (no kēlā me kēia hopena i kēia hiʻohiʻona) mai ka waihona waihona:

  • flask_http_request_duration_seconds - Ka lōʻihi o ka noi HTTP i kekona no nā noi Flask āpau ma ke ʻano, ke ala a me ke kūlana

  • flask_http_request_total - Ka huina o nā noi HTTP ma nā ʻano a me nā kūlana

Aia nā koho e hoʻokuʻu i ka nānā ʻana i nā kikoʻī kikoʻī, e hoʻopaʻa i nā metric paʻamau hou a i ʻole e hoʻokuʻu i nā mea i helu ʻia ma luna, a i ʻole e hoʻohana i ka metric maʻamau like i nā helu hopena. Huli aku README papahana e ʻike i nā mea i loaʻa.

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

Loaʻa i ka waihona nā hoʻonui kūpono no nā hale waihona puke multiprocessing kaulana e like me uWSGI a me Gunicorn. Hiki iā ʻoe ke ʻimi i nā hiʻohiʻona liʻiliʻi o nā hihia hoʻohana i manaʻo ʻia, me ka multiprocessing.

Ohi anana

E like me ka mea i ʻōlelo ʻia ma luna, hāʻawi ka waihona i kahi hopena ma ke ʻano maʻamau /meka i loko o kahi noi Flask, hiki ke lawelawe ma ke ʻano he pahuhopu no Prometheus mea hana.

Ma ka laʻana dashboard ma luna, hiki iā ʻoe ke kuhikuhi i kāu Prometheus i kahi noi Flask me nā hoʻonohonoho paʻamau me kēia hoʻonohonoho:

scrape_configs:
  - job_name: 'example'

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

E nānā i ka laʻana piha ma Nā waihona waihona GitHub. Manaʻo kēia e hiki iā Prometheus ke loaʻa i kāu mau manawa noi Flask ma http://app:5000/metrics, kahi e hiki ai i ka inoa domain noi ke hoʻoholo i nā helu IP he nui, no ka laʻana ke holo i loko Kubernetes ai ole ia, Pahu Docker.

Inā ʻaʻole kūpono iā ʻoe ka hōʻike ʻana i ka hopena metric ma kēia ala, no ka mea ʻaʻole ʻoe makemake e ʻae i ke komo ʻana i waho, hiki iā ʻoe ke hoʻopau maʻalahi iā ia ma ka hele ʻana. ala=Aole i ka hana ʻana i kahi laʻana 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)

A laila hiki iā ʻoe ke hoʻohana start_http_server(port)e wehe i kēia wahi hope ma kekahi awa HTTP ʻē aʻe, 5099 ma ka laana maluna. ʻO kahi ʻē aʻe, inā hauʻoli ʻoe i ka hopena i loko o ka noi Flask like, akā pono ʻoe e hoʻololi i kona ala mai /meka, hiki iā ʻoe ke hāʻawi i kahi URI ʻē aʻe ma ke ʻano he ala ala, a hoʻohana paha kakau_hopena(..)e hoʻouka ma hope.

kūmole

Inā hoʻoholo ʻoe e hoʻāʻo, e ʻoluʻolu e wehe i kahi pilikia ma GitHub a waiho i kāu manaʻo, manaʻo, a me nā manaʻo!

Alakaʻi!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka