ども、cloudpackかっぱ (@inokara) です。

はじめに

時系列データベースのダークホース(自分の中では)InfluxDB って HTTP でデータ登録出来るよねって思って作ってみました。

鉄板

mruby で HTTP を扱うなら以下の mrbgems が鉄板かなと思っています。

GET や POST 等主なメソッドが使えるので大概のことはこの mrbgems で出来ると思います。

作ってます

やってること

  • post メソッドでデータを InfluxDB にポストします
  • get_metrics メソッドで InfluxDB からメトリクスを取得します

github

詳しくは README を御覧ください。

デモ

build_config.rb に以下を記述して make します。

MRuby::Build.new do |conf|
  conf.gem :git => 'https://github.com/inokappa/mruby-influxdb-client.git'
end

次に以下のようなスクリプトを用意します。

config = {
  :url  => "http://127.0.0.1:8086",
  :db   => "foo",
  :ua   => "mruby-influxdb-client",
  :user => "root",
  :pass => "root",
}

i = Influxdb::Client.new(config)

points = [ ARGV[0].to_f, ARGV[1].to_f, ARGV[2].to_f ]
query = "select * from Test_Metrics limit 1"

data = [{
  :name => "Test_Metrics",
  :columns => ["value1", "value2", "value3"],
  :points => [
  points
  ]
}]

  puts "request:  #{JSON::stringify(data)}"
  puts "response: #{i.post(data)["body"]}"

  puts "response: #{i.get_metrics(query).body}"

以下のように実行します。

/path/to/mruby /path/to/bin/test.rb `echo $RANDOM` `echo $RANDOM` `echo $RANDOM`

以下のように出力されます。

# ./mruby test.rb `echo $RANDOM` `echo $RANDOM` `echo $RANDOM`
request:  [{"name":"Test_Metrics","columns":["value1","value2","value3"],"points":[[32575.0,28913.0,17897.0]]}]
response:
response: [{"name":"Test_Metrics","columns":["time","sequence_number","value1","value2","value3"],"points":[[1418822788216,33410001,32575,28913,17897]]}]

作る過程のメモ

URL エンコード

InfluxDB でメトリクスデータを取得する際にクエリは URL エンコードする必要がありますが、mruby で URL エンコードを行う場合には mruby-http を利用しました。

mrbgems をインストールして以下のに書くだけで任意の文字列の URL エンコードした値が取得できました。

HTTP::URL::encode("hoge")

InfluxDB のインストール

インストールはとても簡単。(Ubuntu の場合)

wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
sudo dpkg -i influxdb_latest_amd64.deb

InfluxDB のちょっとした操作

データベースの作成。

curl -X POST 'http://localhost:8086/db?u=root&p=root'   -d '{"name": "foo"}'

データの登録。

curl -X POST -d '[{"name":"foo","columns":["val"],"points":[[23]]}]' 'http://localhost:8086/db/hoge/series?u=root&p=root'

データの取得。

curl -G 'http://localhost:8086/db/foo/series?u=root&p=root' --data-urlencode "q=select * from Disk_Used limit 1"

データの型はちゃんと指定してデータベースに登録必要があるようです…。

例えば、以下のようにデータを登録した場合には一見ちゃんと登録されているように見えますが….
mruby で InfluxDB のクライアントを作る: 動作確認

points = [ ARGV[0], ARGV[1], ARGV[2] ]
query = "select * from Test_Metrics limit 1"

data = [{
  :name => "Test_Metrics",
  :columns => ["value1", "value2", "value3"],
  :points => [
  points
  ]
  }]

なんかおかしい…引数で渡す値が文字列として解釈されている模様…。ちゃんと、以下のように数値としてデータを登録する必要があるようです。

points = [ ARGV[0].to_f, ARGV[1].to_f, ARGV[2].to_f ]
query = "select * from Test_Metrics limit 1"

data = [{
  :name => "Test_Metrics",
  :columns => ["value1", "value2", "value3"],
  :points => [
  points
  ]
  }]

まあ、ハマったのは自分だけなのかもしれませんが…。

Tasseo による可視化

InfluxDB には標準で登録されているデータをグラフとして表示してくれる機能を備えていますが、若干、貧弱な感じは否めませんので Tasseo というツールを利用してみたいと思います。

mruby で InfluxDB のクライアントを作る: Tasseoによる可視化
Rails で実装されていて Ruby の環境さえあれば bundle install でセットアップした後で以下のような JSON 形式のファイルを用意すればすぐに利用することが出来ます。

# cd /path/to/tasseo
# cat << EOT > dashboards/hoge.js
var metrics =
[
  {
    target: "value1",
    series: "Test_Metrics",
    scale: true
  },
  {
    target: "value2",
    series: "Test_Metrics",
    scale: true
  },
  {
    target: "value3",
    series: "Test_Metrics",
    scale: true
  },
];
EOT
foreman start

ということで…

mruby-httprequestmruby-json を利用すれば mruby の HTTP API クライアントは簡単に実装出来る!(かも!)という一例でございました!

元記事はこちらです。
mruby で InfluxDB のクライアントっぽいのを作っているメモ