Pembungkus Python untuk api http Prometheus dan beberapa alat untuk pemrosesan metrik.
Untuk menginstal rilis terbaru:
pip install prometheus-api-client
Untuk menginstal langsung dari cabang ini:
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
Prometheus, proyek Cloud Native Computing Foundation, adalah sistem pemantauan sistem dan layanan. Ia mengumpulkan metrik (data rangkaian waktu) dari target yang dikonfigurasi pada interval tertentu, mengevaluasi ekspresi aturan, menampilkan hasilnya, dan dapat memicu peringatan jika beberapa kondisi dianggap benar. Data deret waktu mentah yang diperoleh dari host Prometheus terkadang sulit diinterpretasikan. Untuk membantu lebih memahami metrik ini, kami telah membuat pembungkus Python untuk api http Prometheus untuk memudahkan pemrosesan dan analisis metrik.
Pustaka prometheus-api-client
terdiri dari beberapa modul yang membantu menghubungkan ke host Prometheus, mengambil metrik yang diperlukan, dan melakukan berbagai operasi agregasi pada data deret waktu.
Modul perpustakaan PrometheusConnect
dapat digunakan untuk terhubung ke host Prometheus. Modul ini pada dasarnya adalah kelas yang dibuat untuk kumpulan metrik dari host Prometheus. Ini menyimpan parameter koneksi berikut:
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 ()
Anda juga dapat mengambil data deret waktu untuk metrik tertentu menggunakan kueri khusus sebagai berikut:
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)" )
Kami juga dapat menggunakan kueri khusus untuk mengambil data metrik dalam interval waktu tertentu. Misalnya, coba ambil data 2 hari terakhir untuk metrik tertentu dalam potongan 1 hari:
# 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 ,
)
Untuk fungsi lainnya yang disertakan dalam modul PrometheusConnect
, lihat dokumentasi ini.
Modul MetricsList
menginisialisasi daftar objek Metrik untuk metrik yang diambil dari host Prometheus sebagai hasil kueri 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 " )
Setiap item dalam metric_object_list
diinisialisasi sebagai objek kelas Metric
. Mari kita lihat salah satu metrik dari metric_object_list
untuk mempelajari lebih lanjut tentang kelas Metric
:
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
Untuk fungsi lainnya yang disertakan dalam modul MetricsList
dan Metrics
, lihat dokumentasi ini.
Kelas Metric
juga mendukung beberapa fungsi seperti menambahkan, menyamakan dan memplot berbagai objek metrik.
Anda dapat menambahkan dua objek metrik untuk rangkaian waktu yang sama sebagai berikut:
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``)
Operator kelebihan beban =, untuk memeriksa apakah dua metrik sama (merupakan rangkaian waktu yang sama, apa pun datanya)
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
Buat grafik garis yang sangat sederhana untuk deret waktu metrik:
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 ()
Untuk melakukan analisis dan manipulasi data, sering kali akan berguna jika data direpresentasikan menggunakan pandas DataFrame. Ada dua modul di perpustakaan ini yang dapat digunakan untuk memproses metrik mentah yang diambil ke dalam DataFrame.
Modul MetricSnapshotDataFrame
mengonversi data "nilai metrik saat ini" menjadi representasi DataFrame, dan MetricRangeDataFrame
mengonversi data "nilai rentang metrik" menjadi representasi DataFrame. Contoh penggunaan kelas-kelas tersebut dapat dilihat di bawah ini:
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 |
+-------------------------+-----------------+------------=-------+-------+
"""
Untuk fungsi lainnya yang disertakan dalam perpustakaan prometheus-api-client
, silakan merujuk ke dokumentasi ini.
PROM_URL="http://demo.robustperception.io:9090/" pytest
Klien Prometheus Api menggunakan kerangka kerja pra-komit untuk mempertahankan linting kode dan gaya kode python.
AICoE-CI akan menjalankan pemeriksaan pra-komitmen pada setiap permintaan penarikan.
Kami mendorong kontributor kami untuk mengikuti pola yang sama, sambil berkontribusi pada kode etik.
kami ingin mempertahankan standar yang sama dan mempertahankan kode untuk kualitas dan keterbacaan yang lebih baik.
File konfigurasi pra-komit ada di repositori .pre-commit-config.yaml
Ini berisi panduan gaya dan linting kode berbeda yang kami gunakan untuk aplikasi.
kita hanya perlu menjalankan pra-komit sebelum mengajukan Permintaan Tarik.
Perintah berikut dapat digunakan untuk menjalankan pra-komit:
pre-commit run --all-files
Jika pra-komit tidak terinstal di sistem Anda, maka dapat diinstal dengan : pip install pre-commit