Jiri Prometheus na-enyocha Flask Microservices

Ahịrị koodu abụọ na ngwa gị na-ewepụta metrik, wow!

Iji ghọta ka prometheus_ si arụ ọrụflask_onye na-ebupụ ihe atụ kacha ezuola:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Nke ahụ bụ naanị ihe ị ga-achọ ịmalite! Site na ịgbakwunye mbubata na ahịrị maka mbido PrometheusMetrics, ị ga-enweta metrics oge arịrịọ и arịrịọ counter, egosiri na njedebe /metrics Ngwa Flask edebanyere ya, yana metrik ndabara niile ị nwetara site na ntọala Ọbá akwụkwọ ndị ahịa Prometheus.

ị nwere ike ịhụ mfe iji ihe atụ na ebe nchekwa GitHub na-eme ihe atụ Prometheus и Grafana yana ngwa ngosi iji mepụta metrik ga-adị ka nke a:

Jiri Prometheus na-enyocha Flask Microservices

Ị ga-ahụkwa ndepụta nke egosi na README ọmụmaatụ ndị na-apụta na dashboard, yana ajụjụ Prometheus na-ejupụta dashboard.

ukpụhọde

Enwere ọtụtụ nhọrọ nhazi na ọba akwụkwọ, lee anya README oru ngo atụ nke ha na nkenke nkọwa.

E gosipụtara nhazi ntọala n'elu. Naanị mepụta ihe atụ PrometheusMetrics, ka anyị kpọọ ya metrics, wee jiri ya kọwapụta metrik ndị ọzọ ịchọrọ ịnakọta site na ịchọọ ọrụ ndị a:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Ndị Counters na-agụta oku, ndị ọzọ na-anakọta metrik dabere na ogologo oge oku ahụ. Ị nwere ike ịkọwa akara maka nke ọ bụla n'ime ndị a, nwere ike iji arịrịọ ma ọ bụ njirimara nzaghachi. Ọmụmaatụ:

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

N'ihe atụ dị n'elu, ịpị na njedebe njedebe / mkpokọta/10002/item/76 ga-eme ka counter na-abawanye, dịka ọmụmaatụ cnt_collection{mkpokọta = "10002", ọnọdụ = "200"}, gbakwunyere ị ga-enweta metrik ndabara (maka njedebe ọ bụla na ọmụmaatụ a) site na ọba akwụkwọ ndabara:

  • flask_http_request_duration_seconds - Ogologo arịrịọ HTTP na sekọnd maka arịrịọ Flask niile site na usoro, ụzọ na ọkwa

  • flask_http_request_total - Ngụkọta ọnụ ọgụgụ HTTP arịrịọ site na ụzọ na ọnọdụ

Enwere nhọrọ ịwụpụ nsochi nke ngwụcha ngwụcha, tinye metrics ndabara ọzọ ma ọ bụ tufuo ndị edepụtara n'elu, ma ọ bụ tinye otu metric omenala n'ọtụtụ njedebe. Lelee README oru ngo ịhụ ihe dị.

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

Ọbá akwụkwọ ahụ nwere ndọtị dị mma maka ọba akwụkwọ ọtụtụ nhazi dị ka uWSGI na Gunicorn. Ị nwekwara ike ịhụ obere ihe atụ nke ikpe ejiri ezubere iche, gụnyere multiprocessing.

Nchịkọta metrik

Dịka e kwuru n'elu, ọbá akwụkwọ na-enye njedebe njedebe na ndabara /metrics na ngwa Flask, nke nwere ike bụrụ ebumnuche maka Onye nrụpụta Prometheus.

N'ime ihe atụ dashboard dị n'elu, ị nwere ike iledo Prometheus gị na ngwa Flask nwere ntọala ndabara na nhazi a:

scrape_configs:
  - job_name: 'example'

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

Hụ ihe atụ zuru oke na Ebe nchekwa GitHub. Nke a na-eche na Prometheus nwere ike ịchọta ngwa ngwa Flask gị na http://app:5000/metrics, ebe aha ngalaba ngwa nwere ike idozi na ọtụtụ adreesị IP, dịka ọmụmaatụ mgbe ọ na-abanye Kubernetes ma ọ bụ Ulo elu ugbo elu.

Ọ bụrụ na ikpughe metrics endpoint n'ụzọ a adabaghị gị, ikekwe n'ihi na ịchọghị ikwe ka ị nweta ya, ị nwere ike gbanyụọ ya ngwa ngwa site na ịgafe. ụzọ = Ọ dịghị mgbe ịmepụta ihe atụ 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)

Mgbe ahụ ị nwere ike iji start_http_server(ọdụ ụgbọ mmiri)imeghe njedebe a na ọdụ ụgbọ mmiri HTTP dị iche, 5099 n'ihe atụ dị n'elu. N'aka nke ọzọ, ọ bụrụ na ị nwere obi ụtọ na njedebe ikpeazụ ịnọ n'otu ngwa Flask, mana ịkwesịrị ịgbanwe ụzọ ya site na. /metrics, ị nwere ike gafere URI ọzọ dị ka oke ụzọ, ma ọ bụ jiri register_endpoint(...)iji wụnye ya ma emechaa.

zoro

Ọ bụrụ na ị kpebie ịnwale ya, nweere onwe gị imepe esemokwu na GitHub ma ọ bụ hapụ nkọwa gị, nzaghachi na aro gị!

Daalụ!

isi: www.habr.com

Tinye a comment