Carpe Diem

備忘録

Prometheusのrateを理解する

背景

Prometheusでメトリクスを可視化する際にPromQLを使います。その中で最もよく使うのがrate()関数ですが、

  • window, interval, resolutionの違い
  • irate()関数との違い

など疑問に思ったので一度きちんと整理してみます。

環境

  • Prometheus v2.40.5

range ventor

rate関数を理解する上でまずrange vectorの概念を理解する必要があります。

windowとintervalとresolution

こちらの図が非常に分かりやすいです。

ref: https://iximiuz.com/en/posts/prometheus-functions-agg-over-time/

言葉で表現すると以下です。

用語 説明
window rate関数で平均化する際の期間。上図のrange duration。sliding windowとも言える
interval データをスクレイピングする間隔。上図のscrape interval
resolution クエリを実行してグラフに描画する間隔。上図のquery step
range vector window毎のベクトル値

次に各値を変更していった時にどうなるかを説明します。

window

windowを大きくすればするほどグラフは滑らかになり、全体傾向を掴むのに向きますが一方でスパイクなどの値が丸められて正確な値を算出できません。
また先程の図から分かるように、windowがintervalに近づくほど(小さくなると)期間内のサンプル数が少なくなります。当然intervalより小さいと意味がありません。

window 10s

window 30s

10sの最初にあったスパイクが丸められています。

window 1m

30sのギザギザ感がなくなっています。

window 2m

resolution

resolutionはクエリを実行して描画する間隔です。

resolution 2s

2sの場合は非常に細かい頻度でクエリを実行して描画しているので、グラフ自体も細かいです。

resolution 5s

5s, 10sと増やしていくと粒度が下がるため細かい部分は滑らかになっていきます。

resolution 10s

rate関数

次にrate関数において特徴的にな仕様を説明します。

外挿(extrapolation)

windowとintervalは一致することはあまりないので、外挿という仕組みで推測値を元に算出されます。

ref: https://promlabs.com/blog/2021/01/29/how-exactly-does-promql-calculate-rates

上記のようにwindow内の最初と最後のサンプルから、仮想のサンプルを用意して増加率を算出します。

reset

rate関数はカウンタは単調増加するものという前提の関数であるため、いずれかのサンプルが以前のものより低い値を持ってた場合はプロセスの再起動などによるカウンタのリセットとして解釈します。

なのでサンプル(生のデータ)が以下であった場合

time(sec) 0 10 20 30 40 50 60
value 0 5 8 10 2 4 9

30sec~40secの間にリセットが入ったと解釈して次の様に直前の値(30sec)をベースに補正されます。

time(sec) 0 10 20 30 40 50 60
value 0 5 8 10 12 14 19

irate(instant rate)との違い

irateはwindow内の最後の2つのサンプルを用いて増加率を算出します。 なのでwindow期間を延ばしても対象サンプルは変わらないためグラフの変化もありません。

irate window 10s

irate window 1m

メリットとしては外挿がないので計算が軽量になる一方、変化が激しいのでアラートには向いておらず、resolutionによっては多くのサンプルが無視されるので、一時的にズームしてスパイク傾向を見てみたい〜といった時くらいに使うイメージです。

まとめ

rate関数におけるrange vector周りの要素や、それを変更した場合にどうなるかを説明しました。

参考