はじめに
prometheusは、データを永続的に保管する目的で使うのはあんまりよくないと書かれています。
If your local storage becomes corrupted for whatever reason, your best bet is to shut down Prometheus and remove the entire storage directory.
では永続的に保管するにはどうするかというと、remote writeというリモートストレージにデータを書き込む方法が提供されています。
対応しているリモートストレージの一覧がドキュメントに記載されています。 念のために列挙しますと以下の通りです。
- AppOptics: write
- Chronix: write
- Cortex: read and write
- CrateDB: read and write
- Gnocchi: write
- Graphite: write
- InfluxDB: read and write
- OpenTSDB: write
- PostgreSQL/TimescaleDB: read and write
- SignalFx: write
このうち、今回はInfluxDBを試してみました。
InfluxDB へ remote writeする
InfluxDBへremote write する方法は2つあります。
- prometheusが提供している remote_storage_adapterを利用する方法
- InfluxDBが対応している prometheusのremote write 向けAPIを利用する方法
使うとどのようになるのかをそれぞれ実験してみます。
prometheusが提供している remote_storage_adapterを使う方法
remote_storage_adapter というものがPrometheusオフィシャルで提供されているのでそれを利用します。
利用方法は オフィシャルに記載がある通りなのですが、
remote_storage_adapter をビルドし、 2つのオプション
- -influxdb-url=http://localhost:8086/
- -influxdb.database=prometheus
を指定して起動します(ここではローカルにInfluxDBが動いている前提で書かれています)。
./remote_storage_adapter -influxdb-url=http://localhost:8086/ -influxdb.database=prometheus
次に、prometheusのremote_write設定に remote_storage_adapter を指定します。
remote_write: - url: "http://localhost:9201/write"
この状態でPrometheusをreloadすると、InfluxDBにデータが送信され始めます。(remote_write_adapterはデフォルトでは9201番ポートをListenします)
- InfluxDBが提供しているAPIを利用する
InfluxDBのドキュメントに記載されている方法を利用します。
1つ目の方法と違い、PrometheusとInfluxDBのほかに用意する必要はありません。
prometheusのremote_write設定にInfluxDBを指定するだけで良いです。
remote_write: - url: "http://localhost:8086/api/v1/prom/write?db=prometheus"
この状態でPrometheusをreloadすると、InfluxDBにデータが送信され始めます。
remote_write されたデータを確認する
InfluxDB上のデータを確認してみます。
prometheusが提供している remote_storage_adapterを使う方法
$ influx > use prometheus > show series
とテーブルを見てみると、メトリック名でテーブルが作られているのがわかります。
> select * from tsdb_wal_fsync_duration_seconds name: tsdb_wal_fsync_duration_seconds time instance job quantile value ---- -------- --- -------- ----- 1513046600853000000 localhost:9090 prometheus 0.5 0.001505024 1513046600853000000 localhost:9090 prometheus 0.9 0.001505024 1513046600853000000 localhost:9090 prometheus 0.99 0.001505024 1513046615853000000 localhost:9090 prometheus 0.5 0.000018808 1513046615853000000 localhost:9090 prometheus 0.9 0.001161131 1513046615853000000 localhost:9090 prometheus 0.99 0.001161131 1513046630853000000 localhost:9090 prometheus 0.5 0.001161131 1513046630853000000 localhost:9090 prometheus 0.9 0.001505024 1513046630853000000 localhost:9090 prometheus 0.99 0.001505024 1513046645853000000 localhost:9090 prometheus 0.5 0.001161131 1513046645853000000 localhost:9090 prometheus 0.9 0.001505918 1513046645853000000 localhost:9090 prometheus 0.99 0.001505918 1513046660853000000 localhost:9090 prometheus 0.5 0.000883545 1513046660853000000 localhost:9090 prometheus 0.9 0.001505918 1513046660853000000 localhost:9090 prometheus 0.99 0.001505918 1513046675853000000 localhost:9090 prometheus 0.5 0.000801818 1513046675853000000 localhost:9090 prometheus 0.9 0.001505918
このように、ちゃんと15秒ごとにデータがたまっているのがわかります。
- InfluxDBが提供しているAPIを利用する
$ influx > use prometheus > show series
とテーブルを見てみると、_という名称でテーブルが作られているのがわかります。メトリック名はname に入っていますね。
> select * from _ where __name__='tsdb_wal_fsync_duration_seconds' name: _ time __name__ branch call code dialer_name endpoint event f64 goversion handler instance interval job le listener_name method quantile queue reason revision role rule_type scrape_job slice version ---- -------- ------ ---- ---- ----------- -------- ----- --- --------- ------- -------- -------- --- -- ------------- ------ -------- ----- ------ -------- ---- --------- ---------- ----- ------- 1512977394388000000 tsdb_wal_fsync_duration_seconds 0.001899241 localhost:9090 prometheus 0.5 1512977394388000000 tsdb_wal_fsync_duration_seconds 0.001899241 localhost:9090 prometheus 0.99 1512977394388000000 tsdb_wal_fsync_duration_seconds 0.001899241 localhost:9090 prometheus 0.9 1512977409388000000 tsdb_wal_fsync_duration_seconds 0.001188145 localhost:9090 prometheus 0.99 1512977409388000000 tsdb_wal_fsync_duration_seconds 0.001188145 localhost:9090 prometheus 0.9 1512977409388000000 tsdb_wal_fsync_duration_seconds 0.000020984 localhost:9090 prometheus 0.5 1512977424389000000 tsdb_wal_fsync_duration_seconds 0.001188145 localhost:9090 prometheus 0.9 1512977424389000000 tsdb_wal_fsync_duration_seconds 0.000938485 localhost:9090 prometheus 0.5 1512977424389000000 tsdb_wal_fsync_duration_seconds 0.001188145 localhost:9090 prometheus 0.99 1512977439388000000 tsdb_wal_fsync_duration_seconds 0.000938485 localhost:9090 prometheus 0.5 1512977439388000000 tsdb_wal_fsync_duration_seconds 0.001899241 localhost:9090 prometheus 0.99 1512977439388000000 tsdb_wal_fsync_duration_seconds 0.001899241 localhost:9090 prometheus 0.9 1512977454388000000 tsdb_wal_fsync_duration_seconds 0.001899241 localhost:9090 prometheus 0.99 1512977454388000000 tsdb_wal_fsync_duration_seconds 0.001899241 localhost:9090 prometheus 0.9 1512977454388000000 tsdb_wal_fsync_duration_seconds 0.000935074 localhost:9090 prometheus 0.5 1512977469389000000 tsdb_wal_fsync_duration_seconds 0.008376216 localhost:9090 prometheus 0.9 1512977469389000000 tsdb_wal_fsync_duration_seconds 0.000935074 localhost:9090 prometheus 0.5 1512977469389000000 tsdb_wal_fsync_duration_seconds 0.008376216 localhost:9090 prometheus 0.99
このように、ちゃんと15秒ごとにデータがたまっているのがわかります。 InfluxDBオフィシャルの実装を利用する場合は select * で検索すると残念な見た目になるので、ちゃんと 利用するタグを指定する必要がありそうです。
終わりに
Prometheusのremote write機能を利用してInfluxDBへデータを保存する方法を確認しました。
Prometheus側で用意した実装とInfluxDB側で用意した実装では、格納のされ方が違うので、互換性がないことがわかりました。どちらの方法を使うかはきちんと決めてから利用しましょう。