Prometheus http API の Python ラッパーとメトリクス処理用のいくつかのツール。
最新リリースをインストールするには:
pip install prometheus-api-client
このブランチから直接インストールするには:
pip install https://github.com/4n4nd/prometheus-api-client-python/zipball/master
Cloud Native Computing Foundation プロジェクトの Prometheus は、システムとサービスの監視システムです。設定されたターゲットから一定の間隔でメトリクス (時系列データ) を収集し、ルール式を評価して結果を表示し、何らかの条件が true であることが観察された場合にアラートをトリガーできます。 Prometheus ホストから取得した生の時系列データは、解釈が難しい場合があります。これらのメトリクスをより深く理解できるように、メトリクスの処理と分析を容易にする Prometheus http API の Python ラッパーを作成しました。
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)" )
カスタム クエリを使用して、特定の時間間隔でメトリクス データを取得することもできます。たとえば、特定のメトリクスの過去 2 日間のデータを 1 日単位で取得してみます。
# 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
モジュールは、promql クエリの結果として Prometheus ホストからフェッチされたメトリクスの Metric オブジェクトのリストを初期化します。
# 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
クラスについて詳しく知るために、 metric_object_list
のメトリクスの 1 つを見てみましょう。
my_metric_object = metric_object_list [ 1 ] # one of the metrics from the list
print ( my_metric_object )
MetricsList
およびMetrics
モジュールに含まれるその他の関数については、このドキュメントを参照してください。
Metric
クラスは、さまざまなメトリック オブジェクトの追加、均等化、プロットなどの複数の関数もサポートします。
次のように、同じ時系列に対して 2 つのメトリック オブジェクトを追加できます。
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``)
演算子 = をオーバーロードして、2 つのメトリクスが同じ (データに関係なく同じ時系列である) かどうかを確認します。
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 にフェッチされた生のメトリクスを処理するために使用できる 2 つのモジュールがあります。
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 クライアントは、プリコミット フレームワークを使用して、コードのリンティングと Python コードのスタイルを維持します。
AICoE-CI は、各プル リクエストに対してコミット前チェックを実行します。
コードに貢献する際には、貢献者が同じパターンに従うことをお勧めします。
同じ標準を維持し、品質と読みやすさを向上させるためにコードを維持したいと考えています。
コミット前構成ファイルはリポジトリ.pre-commit-config.yaml
に存在します。
これには、アプリケーションに使用するさまざまなコード スタイルとリンティング ガイドが含まれています。
プルリクエストを発行する前に、プリコミットを実行する必要があるだけです。
次のコマンドを使用してプリコミットを実行できます。
pre-commit run --all-files
システムに pre-commit がインストールされていない場合は、 pip install pre-commit
でインストールできます。