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، آپ کو میٹرکس ملیں گے۔ درخواست کی مدت и کاؤنٹرز کی درخواست کریں۔، اختتامی نقطہ پر ظاہر ہوتا ہے۔ /میٹرکس فلاسک ایپلیکیشن جس کے ساتھ یہ رجسٹرڈ ہے، ساتھ ہی وہ تمام ڈیفالٹ میٹرکس جو آپ کو بیس سے ملتی ہیں۔ پرومیتھیس کلائنٹ لائبریری.

آپ ڈھونڈ سکتے ہیں استعمال کرنے میں آسان مثال GitHub ذخیرہ میں جو مثال چلاتا ہے۔ Prometheus и گرافانا میٹرکس بنانے کے لیے ایک ڈیمو ایپلیکیشن کے ساتھ جو کچھ اس طرح نظر آئے گا:

Prometheus کے ساتھ فلاسک مائیکرو سروسز کی نگرانی

آپ کو اشارے کی فہرست بھی مل جائے گی۔ پڑھیں ڈیش بورڈ میں ظاہر ہونے والی مثالیں، ڈیش بورڈز کو آباد کرنے والے Prometheus سوالات کے ساتھ۔

ایڈجسٹمنٹ

لائبریری میں کنفیگریشن کے بہت سے آپشنز ہیں، دیکھیں پڑھیں ایک مختصر وضاحت کے ساتھ ان کی پروجیکٹ مثالیں۔

بنیادی ترتیب اوپر دکھایا گیا ہے۔ بس ایک مثال بنائیں 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_http_request_total - طریقوں اور حالات کے لحاظ سے HTTP درخواستوں کی کل تعداد

مخصوص اینڈ پوائنٹس کی ٹریکنگ کو چھوڑنے، اضافی ڈیفالٹ میٹرکس کو لاگ کرنے یا اوپر دیے گئے ان کو چھوڑنے، یا ایک سے زیادہ اینڈ پوائنٹس پر ایک ہی کسٹم میٹرک کو لاگو کرنے کے اختیارات موجود ہیں۔ اس کو دیکھو پڑھیں یہ دیکھنے کے لیے پروجیکٹ کریں کہ کیا دستیاب ہے۔

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 کے لیے آسان توسیعات ہیں۔ آپ کو ٹارگٹڈ استعمال کے معاملات کی چھوٹی مثالیں بھی مل سکتی ہیں، بشمول ملٹی پروسیسنگ۔

میٹرکس کا مجموعہ

جیسا کہ اوپر ذکر کیا گیا ہے، لائبریری بطور ڈیفالٹ ایک اختتامی نقطہ فراہم کرتی ہے۔ /میٹرکس ایک فلاسک ایپلی کیشن میں، جو ہدف کے طور پر کام کر سکتی ہے۔ پرومیتھیس بنانے والا.

اوپر دی گئی ڈیش بورڈ کی مثال میں، آپ اپنے Prometheus کو اس کنفیگریشن کے ساتھ ڈیفالٹ سیٹنگز کے ساتھ فلاسک ایپلیکیشن پر نشانہ بنا سکتے ہیں:

scrape_configs:
  - job_name: 'example'

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

مکمل مثال پر دیکھیں GitHub ذخیرے. یہ فرض کرتا ہے کہ پرومیتھیس آپ کی فلاسک ایپلیکیشن کی مثالیں تلاش کر سکتا ہے۔ http://app:5000/metrics، جہاں ایپلیکیشن ڈومین نام ممکنہ طور پر متعدد IP پتوں کو حل کر سکتا ہے، مثال کے طور پر جب چل رہا ہو۔ Kubernetes یا ڈاکر بھیڑ.

اگر میٹرکس اینڈ پوائنٹ کو اس طرح بے نقاب کرنا آپ کے لیے مناسب نہیں ہے، شاید اس لیے کہ آپ اس تک بیرونی رسائی کی اجازت نہیں دینا چاہتے، آپ اسے آسانی سے پاس کرکے غیر فعال کر سکتے ہیں۔ راستہ = کوئی نہیں۔ ایک مثال بناتے وقت 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 مندرجہ بالا مثال میں. متبادل طور پر، اگر آپ اینڈ پوائنٹ کے اسی فلاسک ایپلیکیشن میں ہونے سے خوش ہیں، لیکن آپ کو اس کا راستہ تبدیل کرنے کی ضرورت ہے /میٹرکس، آپ یا تو پاتھ پیرامیٹر کے طور پر ایک اور URI پاس کرسکتے ہیں، یا استعمال کرسکتے ہیں۔ رجسٹر_اینڈ پوائنٹ (..)اسے بعد میں انسٹال کرنے کے لیے۔

حوالہ جات

اگر آپ اسے آزمانے کا فیصلہ کرتے ہیں، تو بلا جھجھک GitHub پر کوئی مسئلہ کھولیں یا اپنے تبصرے، تاثرات اور تجاویز چھوڑیں!

آپ کا شکریہ!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں