このエントリーをはてなブックマークに追加

prometheusをkinesis firehose経由でs3にバックアップ

AlpacaJapanのshirouです。

prometheusは長期保存用ではないため、適当な間隔で消されていきます。本来であればinfluxdbなりに保存するのでしょうが、やはり安全安心のS3に保存しておきたいところです。

手法としてS3バケットに直接書き込むなどの方法が考えられますが、S3は更新には弱いのでがんがん書き込む用途には向いていません。

そこで、2017年7月に東京リージョンに来たkinesis firehoseを使います。kinesisはstream用途ですので、がんがん書き込んでも問題ありませんし、そのデータはfirehoseで自動的にS3に保存されていきます。

ということで、prometheusのremote write機能を利用し、kinesisに送りつけるremote integrationを実装しました。

なお、まだ実稼働はしていないので、問題があるかもしれません。ご了承ください。

prometheus_remote_kinesis

https://github.com/shirou/prometheus_remote_kinesis

使い方

goでのbuildが必要ですが、割愛します。Dockerでのmulti stage buildを使うと簡単です。

$ prometheus_remote_kinesis --stream-name prometheus-backup
-stream-name kinesis stream 名(必須)
-listen-addr listenアドレス。指定しないと:9501となる。

もちろん、AWSのcredentialを設定しておきましょう。

docker hubにも置いておきました。

https://hub.docker.com/r/shirou/prometheus_remote_kinesis/

こんな感じで起動すれば良いと思います。

docker run -d --rm --name remote_kinesis \
   -p 9501:9501 \
   -e STREAM_NAME=backup-prometheus-log \
   shirou/prometheus_remote_kinesis

prometheus側の設定

prometheus.ymlremote write設定を以下のようにします。urlの前に-をつけてSequenceにすることが大事です。

remote_write:
  - url: http://localhost:9501/receive

kinesisおよびkinesis forehoseの設定は割愛します。

以上で設定は終わりです。あとは時間が立てばs3にどんどん溜まっていくはずです。

内部仕様

JSONフォーマット

kinesisに送るデータはこんな感じのJSONフォーマットにしました。

{
  "name": "scrape_duration_seconds",
  "time": 1513264725773,
  "value": 0.004345524,
  "labels": {
    "__name__": "scrape_duration_seconds",
    "instance": "localhost:9090",
    "job": "prometheus",
    "monitor": "monitor"
  }
}

prometheusのTimeseriesではひとつのmetricに対して複数のSampleが保存できるようになっています。しかし、あまり階層を増やしたくないので、flattenして、ひとつのsampleごとにひとつのrecordを作成するようにしています。labelはさすがに無理でしたのでmap上になっています。さらに、AthenaやS3SELECTからの利用も想定し、改行を付与したJSON-LDにしています。さらにgzip圧縮した状態でkinesisに送信しようとしたのですが、t2.smallではCPUを使いすぎてしまったので、外しました。そのうちなんとかしようかな、と。また、500レコードごとにまとめてPutRecordsで送信しています。バッファリングしていることになるので、死ぬと失われる可能性があります。gracefulshutdownは一応しているんですけどね。

prometheusからのwrite requestはsnappy圧縮 + protobufで来るので、そのバイト列のままkinesisに転送すると最速かもしれませんが、さすがにそれは後々の扱いが難しくなるだろうということで今回は避けておきます。

まとめ

prometheusの長期ログ保存用にAWS Kinesis経由でs3に貯めるremote storage integrationを作成しました。

実稼働はまだなので問題はあるかもしれませんが、これでS3に貯めることはできるようになりました。問題は取り出す時ですが、平易なJSON形式ですので、必要になった時にがつっと変換すればいけるのではないかな、と思います。remote readでprometheusから直接読むことも可能ですが、おそらく実用上の速度はでないのではないかと思います。

あ、AlpacaJapanではこのあたりをしてくれる人を絶賛募集中です。Twitter @r_rudiまでご連絡ください。