2020年10月19日月曜日

Python から Prometheus のメトリックを取得してみる

概要

前回 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 件のコメント:

コメントを投稿