Prometheus -> InfluxDB でダウンサンプリングしてみたメモ

半年くらい前に社内の勉強会っぽい何かで話すために書いていたけど結局やらずにお蔵入りしたメモ。

半年くらい前なのでわりと古いです


Prometheus は単体だとダウンサンプリングができないので長期のデータ保持には向いていません。デフォルトだと 15 日しか保持しないし、もっと長期に渡って保持するように設定すると凄まじい量のストレージを喰います。

他のリソース監視・可視化ツールであれば、5 分毎のデータを 1 日保持、30 分毎のデータを 1 週間保持、2 時間毎のデータを 1 ヶ月保持、1 日ごとのデータを 1 年間保持、のように段階的に粒度を荒くしたデータを長期に保持できるようになっていたりします。

Prometheus の場合、データの粒度と保持期間が異なる別の Prometheus を用意して Prometheus -> Prometheus とデータを流したり(Federation)、Prometheus から別の時系列データベースにデータを書き込んだりすることで(Remote write)、ダウンサンプリングっぽいことができます。

そこで、試しに社内のいくつかのサーバを監視している Prometheus のメトリクスを InfluxDB に流してダウンサンプリングしてみました。

remote_storage_adapter (remote_storage_bridge) のインストール

以前セットアップしたときは remote_storage_bridge というものが必要だったんですが、今は remote_storage_adapter という名前に変わってました。たぶん次のような感じでビルドできます(別にビルドに Docker を使う必要は無いですが)。

docker run --rm -v /usr/local/bin:/go/bin:rw golang \
  go get github.com/prometheus/prometheus/documentation/examples/remote_storage/remote_storage_adapter

remote_storage_bridge の起動やら Prometheus の設定とか InfluxDB のセットアップとかは別記事に簡単に書いています。

グラフ

1 時間毎のデータを 1 ヶ月保持したものです。

f:id:ngyuki:20171114204706p:plain

ダウンサンプリングの前後の比較です。上のグラフがダウンサンプリング前の 1 分毎のデータ、下のグラフがダウンサンプリング後の 1 時間毎のグラフです。ダウンサンプリングには平均値を使っています。メトリクスの種類によっては最大値とかのが良いかも?

f:id:ngyuki:20171114204639p:plain

さいごに

大抵の場合は Prometheus のデフォルトの 15 日で十分な気がするのですが、たまに長期の傾向が知りたいことあります(1 年間を通して見て、あーこの時期はあれがあったわー、とか)。

今は、短期グラフのために Prometheus を、長期グラフのために Cacti を併用していたりするのですが・・・

Prometheus -> InfluxDB でダウンサンプリングする場合、InfluxDB の保持期間ごとに Grafana で別々にグラフを作る必要があってちょっと面倒な感じもしました(Cacti・・というか RRDTool ならデータを取得する期間に応じて自動的に適切な粒度を拾ってきてくれる)。が、そもそも短期と長期でグラフをみるきっかけ違うし、そんなには困らないかな?

長期グラフを見ているときに特定の期間にドリルダウンしても短期グラフに変わらないのが不便かも・・

テンプレート変数でどうにかするものなのだろうか。