ども、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"
データの型はちゃんと指定してデータベースに登録必要があるようです…。
例えば、以下のようにデータを登録した場合には一見ちゃんと登録されているように見えますが….
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 というツールを利用してみたいと思います。
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-httprequest と mruby-json を利用すれば mruby の HTTP API クライアントは簡単に実装出来る!(かも!)という一例でございました!
元記事はこちらです。
「mruby で InfluxDB のクライアントっぽいのを作っているメモ」