概要
前回 Ruby から Prometheus のメトリックを取得してみました
今回は Python から取得してみたいと思います
環境
- macOS 10.15.7
- Python 3.8.5
- prometheus-api-client
インストール
pipenv install prometheus-api-client
すべてのメトリックのクエリを取得
取得可能なメトリックの一覧を取得してみます
配列でメトリック名が取得できます
このメトリック名と時間を使って特定の期間のメトリックを取得できます
vim app.py
from prometheus_api_client import PrometheusConnect
prom = PrometheusConnect(url ="http://192.168.100.10:9090", disable_ssl=True)
print(prom.all_metrics())
pipenv run python app.py
特定のメトリック情報を取得する
例えば redis_memory_used_bytes
を取得してみます
最新の 10 分間だけ取得する場合には get_metric_range_data
を使います
label_config
には特定のメトリックを取得ために設定されているキーバリューのラベルを設定します
あとは metric_name
にメトリック名を指定すれば OK です
import datetime
from prometheus_api_client import PrometheusConnect
prom = PrometheusConnect(url ="http://192.168.100.10:9090", disable_ssl=True)
label_config = {'instance': 'localhost:9121', 'job': 'redis'}
metric_data = prom.get_metric_range_data(metric_name='redis_memory_used_bytes', label_config=label_config)
print(metric_data)
t = metric_data[0].get('values')[-1][0]
v = metric_data[0].get('values')[-1][1]
print(datetime.datetime.fromtimestamp(t))
print(int(v) / (1000 * 1000))
values
という配列にメトリックデータが入っています
-1
で参照しているのは配列の最後に最新のデータが入っているためです
時刻は unix time なので変換し値はバイト単位なのでメガバイトに変換しています
時間を指定して取得する
10 分間ではないレンジを指定したい場合は get_metric_range_data
を使います
時間の指定は prometheus_api_client
が用意してくれている parse_datetime
が使えます
chunk_size
は取得できるメトリック数をいくつかのチャンクに分けて取得してくれます
例えば以下のサンプルのように 30 分間のメトリックを取得する際に chunk_size=6mins
などにすると 5 分間隔のメトリックデータに分割して取得してくれます
import datetime
from prometheus_api_client import PrometheusConnect
from prometheus_api_client.utils import parse_datetime
prom = PrometheusConnect(url ="http://192.168.100.10:9090", disable_ssl=True)
label_config = {'instance': 'localhost:9121', 'job': 'redis'}
start_time = parse_datetime("30min")
end_time = parse_datetime("now")
chunk_size = datetime.timedelta(minutes=30)
metric_data = prom.get_metric_range_data(
'redis_memory_used_bytes{instance="localhost:9121",job="redis"}',
start_time=start_time,
end_time=end_time,
chunk_size=chunk_size,
)
print(metric_data)
print(len(metric_data[0].get('values')))
t = metric_data[0].get('values')[-1][0]
v = metric_data[0].get('values')[-1][1]
print(datetime.datetime.fromtimestamp(t))
print(int(v) / (1000 * 1000))
最後に
Python から Prometheus のメトリックを取得してみました
基本は Ruby と同じでメトリック名+ラベル+時間のレンジを指定することでメトリック情報を取得することができます
時間や値の変換方法が言語で異なる他、データ取得のためのヘルパーメソッドが用意されているかいないかが違いかなと思います
0 件のコメント:
コメントを投稿