概要

時系列データベース InfluxDB の Ruby クライアント influxdb の簡単な使い方をメモしています。

influxdb-ruby 0.8.0

テスト環境の用意

Docker に公式のイメージが用意されているのでそれを使います。

docker run -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb

gem のインストールを行います。

gem install influxdb

使い方

データベースの作成や削除

require 'influxdb'

database = 'db1'

influxdb = InfluxDB::Client.new database
# 作成
influxdb.create_database(database)
# 削除
influxdb.delete_database(database)
# リスト
influxdb.list_databases

書き込み

name = 'foobar'
data = {
  values: { value: 0 },
  tags: { foo: 'bar', bar: 'baz' },
  timestamp: Time.now.to_i
}

influxdb.write_point(name, data)

# バッチ処理
data = [
  {
    series: 'foobar',
    values: { value: 1 },
    timestamp: Time.now.to_i
  },
  {
    series: 'foobar',
    values: { value: 2 },
    timestamp: Time.now.to_i
  }
]

influxdb.write_points(data)

アイテム保持ポリシー

一定期間経過した後に自動的にデータを削除する機能

# ポリシーの作成
database = 'db1'
name = '1h.cpu'
duration = '1h'
replication = 2

influxdb.create_retention_policy(name, database, duration, replication)

# ポリシーを使ったデータの書き込み
name = 'foobar'
data = { values: { value: 0 } }
retention = '1h.cpu'

influxdb.write_point(name, data, nil, retention)

# ポリシーの削除
influxdb.delete_retention_policy(name, database)

クエリ

influxdb.query 'select * from foobar'
# => [{"name"=>"foobar", "tags"=>nil, "values"=>[{"time"=>"2020-04-17T05:32:36Z", "bar"=>"baz", "foo"=>"bar", "value"=>0}]}]

# 特定のフィールドに四則演算した値を取得する
influxdb.query 'select ("value" + 2) * 3 from foobar'
# => [{"name"=>"foobar", "tags"=>nil, "values"=>[{"time"=>"2020-04-17T05:32:36Z", "bar"=>"baz", "foo"=>"bar", "value"=>6}]}]

# 非正規化されたデータを受け取る
influx.query 'select * from foobar', denormalize: false
# => [{"name"=>"foobar1", "columns"=>["time", "bar", "foo", "value"], "values"=>[["2020-04-17T05:32:36Z", "baz", "bar", 0]]}]