CSVで吐かれるリソース情報をelasticsearch, kibanaでグラフ化する

CSVで吐かれるリソース情報を週次でグラフ化する必要があったんだけど、毎週Excel開いてグラフ作るのはだるいので、ログ可視化周りでデファクトスタンダードになっているっぽいelasticsearch, kibanaでグラフ化することにした。

手順は次の通り。

  1. elasticsearch, kibana環境を準備する
  2. リソース情報CSVをBulk API対応のJSONに変換する
  3. リソース情報JSONをelasticsearchにバルクインポートする
  4. kibanaでインポート結果を確認する
  5. kibanaでグラフを作成する

1. elasticsearch, kibana環境を準備する

環境構築は切り出してこっちに書いた。

2. リソース情報CSVをBulk API対応のJSONに変換する

今回、リソース情報CSVとして適当に作成したダミーファイルは以下の通り 日付はelasticsearchのDate型にあわせないといけない。 最初作ったダミーファイルの日付は「DD-MM-YYYY」の形式だったんだけど、これだとelasticsearchが日付と認識してくれなかった。

# memory.csv
Date,memory
2015-01-01,10
2015-01-02,11
2015-01-03,12
2015-01-04,13
2015-01-05,14
2015-01-06,15
2015-01-07,16
2015-01-08,17
2015-01-09,18
2015-01-10,19
2015-01-11,20
2015-01-12,21
2015-01-13,22
2015-01-14,23
2015-01-15,24
2015-01-16,25
2015-01-17,26
2015-01-18,27
2015-01-19,28
2015-01-20,29
2015-01-21,30
2015-01-22,31
2015-01-23,32
2015-01-24,33
2015-01-25,34
2015-01-26,35
2015-01-27,36
2015-01-28,37
2015-01-29,38
2015-01-30,39
2015-01-31,40
2015-02-01,41
2015-02-02,42
2015-02-03,43
2015-02-04,44
2015-02-05,45
2015-02-06,46
2015-02-07,46
2015-02-08,46
2015-02-09,46
2015-02-10,46
2015-02-11,46
2015-02-12,46
2015-02-13,46
2015-02-14,46
2015-02-15,46
2015-02-16,46
2015-02-17,46
2015-02-18,46
2015-02-19,46
2015-02-20,46
2015-02-21,46
2015-02-22,46
2015-02-23,46
2015-02-24,46
2015-02-25,46
2015-02-26,46
2015-02-27,46
2015-02-28,46
2015-03-01,46
2015-03-02,46
2015-03-03,46
2015-03-04,46
2015-03-05,46
2015-03-06,46
2015-03-07,46
2015-03-08,46
2015-03-09,46
2015-03-10,46
2015-03-11,46
2015-03-12,46
2015-03-13,46
2015-03-14,46
2015-03-15,46
2015-03-16,46
2015-03-17,46
2015-03-18,46
2015-03-19,46
2015-03-20,46
2015-03-21,46
2015-03-22,46
2015-03-23,46
2015-03-24,46
2015-03-25,46
2015-03-26,46
2015-03-27,46
2015-03-28,46
2015-03-29,46
2015-03-30,46
2015-03-31,46
2015-04-01,46

これをBulk API対応のJSONに変換する。 ポイントは、普通に変換するだけだと数値が文字列に変換されてしまう(""がついちゃう)ので、数値だったら数値として変換する必要があるということ。 Qiitaに掲載のスクリプトを参考に、以下の通りスクリプトを作成した。

参考

以下のコマンドを実行してmemory.csvをmemory.jsonに変換する。

cat memory.csv | ./csv2esjson.rb > memory.json

こんな感じになるはず。memoryの値に""がないので、数値として変換されているのがわかる。

"index":{"_index":"test","_type":"type1","_id":"bc171ba7-cffa-4b47-a763-1071c758e59b"}}
{"Date":"2015-01-01","memory":10}
{"index":{"_index":"test","_type":"type1","_id":"ddb85e8e-4933-4579-8aff-05073e14f201"}}
{"Date":"2015-01-02","memory":11}
{"index":{"_index":"test","_type":"type1","_id":"c9053988-cffe-47af-9bd0-82ee664dd047"}}
{"Date":"2015-01-03","memory":12}

3. リソース情報JSONをelasticsearchにバルクインポートする

curl -s -XPOST localhost:9200/_bulk --data-binary @memory.json

4. kibanaでインポート結果を確認する

http://localhost:5601にアクセスすると「Configure an index pattern」という画面になる。
「Index contains time-based events」にチェックした上で、「Index name or pattern」に「test」と入力する。
testはjsonの_indexで指定した値。うまくいっていれば、ちょっと待つと「Create」というボタンが表示される。
「Time-field name」には「Date」と表示されているはず。
ここに何も表示されていなかったら、それは日付型の指定がうまくいっていないということだと思う。
「Create」を押す。Fieldsで、「Date」のtypeが「date」, 「memory」のtypeが「number」になっていることを確認する。

5. kibanaでグラフを作成する

「Discover」タブを押す。「No results found」と表示されるが、それは表示範囲が直近15分だから。
右上の「Last 15 minutes」を変更するとグラフが表示されるはず。
その後は「Visualize」タブを押して、任意のグラフを作成する。 スケールの変更もGUIで簡単にできるし、ここは問題ないと思う。