私は Prometheusのドキュメント を注意深く読みましたが、それでも少しわかりにくいので、理解を確認するためにここにいます。
(可能な限り簡単な例のために、スクラップ間隔、時間範囲に1秒を使用していることに注意してください-実際には不可能であっても)
毎秒カウンターをスクラップしているにもかかわらず、カウンターの値は現在30です。そのための次の時系列があります。
second counter_value increase calculated by hand(call it ICH from now)
1 1 1
2 3 2
3 6 3
4 7 1
5 10 3
6 14 4
7 17 3
8 21 4
9 25 4
10 30 5
このデータセットに対してクエリを実行します。
1.rate()
公式文書は次のように述べています:
"rate(v range-vector):範囲ベクトルの時系列の1秒あたりの平均増加率を計算します。"
素人の用語では、これは毎秒の増加が得られ、指定された秒の値が指定された範囲の平均増分になることを意味しますか?
これが私の意味です:
rate(counter [1s]):はICH平均は1つの値のみから計算されるため。
rate(counter [2s]):は、増分から平均を取得します2秒でそれを秒の間に分配します
最初の2秒で合計3の増分が得られました。これは、平均が1.5 /秒であることを意味します。最終結果:
second result
1 1,5
2 1,5
3 2
4 2
5 3,5
6 3,5
7 3,5
8 3,5
9 4,5
10 4,5
rate(counter [5s]):5秒の増分から平均を取得して分散します数秒のうちに
[2s]と同じですが、合計5秒の増分から平均を計算します。最終結果:
second result
1 2
2 2
3 2
4 2
5 2
6 4
7 4
8 4
9 4
10 4
したがって、時間範囲が高いほど、よりスムーズな結果が得られます。そして、これらの増加の合計は実際のカウンターと一致します。
2.increase()
公式文書は次のように述べています:
"increase(v range-vector):範囲ベクトルの時系列の増加を計算します。"
これは、平均値を秒単位で分散しないことを意味しますが、代わりに、指定された範囲の単一の増分を示します(外挿あり)。
increase(counter [1s]):私の用語では、これは次と一致しますICHおよび1秒間のレート。これは、合計範囲とレートの基本粒度が一致するためです。
increase(counter [2s]):最初の2秒で増分が得られました合計3なので、2.secondsは3の値を取得します。
second result
1 3*
2 3
3 4*
4 4
5 7*
6 7
7 7*
8 7
9 9*
10 9
*私の用語では、これらの値は毎秒をカバーするために外挿された値を意味します。
よく理解していますか、それとも遠いですか?
理想的な世界(サンプルのタイムスタンプが秒単位で、ルール評価が秒単位で行われる)では、rate(counter[1s])
は正確にICH値とrate(counter[5s])
は、そのICHと前の4つの平均を返します。ただし、ICH 1秒目は1ではなく、0です。あなたのカウンターがいつゼロであったかを知っています:多分それはちょうどそこに増加し、多分それは昨日増加し、それ以来1のままでした(これが、最初にカウンターが1の値で表示されたときに増加が見られない理由です) -コードが作成してインクリメントしたためです。)
increase(counter[5s])
は正確にrate(counter[5s]) * 5
です(そしてincrease(counter[2s])
は正確にrate(counter[2s]) * 2
です)。
現実の世界では、サンプルが毎秒正確に収集されるわけではなく、ルール評価も毎秒正確に行われるわけではありません。したがって、1秒間隔で(多かれ少なかれ)多数のサンプルがあり、Prometheusのrate(counter[1s])
を使用した場合、出力は得られません。これは、Prometheusが行うのは、1秒の範囲のすべてのサンプル[now() - 1s, now()]
(ほとんどの場合、単一のサンプル)を取り、レートを計算しようとして失敗するためです。
rate(counter[5s])
OTOHをクエリすると、Prometheusは[now() - 5s, now]
の範囲内のすべてのサンプルを選択します(5つのサンプル、平均して約4秒をカバーします。たとえば、_[t1, v1], [t2, v2], [t3, v3], [t4, v4], [t5, v5]
_)。(カウンターが間隔内にリセットされない場合)_(v5 - v1) / (t5 - t1)
_を返します。つまり実際には5秒ではなく4秒以上の増加率を計算します。
increase(counter[5s])
は_(v5 - v1) / (t5 - t1) * 5
_を返すため、4秒以上の増加率は5秒に外挿されます。
サンプルが正確に間隔が空いていないため、rate
とincrease
はどちらも整数カウンターの浮動小数点値を返すことがよくあります(これはrate
には明らかですが、 increase
)。