背景
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より小さいと意味がありません。
10sの最初にあったスパイクが丸められています。
30sのギザギザ感がなくなっています。
resolution
resolutionはクエリを実行して描画する間隔です。
2sの場合は非常に細かい頻度でクエリを実行して描画しているので、グラフ自体も細かいです。
5s, 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期間を延ばしても対象サンプルは変わらないためグラフの変化もありません。
メリットとしては外挿がないので計算が軽量になる一方、変化が激しいのでアラートには向いておらず、resolutionによっては多くのサンプルが無視されるので、一時的にズームしてスパイク傾向を見てみたい〜といった時くらいに使うイメージです。
まとめ
rate関数におけるrange vector周りの要素や、それを変更した場合にどうなるかを説明しました。