prometheusで収集したメトリクスをinfluxdbでダウンサンプリングして保存する


概要

「先月、去年のメトリクスはどうだったか確認したい」と思ってprometheusでの保存期間を伸ばすとメモリが圧迫される...
→ influxdbを使ってダウンサンプリングしてメトリクスを長期保存してみる!!!

手順

influxdb

※influxdb自体の構築手順ははぶきます

1. influxのCLIを起動

influx

2. prometheus用のDBを作成する

CREATE DATABASE prometheus

3. Retention Policyを作成する

ここでは1時間保存と30日保存のPolicyを作成してみます。
また、デフォルトで存在する「autogen」を削除しておきます。

CREATE RETENTION POLICY rp_1h ON prometheus DURATION 1h REPLICATION 1 DEFAULT;

CREATE RETENTION POLICY rp_30d ON prometheus DURATION 30d REPLICATION 1;

DROP RETENTION POLICY autogen ON prometheus;

SHOW RETENTION POLICIES;

rp_1hDEFAULTを付与していますが、こうすることでpromehteusから書き込まれたメトリクスはまずrp_1hに保存されます

4. Continuous Queryを作成する

rp_1hをダウンサンプリングしてrp_30dに保存するためのQueryを作成してみます。

CREATE CONTINUOUS QUERY cq_sample ON prometheus
BEGIN
  SELECT max(value) as value
  INTO rp_30d.<metrics_name>
  FROM <metrics_name>
  GROUP BY time(1h), *
END

SHOW CONTINUOUS QUERIES;

*の部分はタグに置き換えることも可能です
(そっちの方がデータ量減らせていいかも🤔)

prometheus

データをinfluxdbに書き込み、読み込みもinfluxdbから行うように設定をします
※localhost部分は環境によって置き換えてください🙇‍♂️

prometheus.yml
remote_write:
  - url: "http://localhost:8086/api/v1/prom/write?db=prometheus"
remote_read:
  - url: "http://localhost:8086/api/v1/prom/read?db=prometheus"
  - url: "http://localhost:8086/api/v1/prom/read?db=prometheus&rp=rp_30d"

上記の例では2つのRetention Policyを同時に参照できるようにしています。
CQにおいて違うメトリクス名でinsertしないと多重カウントしてしまう恐れがあるので注意です💦

Done

これで構築完了!
あとはGrafana等でPrometheusを可視化すればOK!