2023年12月18日月曜日

Prometheus の query_range で最大プロット可能なステップ数を計算する方法

Prometheus の query_range で最大プロット可能なステップ数を計算する方法

概要

前回 query_range をコールする方法を紹介しました
その際にプロット数の最大値が 11,000 個ということを紹介しました
指定した範囲に応じて最大ステップ数が変わるので今回はそれを考慮したコードを紹介します

環境

  • Python 3.11.3
  • requests 2.31.0

サンプルコード

ポイントは step = int(range / 11000) + 1 の部分です
レンジ内における最大プロット数に収まる step 数を計算します

from datetime import datetime, timedelta, timezone

import requests

proxies = {"http": "192.168.100.2:3128"}
end = datetime.now(timezone.utc)
start = end - timedelta(hours=60)
end_s = end.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
start_s = start.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
# 60時間の範囲で指定可能な最大ステップ数を計算する
# query_range のプロット数が11,000を超えないようにする
range = (end - start).total_seconds()
# 1秒分加算することで指定可能なstep数の最大値になる
step = int(range / 11000) + 1
params = {
    "query": 'instance:node_filesystem_avail:ratio{mountpoint="/var/opt/gitlab"}',
    "start": start_s,
    "end": end_s,
    "step": f"{step}s",
}
schema = "http"
hostname = "192.168.100.1"
port = "9090"
path = "/api/v1/query_range"
url = f"{schema}://{hostname}:{port}{path}"

res = requests.get(url, params=params, proxies=proxies)

# ステップ数とレンジによりプロット数が11,000を超えていないことを確認
# print(res.json())
print(f"step -> {step}s")
print(f"range -> {range}")
print(len(res.json()["data"]["result"][0]["values"]))

注意事項

上記場合一つ考慮が足りない点があります
例えば上記の場合 60 時間分のレンジ内で 11,000 プロット取れるステップ数 (20s) を計算していますがもし 60 時間分のデータがまだない場合にはもっと細かいステップ数を指定することができます

例えば 30 時間分のデータしかない場合には単純に倍のステップ数を指定することができます (10s)
これを考慮する場合には指定のレンジ内で取得したデータの実際のレンジ情報を取得しその実際のレンジ情報からステップ数を計算する必要があるので 2 回 API をコールする必要が出てきます
正確に出したい場合にはその方法が必要になるかなと思います

また scrape_interval が 30s などになっている場合はそもそもデータが 30 秒おきに格納されていることになるので step=30s 以下を指定しても結果的には step=30s と同じデータになるはずです

最後に

Promethues の UI でネットワークを見ると実際に query_range をコールしているクエリが見えるのでそれを参考にしてもいいかもしれません

0 件のコメント:

コメントを投稿