Prometheus ilə Flask mikroservislərinin monitorinqi

Bir neçə sətir kod və tətbiqiniz ölçülər yaradır, vay!

prometheus_ necə işlədiyini başa düşmək üçünkolba_ixracatçıya minimal bir nümunə kifayətdir:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Başlamaq üçün sizə lazım olan hər şey budur! Import və başlanğıc üçün xətt əlavə etməklə PrometheusMetrics, siz ölçülər əldə edəcəksiniz sorğu müddəti и sayğacları tələb edin, son nöqtədə göstərilir /metriklər onun qeydiyyatdan keçdiyi Flask tətbiqi, eləcə də bazadan əldə etdiyiniz bütün standart ölçülər Prometheus müştəri kitabxanası.

Sən tapa bilərsən istifadəsi asan nümunə nümunəni işlədən GitHub deposunda Prometey и Qrafana bu kimi görünəcək ölçüləri yaratmaq üçün demo tətbiqi ilə birlikdə:

Prometheus ilə Flask mikroservislərinin monitorinqi

Siz həmçinin göstəricilərin siyahısını tapa bilərsiniz README tablosuna daxil olan Prometey sorğuları ilə birlikdə tablosunda görünən nümunələr.

nizamlama

Kitabxanada bir çox konfiqurasiya variantları var, baxın README qısa izahı ilə layihə nümunələri.

Əsas konfiqurasiya yuxarıda göstərilmişdir. Sadəcə bir nümunə yaradın PrometheusMetrics, deyək ölçümlerini, və sonra funksiyaları bəzəyərək toplamaq istədiyiniz əlavə ölçüləri müəyyən etmək üçün istifadə edin:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Sayğaclar zəngləri hesablayır, digərləri isə həmin zənglərin müddəti əsasında ölçüləri toplayır. Siz potensial olaraq sorğu və ya cavab xassələrindən istifadə edərək bunların hər biri üçün etiketlər təyin edə bilərsiniz. Misal üçün:

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

Yuxarıdakı nümunədə, son nöqtəyə klikləyin /kolleksiya/10002/item/76 sayğacın artmasına səbəb olacaq, məsələn cnt_collection{kolleksiya = "10002", status = "200"}, üstəlik siz standart kitabxanadan defolt ölçüləri (bu nümunədəki hər son nöqtə üçün) əldə edəcəksiniz:

  • flask_http_request_duration_seconds — Metod, yol və statusa görə bütün Flask sorğuları üçün saniyələrlə HTTP sorğu müddəti

  • flask_http_request_total — Metodlar və statuslar üzrə HTTP sorğularının ümumi sayı

Xüsusi son nöqtələrin izlənilməsini keçmək, əlavə defolt ölçüləri daxil etmək və ya yuxarıda sadalananları keçmək və ya eyni fərdi metrikanı birdən çox son nöqtəyə tətbiq etmək üçün seçimlər var. Yoxla README nəyin mövcud olduğunu görmək üçün layihə.

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

Kitabxanada uWSGI və Gunicorn kimi məşhur multiprocessing kitabxanaları üçün rahat genişlənmələr var. Siz həmçinin multiprocessing daxil olmaqla, məqsədyönlü istifadə hallarının kiçik nümunələrini tapa bilərsiniz.

Metriklər toplusu

Yuxarıda qeyd edildiyi kimi, kitabxana standart olaraq son nöqtəni təmin edir /metriklər üçün hədəf kimi xidmət edə bilən Flask tətbiqində Prometey inşaatçısı.

Yuxarıdakı idarə paneli nümunəsində siz Prometheus-u bu konfiqurasiya ilə defolt parametrləri olan Flask proqramına yönəldə bilərsiniz:

scrape_configs:
  - job_name: 'example'

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

Tam nümunəyə baxın GitHub depoları. Bu güman edir ki, Prometheus Flask tətbiq nümunələrinizi tapa bilər http://app:5000/metrics, tətbiqin domen adı potensial olaraq birdən çox IP ünvanına həll edilə bilər, məsələn, daxil olduqda Kubernetes və ya Docker sürüsü.

Əgər metrikanın son nöqtəsini bu şəkildə ifşa etmək sizə uyğun gəlmirsə, ola bilsin ki, ona xarici girişə icazə vermək istəmədiyiniz üçün, keçid edərək onu asanlıqla söndürə bilərsiniz. yol = Yoxdur nümunə yaratarkən 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)

Sonra istifadə edə bilərsiniz start_http_server(port)bu son nöqtəni fərqli HTTP portunda açmaq üçün, 5099 yuxarıdakı nümunədə. Alternativ olaraq, son nöqtənin eyni Flask proqramında olmasından razısınızsa, lakin onun yolunu dəyişdirmək lazımdırsa. /metriklər, siz ya başqa bir URI-ni yol parametri kimi ötürə və ya istifadə edə bilərsiniz qeydiyyat_son nöqtəsi(..)sonra quraşdırmaq üçün.

References

Bunu sınamaq qərarına gəlsəniz, GitHub-da məsələ açmaqdan və ya şərh, rəy və təkliflərinizi bildirməkdən çəkinməyin!

Təşəkkür edirik!

Mənbə: www.habr.com

Добавить комментарий