私はプロメテウスでいくつかの監視を行っており、レート関数を適切に使用する方法を理解しようとしています。
前提はこれです。カウンターがあります。この構成は、15秒ごとに新しい値を取り込むように設定されています。
今、私はこれの1秒あたりのレートをグラフ化しようとしているので、レート関数を使用してこれを次のように行います。
rate(pgbouncer_sent_bytes_total{job="pgbouncer", database="worker"}[1m])
レート関数を解釈すると、クエリにより、クエリされた各時点でのローリングレートの平均(1mのルックバックウィンドウ)が得られます。ポイントの間隔は、使用される解像度によって指定されます。
以下は、プロメテウスコンソールのスクリーンショットで、生データのグラフと、1mの解像度を使用した上記のレートクエリのプロットが含まれています。ここで得られたレートグラフは、下のグラフの生データを見て私の期待と実際には一致していません。
興味深いことに、結果のグラフは、ロードされた時点によって大きく異なるように見えます。同じグラフを2、3回リロードするだけで、同じデータを表しているように見えないポイントに完全にシフトします。以下の画像は数分後の同じデータセットですが、数秒後でも同じことが発生します。
誰かがここで実際に何が起こっているのかを明らかにすることができますか?
奇妙な結果の原因は、(1)15秒ごとに収集しても、実際には1分ごとに1回しか増加しないという事実と、(2)Prometheusのrate()
実装が4番目ごとのカウンターを破棄することです。増加します(特定の設定で)。
より正確には、15秒の解像度でスクレイピングされたカウンター上で1分ごとに、1分ごとに(平均して)増加する1分のレートを計算しているように見えます。
これが本質的に意味するのは、Prometheusが基本的に1時間の間隔をdisjoint 1分の範囲にスライスし、各範囲のレートを推定するということです。最初の値はポイント0と3の間の外挿された増加率であり、2番目の値はポイント4と7の間の外挿された増加率です。カウンターは実際には1分に1回しか増加しないため、次の2つの異なる状況に遭遇する可能性があります。
rate()
は90QPSに近いものを返します)。これは、グラフの後半で発生することです。これが、グラフが更新間で大きく異なるように見える理由でもあります。 rate()
の現在の実装に対する議論は、それが「平均して正しい」ということです。グラフ全体を更新全体で見ると、これは真実です。 </皮肉>
基本的に、解像度Rで時間範囲Rにわたってプロメテウスrate()
またはincrease()
をグラフ化すると、エイリアシングが発生し、過大評価(あなたの場合は1.33倍)または過小評価(あなたの場合はゼロ)になります。スムーズに増加するカウンター以外のもの。
式を次のように置き換えることで回避できます。
_rate(foo[75s]) / 75 * 60
_
このようにして、実際には1分間隔のデータポイント間の増加率を取得し(75秒の範囲はほとんどの場合正確に5ポイントを返すため、4つのカウンターが増加します)、プロメテウスが行う75秒に外挿を逆にします。エッジの場合にはノイズが発生します(たとえば、評価がスクレイピング時間と一致している場合、スクレイピング間隔のジッターにより、ある範囲で6ポイント、次の範囲で4ポイントを取得できます)が、とにかくrate()
。
ところで、グラフの解像度を1秒程度に上げるとエイリアシングを確認できます(15秒以下であればはっきりと表示されます)。
あなたの言うことはデータと一致していません、その生データは約1分に1回しか上がっていません。 15秒ごとにスクレイピングしてもよろしいですか?