Fluentd, ElasticSearch, KibanaでKPIログを可視化する


install手順や基本設定は割愛します.
KPIログを可視化する上で必要な主にKibanaの使い方メモです.

# Goal

* KPIとなる指標をログ出力し、Kibanaで可視化する
* アプリケーション => fluentd => elasticsearch <- kibana
* KPIは複数設定され、指標はそれぞれ異なるため、KPIの種類によってデータ構造が変更できなければいけない
* 1つのKPIを様々な軸で集計可能にしたい

## ログ送信

今回はfluent-logger-rubyを使う.
https://github.com/fluent/fluent-logger-ruby

簡単に以下のようにログを送信します.

```ruby
log = Fluent::Logger::FluentLogger.new(nil, host: 'localhost', port: 24224)

log.post("kpi.user_login", {user_id: user_id, user_email: user_email})
log.post("kpi.user_register", {user_id: user_id, user_email: user_email})
```

## Fluentd Out

fluent-plugin-elasticsearchを使ってelasticsearchにstoreする.
https://github.com/uken/fluent-plugin-elasticsearch

```/etc/td-agent/td-agent.conf
<match kpi.user_register>
  type copy
  <store>
    type elasticsearch
    
    index_name kpi
    type_name user_register
    
    include_tag_key true
    tag_key @log_name
    
    host localhost
    port 9200
    
    logstash_format true
    logstash_prefix kpi.user_register
    
    flush_interval 3s
  </store>

  <store>
    type file
    path /var/log/td-agent/kpi.user_register.log
  </store>
</match>

<match kpi.user_login>
  type copy
  <store>
    type elasticsearch
    
    index_name kpi
    type_name user_login
    
    include_tag_key true
    tag_key @log_name
    
    host localhost
    port 9200
    
    logstash_format true
    logstash_prefix kpi.user_login
    
    flush_interval 3s
  </store>

  <store>
    type file
    path /var/log/td-agent/kpi.user_login.log
  </store>
</match>
```

logstash_format trueにしないとkibanaが想定した形にならない.
logstash_prefixを指定しないと、user_registerもuser_loginも同じindexに同じスキーマでつっこまれる.
デバッグにも使えるのでtype copyでelasticsearch以外にも別fileに書き出しておくと便利.

## ElasticSearch

elasticsearchにデータが投入されていることを、headプラグインなどで確認.

![スクリーンショット 2015-08-24 21.54.08.png](https://qiita-image-store.s3.amazonaws.com/0/36978/25f57234-6977-9cf4-cff1-c7b65ea5bf77.png "スクリーンショット 2015-08-24 21.54.08.png")

kpi.user_login-YYYY.MM.DD
kpi.user_register-YYYY.MM.DD
といった名前のindexが日毎に作成される.

日付がかわると新規indexになるが、このときjsonデータがかわるとスキーマがかわってしまい、kibanaダッシュボードで使われている属性が変更削除されているとダッシュボードも見れなくなるので注意.

logstashの日付の粒度変更したい場合、以下の記事参考になりそうです.
http://y-ken.hatenablog.com/entry/fluentd-elasticsearch-kibana-index-partitioning

![スクリーンショット 2015-08-24 21.58.26.png](https://qiita-image-store.s3.amazonaws.com/0/36978/44dcd844-df05-3385-69fb-9ecd26148719.png "スクリーンショット 2015-08-24 21.58.26.png")

headプラグインのBrowserタブで、index/typeを指定するとデータが確認できるので、スキーマがうまく作れてるかなど簡単に確認できる.

## Kibana

### Index登録

Settings > Indicesでelasticsearchに作成されたindexを指定して保存する.
日付部分はワイルドカードで.
※Indicesはindexの複数形です!

![スクリーンショット 2015-08-24 22.00.10.png](https://qiita-image-store.s3.amazonaws.com/0/36978/9f8bce91-a46e-4436-a672-1c9cf537aed0.png "スクリーンショット 2015-08-24 22.00.10.png")

### Search条件登録

Discoverタブに遷移. 左上に表示されるIndexワイルドカード名のプルダウンを開くと別のindexを選択できるので、ここでindexをざっくり選んで、一番上バーに"*"とだけなってるエリアに検索条件を指定することでさらに絞りこみが可能（今回は全件取得）.
右上のSave Searchボタンで検索名をつけて保存する.

![スクリーンショット 2015-08-24 22.06.24.png](https://qiita-image-store.s3.amazonaws.com/0/36978/299c3bb5-43f1-d047-4e22-de8fe11c9954.png "スクリーンショット 2015-08-24 22.06.24.png")

作成した検索条件は、Settings > Objects > Searchesで確認できる.

![スクリーンショット 2015-08-24 22.16.27.png](https://qiita-image-store.s3.amazonaws.com/0/36978/72e16687-a0af-6409-8cd0-b5e7926db8f4.png "スクリーンショット 2015-08-24 22.16.27.png")

### 可視化ルール登録

(Step1)Vertical Bar Chartを選んで、(Step2)From a saved search（さっき作成した検索条件）を選ぶ.

![スクリーンショット 2015-08-24 22.18.23.png](https://qiita-image-store.s3.amazonaws.com/0/36978/3d6de2ad-4c7c-04dd-7a6a-d5f1b903b1eb.png "スクリーンショット 2015-08-24 22.18.23.png")

Y-Axis: countとすると、単純にログの総数がY軸の値になる.
X-Axis: Aggregation=Date Histogramとすると、X軸を@timestampで並べる.
再生ボタンを押すとグラフプレビューが更新される.
グラフがおかしければ右上の時間範囲を確認する.

![スクリーンショット 2015-08-24 22.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/36978/f2c53690-86ea-578b-e9b0-b1a71604f0d5.png "スクリーンショット 2015-08-24 22.21.02.png")

Search条件登録したときのようにVisualizeも右上のボタンから名前をつけて保存しておく.
他にもユーザ属性があればもちろん円グラフで比率を監視することも可能.

### ダッシュボード登録

右上の＋ボタンでVisualizeを選んで好きな位置に配置する.
同じ要領でダッシュボード名をつけて保存する.

![スクリーンショット 2015-08-24 22.41.46.png](https://qiita-image-store.s3.amazonaws.com/0/36978/96c7e7ae-2636-a253-be56-75b25ccf21ea.png "スクリーンショット 2015-08-24 22.41.46.png")

# References

* http://inokara.hateblo.jp/entry/2013/11/30/104023
* http://www.fluentd.org/guides/recipes/elasticsearch-and-s3
* http://shiro-16.hatenablog.com/entry/2014/11/30/214439
* https://github.com/uken/fluent-plugin-elasticsearch
* http://y-ken.hatenablog.com/entry/fluentd-elasticsearch-kibana-index-partitioning