少し時間が経ってしまっていますが, 8 月に Prometheus に特化したカンファレンス PromCon 2017 がミュンヘンにて開かれたので, Z Lab からは私と @tkusumi が参加して来ました.
この記事ではそこで聞いたセッションの中から, 先日リリースされた Prometheus 2.0 で改善された Staleness の取り扱いに関するセッションについて紹介させてもらおうと思います.
概要
スピーカー: Brian Brazil (Robust Perception)
ビデオ: https://youtu.be/GcTzd2CLH7I
スライド: https://www.slideshare.net/brianbrazil/staleness-and-isolation-in-prometheus-20-promcon-2017
Prometheus のコアデベロッパーかつ, Prometheus のコンサルタント会社 Robust Perception の創始者による Prometheus 2.0 で変更される Staleness の振る舞いについてのセッション.
NOTE: この記事で使われている画像は全て, スピーカーからの承諾を得た上で上記のスライドから引用しています.
内容
Staleness とは日本語に直訳すると腐敗という意味になりますが, Prometheus のコンテクストでは有効でなくなった time series を無視するための仕組みのことを意味します.
Prometheus v1 での Staleness の取り扱い
Prometheus v1 では range vector と instant vector のクエリ結果は次のようになります.
range vector: my_counter_total[10m]
のようなクエリの場合, クエリの実行時刻から 10m 前までの間のすべてのデータポイントが返る
instant vector: my_counter_total
のようなクエリの場合, クエリの実行時刻から最も近いデータポイントが返る. ただし, 5m 以上離れている場合は, どのデータポイントも返さない
理想的な Staleness の取り扱い
理想的には Staleness を次のように扱われるべきです.
- 監視対象がいなくなったら, そこから取得していた time series を stale とする
- v1 では上述した理由から 5m が経過するまで stale とならない
- 監視対象がメトリクスを返さなくなったら, その time series を stale とする
- v1 では上述した理由から 5m が経過するまで stale とならない
- 過去の timestamp を持つメトリクスを expose したい
- Pushgateway などで利用するため
- より長い eval/scrape 間隔をサポートしたい
- 今回の改善の対象外
どのように実現するか
stale であることを示すマーカーを各データポイントに仕込むことで staleness の取り扱いを改善しようとしています.
instant vector の場合, 最新のデータポイントにマーカーが仕込まれていれば, その time series を無視します.
range vector の場合, 対象のデータポイントの集合のうち, マーカーが仕込まれているものを除外します.
64bits の浮動小数点数では NaN (Not a Number) の fraction パートが非ゼロであるという仕様になっています. この fraction パートを特定の値にすることで, stale のマーカーが仕込まれていることを表現します.
このマーカーの導入により次のような結果が得られています.
- 監視対象がいなくなったら, そこから取得していた time series を stale としたい
- 解決している
- 監視対象がメトリクスを返さなくなったら, その time series を stale としたい
- 解決している
- 過去の timestamp を持つメトリクスを expose したい (Pushgateway などで利用するため)
- 解決しなかった (明示的な timestamp を持つデータは staleness のサポート対象外)
- より長い eval/scrape 間隔をサポートしたい
- 変化なし
まとめ
- 特別な NaN による stale マーカーの導入により, stale の取り扱いが改善されています
- マーカーは監視対象かその time series がなくなったときに挿入されます
- 明示的な timestamp とともに expose されたメトリクスでは staleness がサポートされません
- バックアップとして, 5m 間の lookback (v1 の staleness の取り扱い方) は適用されます