Prometey yordamida Flask Microservices monitoringi

Bir necha qator kod va sizning ilovangiz o'lchovlarni yaratadi, voy!

Prometey_ qanday ishlashini tushunish uchunkolba_eksportchiga minimal misol yetarli:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Boshlash uchun kerak bo'lgan hamma narsa shu! Import va ishga tushirish uchun qator qo'shish orqali PrometheusMetrics, siz ko'rsatkichlarni olasiz so'rov muddati и so'rov hisoblagichlari, oxirgi nuqtada ko'rsatiladi / ko'rsatkichlar u ro'yxatdan o'tgan Flask ilovasi, shuningdek, siz bazadan olgan barcha standart ko'rsatkichlar Prometey mijozlar kutubxonasi.

topishingiz mumkin foydalanish uchun qulay misol misolni boshqaradigan GitHub omborida Prometheus и grafana demo ilovasi bilan bir qatorda, shunga o'xshash ko'rsatkichlarni yaratish uchun:

Prometey yordamida Flask Microservices monitoringi

Shuningdek, siz ko'rsatkichlar ro'yxatini topasiz README asboblar panelida ko'rinadigan misollar va asboblar panelini to'ldiradigan Prometey so'rovlari.

moslashish

Kutubxonada ko'plab konfiguratsiya variantlari mavjud, qarang README qisqacha tushuntirish bilan ularning loyiha misollari.

Asosiy konfiguratsiya yuqorida ko'rsatilgan. Faqat misol yarating PrometheusMetrics, keling, uni chaqiramiz o'lchovlar, va undan keyin funksiyalarni bezash orqali toʻplamoqchi boʻlgan qoʻshimcha koʻrsatkichlarni aniqlash uchun foydalaning:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Hisoblagichlar qo'ng'iroqlarni sanaydi, boshqalar esa o'sha qo'ng'iroqlar davomiyligi asosida ko'rsatkichlarni to'playdi. Siz so'rov yoki javob xususiyatlaridan foydalanib, ularning har biri uchun yorliqlarni belgilashingiz mumkin. Masalan:

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

Yuqoridagi misolda oxirgi nuqtani bosing /to'plam/10002/item/76 hisoblagichning ortishiga olib keladi, masalan cnt_collection{to'plam = "10002", status = "200"}, shuningdek, siz standart kutubxonadan standart ko'rsatkichlarni (ushbu misoldagi har bir so'nggi nuqta uchun) olasiz:

  • flask_http_request_duration_seconds — Usul, yoʻl va holat boʻyicha barcha Flask soʻrovlari uchun HTTP soʻrovining davomiyligi soniyalarda

  • flask_http_request_total — Usullar va holatlar boʻyicha HTTP soʻrovlarining umumiy soni

Muayyan so'nggi nuqtalarni kuzatishni o'tkazib yuborish, qo'shimcha standart ko'rsatkichlarni qayd qilish yoki yuqorida sanab o'tilganlarni o'tkazib yuborish yoki bir xil maxsus ko'rsatkichni bir nechta so'nggi nuqtalarga qo'llash variantlari mavjud. Ro'yxatdan o'chirilish README nima mavjudligini ko'rish uchun loyiha.

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

Kutubxonada uWSGI va Gunicorn kabi mashhur multiprocessing kutubxonalari uchun qulay kengaytmalar mavjud. Bundan tashqari, maqsadli foydalanish holatlarining kichik misollarini, jumladan, ko'p ishlov berishni topishingiz mumkin.

Ko'rsatkichlar to'plami

Yuqorida aytib o'tilganidek, kutubxona sukut bo'yicha oxirgi nuqtani taqdim etadi / ko'rsatkichlar maqsad bo'lib xizmat qilishi mumkin bo'lgan Flask ilovasida Prometey quruvchisi.

Yuqoridagi asboblar paneli misolida siz Prometeyni ushbu konfiguratsiyaga ega standart sozlamalarga ega Flask ilovasiga yo'naltirishingiz mumkin:

scrape_configs:
  - job_name: 'example'

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

To'liq misolni ko'ring GitHub omborlari. Bu Prometey Flask ilova nusxalarini topa oladi, deb taxmin qiladi http://app:5000/metrics, bu erda ilovaning domen nomi bir nechta IP-manzillarga, masalan, ishga tushganda, potentsial hal qilinishi mumkin Kubernetes yoki Docker to'dasi.

Agar ko'rsatkichlarning so'nggi nuqtasini bu tarzda ochish sizga mos kelmasa, ehtimol siz unga tashqi kirishga ruxsat berishni xohlamasangiz, uni o'tish orqali osongina o'chirib qo'yishingiz mumkin. yo'l = Yo'q misol yaratishda 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)

Keyin foydalanishingiz mumkin start_http_server(port)ushbu so'nggi nuqtani boshqa HTTP portida ochish uchun, 5099 yuqoridagi misolda. Shu bilan bir qatorda, agar siz oxirgi nuqta bir xil Flask ilovasida ekanligidan mamnun bo'lsangiz, lekin uning yo'lini o'zgartirishingiz kerak bo'lsa. / ko'rsatkichlar, siz yo'l parametri sifatida boshqa URI ni o'tkazishingiz yoki foydalanishingiz mumkin register_endpoint(..)keyinroq o'rnatish uchun.

Manbalar

Agar siz sinab ko'rishga qaror qilsangiz, GitHub-da muammoni oching yoki sharh, fikr va takliflaringizni qoldiring!

Rahmat!

Manba: www.habr.com

a Izoh qo'shish