مراقبة الخدمات الدقيقة للقارورة باستخدام بروميثيوس

سطرين من التعليمات البرمجية والتطبيق الخاص بك يولد المقاييس ، واو!

من أجل فهم كيفية عمل بروميثيوسقارورة_المصدر: مثال بسيط كافي:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

هذا كل ما تحتاجه لتبدأ! عن طريق إضافة استيراد وخط للتهيئة مقاييس بروميثيوس، سوف تحصل على المقاييس مدة الطلب и عدادات الطلبالمعروضة في نقطة النهاية / المقاييس تطبيق Flask الذي تم تسجيله به ، بالإضافة إلى أي مقاييس افتراضية تحصل عليها من القاعدة مكتبة عميل بروميثيوس.

تستطيع ان تجد مثال سهل الاستخدام في مستودع GitHub الذي يقوم بتشغيل المثيل محب العمل и جرافانا جنبًا إلى جنب مع تطبيق تجريبي لتوليد المقاييس التي من شأنها أن تبدو مثل هذا:

مراقبة الخدمات الدقيقة للقارورة باستخدام بروميثيوس

ستجد أيضًا قائمة بالمؤشرات في README الأمثلة التي تظهر في لوحة المعلومات ، جنبًا إلى جنب مع استعلامات بروميثيوس التي تملأ لوحات المعلومات.

تعديل

المكتبة لديها الكثير من خيارات التكوين ، ألق نظرة عليها README اعرض أمثلةهم مع شرح موجز.

التكوين الأساسي مبين أعلاه. مجرد إنشاء مقاييس بروميثيوسدعنا نسميها المقاييس، ثم استخدمه لتحديد المقاييس الإضافية التي تريد جمعها عن طريق تزيين الوظائف:

  • @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" ، الحالة = "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

انظر المثال الكامل في مستودعات جيثب. يفترض هذا أن Prometheus يمكنه العثور على طبعات تطبيق Flask في http://app:5000/metrics، حيث من المحتمل أن يحل اسم مجال التطبيق إلى عناوين IP متعددة ، مثل عند التشغيل في Kubernetes أو عامل ميناء سرب.

إذا كان الكشف عن نقطة نهاية المقاييس مثل هذا لا يناسبك ، ربما لأنك لا تريد السماح بالوصول الخارجي إليها ، فيمكنك تعطيلها بسهولة عن طريق تمرير المسار = لا شيء عند إنشاء مثيل مقاييس بروميثيوس.

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 مختلف كمعامل مسار أو استخدام Register_endpoint (..)لتثبيته لاحقًا.

مراجع

إذا قررت تجربته ، فلا تتردد في فتح مشكلة على GitHub أو ترك تعليقاتك وتعليقاتك واقتراحاتك!

شكرا لك!

المصدر: www.habr.com

إضافة تعليق