مانیتورینگ میکروسرویس های فلاسک با پرومتئوس

چند خط کد و برنامه شما معیارها را تولید می کند، وای!

برای اینکه بفهمیم پرومتئوس_ چگونه کار می کندفلاسک_صادرکننده یک مثال حداقل کافی است:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

این تمام چیزی است که برای شروع نیاز دارید! با افزودن یک import و یک خط برای مقداردهی اولیه PrometheusMetrics، معیارهایی را دریافت خواهید کرد مدت زمان درخواست и شمارنده های درخواست، در نقطه پایانی نمایش داده می شود /معیارهای برنامه Flask که با آن ثبت شده است، و همچنین تمام معیارهای پیش فرضی که از پایه دریافت می کنید کتابخانه مشتری پرومتئوس.

میتونی پیدا کنی مثال آسان برای استفاده در مخزن GitHub که نمونه را اجرا می کند تیتان فرزند پاپتوس и گرافانا همراه با یک برنامه آزمایشی برای تولید معیارهایی که چیزی شبیه به این هستند:

مانیتورینگ میکروسرویس های فلاسک با پرومتئوس

شما همچنین لیستی از شاخص ها را در 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

در مثال بالا، روی نقطه پایانی کلیک کنید /collection/10002/item/76 برای مثال باعث افزایش شمارنده می شود cnt_collection{collection = "10002"، status = "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(port)برای باز کردن این نقطه پایانی در یک پورت HTTP دیگر، 5099 در مثال بالا از طرف دیگر، اگر از اینکه نقطه پایانی در همان برنامه Flask قرار دارد راضی هستید، اما باید مسیر آن را از /معیارهای، می توانید URI دیگری را به عنوان پارامتر مسیر ارسال کنید یا از آن استفاده کنید register_endpoint(..)تا بعدا نصبش کنید

مراجع

اگر تصمیم دارید آن را امتحان کنید، با خیال راحت موضوعی را در GitHub باز کنید یا نظرات، بازخوردها و پیشنهادات خود را بنویسید!

با تشکر از شما!

منبع: www.habr.com

اضافه کردن نظر