غلاف Python لواجهة برمجة تطبيقات Prometheus http وبعض الأدوات لمعالجة المقاييس.
لتثبيت الإصدار الأخير:
pip install prometheus-api-client
للتثبيت مباشرة من هذا الفرع:
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
يعد Prometheus، وهو مشروع تابع لمؤسسة Cloud Native Computing Foundation، نظامًا لمراقبة الأنظمة والخدمات. فهو يجمع المقاييس (بيانات السلاسل الزمنية) من الأهداف التي تم تكوينها على فترات زمنية معينة، ويقيم تعبيرات القاعدة، ويعرض النتائج، ويمكنه إطلاق التنبيهات إذا لوحظ أن بعض الشروط صحيحة. قد يكون من الصعب أحيانًا تفسير بيانات السلاسل الزمنية الأولية التي تم الحصول عليها من مضيف Prometheus. للمساعدة في فهم هذه المقاييس بشكل أفضل، قمنا بإنشاء غلاف Python لواجهة برمجة تطبيقات Prometheus http لتسهيل معالجة المقاييس وتحليلها.
تتكون مكتبة prometheus-api-client
من وحدات متعددة تساعد في الاتصال بمضيف Prometheus، وجلب المقاييس المطلوبة وتنفيذ عمليات التجميع المختلفة على بيانات السلاسل الزمنية.
يمكن استخدام وحدة PrometheusConnect
الخاصة بالمكتبة للاتصال بمضيف Prometheus. هذه الوحدة هي في الأساس فئة تم إنشاؤها لجمع المقاييس من مضيف Prometheus. يقوم بتخزين معلمات الاتصال التالية:
from prometheus_api_client import PrometheusConnect
prom = PrometheusConnect ( url = "<prometheus-host>" , disable_ssl = True )
# Get the list of all the metrics that the Prometheus host scrapes
prom . all_metrics ()
يمكنك أيضًا جلب بيانات السلاسل الزمنية لمقياس محدد باستخدام الاستعلامات المخصصة كما يلي:
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
prom . get_current_metric_value ( metric_name = 'up' , label_config = my_label_config )
# Here, we are fetching the values of a particular metric name
prom . custom_query ( query = "prometheus_http_requests_total" )
# Now, lets try to fetch the `sum` of the metrics
prom . custom_query ( query = "sum(prometheus_http_requests_total)" )
يمكننا أيضًا استخدام الاستعلامات المخصصة لجلب بيانات القياس في فترة زمنية محددة. على سبيل المثال، دعونا نحاول جلب بيانات اليومين الماضيين لمقياس معين في أجزاء من يوم واحد:
# Import the required datetime functions
from prometheus_api_client . utils import parse_datetime
from datetime import timedelta
start_time = parse_datetime ( "2d" )
end_time = parse_datetime ( "now" )
chunk_size = timedelta ( days = 1 )
metric_data = prom . get_metric_range_data (
"up{cluster='my_cluster_id'}" , # this is the metric name and label config
start_time = start_time ,
end_time = end_time ,
chunk_size = chunk_size ,
)
لمزيد من الوظائف المضمنة في وحدة PrometheusConnect
، راجع هذه الوثائق.
تقوم وحدة MetricsList
بتهيئة قائمة كائنات Metric للمقاييس التي تم جلبها من مضيف Prometheus نتيجة لاستعلام promql.
# Import the MetricsList and Metric modules
from prometheus_api_client import PrometheusConnect , MetricsList , Metric
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
metric_data = prom . get_metric_range_data ( metric_name = 'up' , label_config = my_label_config )
metric_object_list = MetricsList ( metric_data ) # metric_object_list will be initialized as
# a list of Metric objects for all the
# metrics downloaded using get_metric query
# We can see what each of the metric objects look like
for item in metric_object_list :
print ( item . metric_name , item . label_config , " n " )
تتم تهيئة كل عنصر من العناصر الموجودة في قائمة metric_object_list
ككائن من فئة Metric
. دعونا نلقي نظرة على أحد المقاييس من metric_object_list
لمعرفة المزيد حول فئة Metric
:
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
لمزيد من الوظائف المضمنة في وحدة MetricsList
و Metrics
، راجع هذه الوثائق.
تدعم فئة Metric
أيضًا وظائف متعددة مثل إضافة ومساواة وتخطيط كائنات مترية مختلفة.
يمكنك إضافة إضافة كائنين متريين لنفس السلسلة الزمنية كما يلي:
metric_1 = Metric ( metric_data_1 )
metric_2 = Metric ( metric_data_2 )
metric_12 = metric_1 + metric_2 # will add the data in ``metric_2`` to ``metric_1``
# so if any other parameters are set in ``metric_1``
# will also be set in ``metric_12``
# (like ``oldest_data_datetime``)
عامل التحميل الزائد =، للتحقق مما إذا كان هناك مقياسان متماثلان (هما نفس السلاسل الزمنية بغض النظر عن بياناتهما)
metric_1 = Metric ( metric_data_1 )
metric_2 = Metric ( metric_data_2 )
print ( metric_1 == metric_2 ) # will print True if they belong to the same time-series
ارسم رسمًا بيانيًا خطيًا بسيطًا جدًا للسلسلة الزمنية المترية:
from prometheus_api_client import PrometheusConnect , MetricsList , Metric
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
metric_data = prom . get_metric_range_data ( metric_name = 'up' , label_config = my_label_config )
metric_object_list = MetricsList ( metric_data )
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
my_metric_object . plot ()
لإجراء تحليل البيانات ومعالجتها، غالبًا ما يكون من المفيد تمثيل البيانات باستخدام pandas DataFrame. توجد وحدتان في هذه المكتبة يمكن استخدامهما لمعالجة المقاييس الأولية التي تم جلبها إلى DataFrame.
تقوم وحدة MetricSnapshotDataFrame
بتحويل بيانات "القيمة المترية الحالية" إلى تمثيل DataFrame، وتقوم وحدة MetricRangeDataFrame
بتحويل بيانات "قيم النطاق المتري" إلى تمثيل DataFrame. يمكن رؤية مثال لاستخدام هذه الفئات أدناه:
import datetime as dt
from prometheus_api_client import PrometheusConnect , MetricSnapshotDataFrame , MetricRangeDataFrame
prom = PrometheusConnect ()
my_label_config = { 'cluster' : 'my_cluster_id' , 'label_2' : 'label_2_value' }
# metric current values
metric_data = prom . get_current_metric_value (
metric_name = 'up' ,
label_config = my_label_config ,
)
metric_df = MetricSnapshotDataFrame ( metric_data )
metric_df . head ()
""" Output:
+-------------------------+-----------------+------------+-------+
| __name__ | cluster | label_2 | timestamp | value |
+==========+==============+=================+============+=======+
| up | cluster_id_0 | label_2_value_2 | 1577836800 | 0 |
+-------------------------+-----------------+------------+-------+
| up | cluster_id_1 | label_2_value_3 | 1577836800 | 1 |
+-------------------------+-----------------+------------+-------+
"""
# metric values for a range of timestamps
metric_data = prom . get_metric_range_data (
metric_name = 'up' ,
label_config = my_label_config ,
start_time = ( dt . datetime . now () - dt . timedelta ( minutes = 30 )),
end_time = dt . datetime . now (),
)
metric_df = MetricRangeDataFrame ( metric_data )
metric_df . head ()
""" Output:
+------------+------------+-----------------+--------------------+-------+
| | __name__ | cluster | label_2 | value |
+-------------------------+-----------------+--------------------+-------+
| timestamp | | | | |
+============+============+=================+====================+=======+
| 1577836800 | up | cluster_id_0 | label_2_value_2 | 0 |
+-------------------------+-----------------+--------------------+-------+
| 1577836801 | up | cluster_id_1 | label_2_value_3 | 1 |
+-------------------------+-----------------+------------=-------+-------+
"""
لمزيد من الوظائف المضمنة في مكتبة prometheus-api-client
، يرجى الرجوع إلى هذه الوثائق.
PROM_URL="http://demo.robustperception.io:9090/" pytest
يستخدم عميل Prometheus Api إطار عمل ما قبل الالتزام للحفاظ على فحص التعليمات البرمجية وتصميم كود بايثون.
سيقوم AICoE-CI بتشغيل فحص الالتزام المسبق لكل طلب سحب.
نحن نشجع المساهمين لدينا على اتباع نفس النمط، أثناء المساهمة في الكود.
نود الحفاظ على نفس المعيار والحفاظ على الكود لتحسين الجودة وسهولة القراءة.
ملف تكوين الالتزام المسبق موجود في المستودع .pre-commit-config.yaml
يحتوي على دليل تصميم التعليمات البرمجية والفحص المختلف الذي نستخدمه للتطبيق.
نحتاج فقط إلى تشغيل الالتزام المسبق قبل رفع طلب السحب.
يمكن استخدام الأمر التالي لتشغيل الالتزام المسبق:
pre-commit run --all-files
إذا لم يتم تثبيت الالتزام المسبق في نظامك، فيمكن تثبيته باستخدام: pip install pre-commit