Мониторинги Flask Microservices бо Prometheus

Якчанд сатри код ва барномаи шумо метрика тавлид мекунад, вой!

Барои фаҳмидани он ки чӣ тавр prometheus_ кор мекунадколба_содиркунанда як мисоли ҳадди ақал кофӣ аст:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Ин ҳама чизест, ки ба шумо барои оғоз кардан лозим аст! Бо илова кардани воридот ва сатр барои оғозёбӣ PrometheusMetrics, шумо нишондиҳандаҳоро хоҳед гирифт давомнокии дархост и ҳисобкунакҳоро дархост кунед, дар нуқтаи ниҳоӣ нишон дода мешавад /метрика замимаи Flask, ки бо он сабти ном шудааст, инчунин ҳама ченакҳои пешфарз, ки шумо аз база мегиред Китобхонаи муштарии Prometheus.

шумо метавонед пайдо кунед мисоли истифодаи осон дар анбори GitHub, ки инстансияро иҷро мекунад Prometheus и Графана дар якҷоягӣ бо як барномаи намоишӣ барои тавлиди ченакҳое, ки чунинанд:

Мониторинги Flask Microservices бо Prometheus

Шумо инчунин рӯйхати нишондиҳандаҳоро дар зер хоҳед ёфт README мисолҳое, ки дар панели идоракунӣ пайдо мешаванд, дар якҷоягӣ бо дархостҳои Prometheus, ки панелҳои идоракуниро пур мекунанд.

танзим

Дар китобхона имконоти зиёди конфигуратсия мавҷуданд, нигаред README намунаҳои лоиҳаи онҳо бо шарҳи мухтасар.

Конфигуратсияи асосӣ дар боло нишон дода шудааст. Танҳо як мисол эҷод кунед PrometheusMetrics, биёед онро даъват кунем метрика, ва сипас онро барои муайян кардани ченакҳои иловагие, ки шумо мехоҳед бо ороиш додани функсияҳо ҷамъ кунед, истифода баред:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Ҳисобкунакҳо зангҳоро ҳисоб мекунанд ва дигарон ченакҳоро дар асоси давомнокии ин зангҳо ҷамъ мекунанд. Шумо метавонед барои ҳар яке аз инҳо тамғакоғазҳоро муайян кунед, эҳтимолан бо истифода аз хосиятҳои дархост ё посух. Барои намуна:

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

Дар мисоли боло, клик кардани нуқтаи ниҳоӣ /маҷмӯа/10002/банди/76 масалан, ҳисобкунакро афзоиш медиҳад cnt_collection{коллекция = "10002", ҳолат = "200"}, плюс шумо ченакҳои пешфарзро (барои ҳар як нуқтаи ниҳоӣ дар ин мисол) аз китобхонаи пешфарз мегиред:

  • flask_http_request_duration_seconds — Давомнокии дархости HTTP дар сонияҳо барои ҳама дархостҳои Flask аз рӯи усул, роҳ ва ҳолат

  • flask_http_request_total — Шумораи умумии дархостҳои HTTP аз рӯи усулҳо ва ҳолатҳо

Имкониятҳо вуҷуд доранд, ки пайгирии нуқтаҳои мушаххасро гузаред, ченакҳои иловагии пешфарзро сабт кунед ё аз онҳое, ки дар боло номбар шудаанд, гузаред ё ҳамон метрикаи фармоиширо ба якчанд нуқтаҳои ниҳоӣ татбиқ кунед. Тафтиш README лоиҳа барои дидани он ки чӣ дастрас аст.

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

Китобхона дорои васеъшавии қулай барои китобхонаҳои маъмули бисёркорӣ ба монанди uWSGI ва Gunicorn мебошад. Шумо инчунин метавонед мисолҳои хурди ҳолатҳои истифодаи мақсаднок, аз ҷумла коркарди бисёрҷониба пайдо кунед.

Ҷамъоварии нишондиҳандаҳо

Тавре ки дар боло зикр гардид, китобхона ба таври нобаёнӣ нуқтаи ниҳоӣ медиҳад /метрика дар барномаи Flask, ки метавонад ҳамчун ҳадаф хидмат кунад Сохтмони Прометей.

Дар мисоли панели боло, шумо метавонед Prometheus-и худро ба як барномаи Flask бо танзимоти пешфарз бо ин конфигуратсия равона кунед:

scrape_configs:
  - job_name: 'example'

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

Намунаи пурраро дар Анборҳои GitHub. Ин тахмин мекунад, ки Prometheus метавонад мисолҳои барномаи Flask-и шуморо дар он пайдо кунад http://app:5000/metrics, ки дар он номи домени барнома метавонад ба якчанд суроғаҳои IP ҳал карда шавад, масалан ҳангоми кор кардан Кубернитель ё Тӯдаи докер.

Агар ин тавр нишон додани нуқтаи ниҳоии ченакҳо ба шумо мувофиқат накунад, шояд аз он сабаб, ки шумо намехоҳед дастрасии берунаро ба он иҷозат диҳед, шумо метавонед онро бо роҳи гузариш ба осонӣ хомӯш кунед. роҳ = Ҳеҷ ҳангоми сохтани мисол 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)

Он гоҳ шумо метавонед истифода баред start_http_server(порт)барои кушодани ин нуқтаи ниҳоӣ дар порти HTTP, 5099 дар мисоли боло. Интихобан, агар шумо аз будани нуқтаи ниҳоӣ дар ҳамон як барномаи Flask қаноатманд бошед, аммо шумо бояд роҳи онро аз /метрика, шумо метавонед ё URI-и дигарро ҳамчун параметри роҳ гузаронед ё истифода баред бақайдгирии_охири(..)баъдтар насб кардани он.

мурожиат

Агар шумо қарор диҳед, ки онро санҷед, озод бошед, ки дар GitHub масъала кушоед ё шарҳҳо, фикру мулоҳизаҳо ва пешниҳодҳои худро гузоред!

Ташаккур!

Манбаъ: will.com

Илова Эзоҳ