ElasticSearchとKibana



## ElasticSearchとは

Elasticsearchは、割と設定とかが簡単で使いやすい全文検索エンジンで、内部でJava実装のLuceneを利用している。
http://www.elasticsearch.org/overview/elasticsearch

Kibana連携の際は、単に検索というより、可視化したいデータを高速にフィルタリングして集計する用途で使われていると思ったほうが良い感じ。

### ElasticSearchのインストール

```bash
brew install elasticsearch
```

## Kibanaとは

ElasticSearch社が提供している、ログデータの可視化ツール。Apatchなどのシステムログを用いる例ばっかりWeb上で見つかるが、別に検索のクエリログやWebサイトの行動ログだってちゃんと入れて設定すれば使える。

### Kibanaのインストール

ElasticSearchのプラグインとしてインストール

```bash
plugin -i elasticsearch/kibana
```

(現在は`kibana3`としなくても、Kibana3が標準でインストールされる。package.jsonみたら`3.0.0pre-milestone5`バージョンがインストールされていた。)

## とりあえずここまででKibanaを見てみる

http://localhost:9200/_plugin/kibana にアクセス

何かバージョンが古いよみたいなこと言われるけど、気にしないで使える。

![kibana1.png](https://qiita-image-store.s3.amazonaws.com/0/6664/798ee1d4-5648-e0eb-8c94-5bec93bef9bc.png "kibana1.png")

![kibana2.png](https://qiita-image-store.s3.amazonaws.com/0/6664/024a6aca-31fa-fa15-3eaf-19f78babfdbb.png "kibana2.png")

こうすると、Elasticsearch自身のログを使ってサンプルダッシュボードを表示してくれるため、ElasticSearchを使ってインデックスを作ってみたりしていれば何かが表示されるはず。

Kibanaに関しては、他に何が出来るかなどの公式情報が全然ない。Demoや本番でWebUIで使いつつカスタマイズしていく感じ。

Kibanaで表示できるパネルの種類などは日本語では以下のページがよくまとまっていた。

- http://blog.johtani.info/blog/2013/06/19/introduction-kibana3/


ここにも書いてあるけど、カスタマイズ後に保存を忘れないように！

## Fluentdとは

色んな所からログを集めてきて、必要な部分を必要なところに、出来る限り失敗しないように出力するツール

公式のページの図がわかりやすいので引用

> ![fluentd](http://docs.fluentd.org/images/fluentd-architecture.png)
> http://docs.fluentd.org/ja/articles/quickstart


基本的な、入力元や出力先の設定方法は以下を参照
http://docs.fluentd.org/ja/articles/config-file
(リンクをたどっててエラーになる場合はjaをenに変えると読めます)

### Fluentd(td-agent)のインストール

```bash
brew install "http://toolbelt.treasuredata.com/brew/td-agent.rb"
```

fluentdとか言いながらtd-agentって出てくるけど、この2つの関係性ってなんなの？
って思うはず。

td-agentは

>Fluentd安定版の配布パッケージ

らしい。
とりあえずは、まぁtd-agent使っとけばfluentdなんだなと思っておいて大丈夫。

詳しくは以下の2つのリンク参照

- http://docs.fluentd.org/ja/articles/install-by-homebrew
- http://docs.fluentd.org/ja/articles/faq#what-are-the-differences-between-td-agent-and-fluentd



## FluentdによりKibana可視化用データを挿入

Elasticsearchを使ってKibanaで可視化する(外国)人は、普通、ログの収集にLogstashというのを使う。が、日本ではFluentdが人気。開発陣に日本人が多いから日本語のドキュメントやサポートが豊富なことが理由なんだろう。
ちなみにLogstashが普通な理由は、Kibana, ElasticSearch, Logstashは全て同じ人たちが開発しているから。ただ、ここの人たちはデモは作るけどドキュメントは(サポートでお金をとっているからか)わりと適当な傾向がある気がする。

自分の場合は、正直どっちでも良かったのだが、そもそもTDでAnalyzeしたデータを可視化したいという欲求があったため、日本人の主流に乗ることにした。

### ElasticSearch+Kibana+Fluentd連携

ElasticSearch+Kibana+Fluentd連携の記事はいくつもあるけど、公式ドキュメントは以下

- http://docs.fluentd.org/ja/articles/free-alternative-to-splunk-by-fluentd


#### Fluentd, Elasticearch連携用Fluentdプラグインのインストール

https://github.com/uken/fluent-plugin-elasticsearch

```bash
gem install fluentd fluent-plugin-elasticsearch
```

とドキュメントには書いてあるけれど、これでインストールされる場所はfluentdの起動時に読み込まれるgemの空間と違う可能性があるので以下のようにするのがオススメ。

```bash
/usr/local/bin/fluent-gem install fluentd  fluent-plugin-elasticsearch
```

こうしないと自分は以下の様なエラーが出た。

```
config error file="/usr/local/etc/td-agent/td-agent.conf" error="Unknown output plugin 'elasticsearch'. Run 'gem search -rd fluent-plugin' to find plugins"
```


### RailsAppからのログデータの送り方

Rubyのプログラムからは、[td-logger](https://github.com/treasure-data/td-logger-ruby) gemを使うと、データをTreasure Dataに送ることが出来る。
この時デフォルトだとtd-agentを使わないが、これを使うようにすることも出来る。（ドキュメント上ではIndirectUploadと言われている方法）ここらへんの設定は、http://docs.treasuredata.com/articles/rails に詳しい。
なお、Herokuを使っていてtd-agentを使いたい場合はHeroku上に別アプリケーションとしてtd-agent用のプロセスを建てることになる。( http://docs.treasuredata.com/articles/heroku-rails )

このようにtd-agentを利用することにより、TDに送るデータをElasticSearchにも同時に送る事ができるようになる。

ローカル用の`td-agent.conf`の設定は以下: (linux系だったら`/usr/local`のプレフィックスを取ると良いはず)

```/usr/local/etc/td-agent/td-agent.conf 
<source>
  type forward
  port 24224
</source>
<match td.*.*>
  type copy
  <store>
    type tdlog
    apikey [YOUR_API_KEY]
    auto_create_table
    buffer_type file
    buffer_path /usr/local/var/log/td-agent/buffer/td
    use_ssl true
  </store>
  <store>
    type elasticsearch
    logstash_format true
    include_tag_key true
    tag_key _key
    # id_key user_id
    # host localhost
    # port 9200
  </store>
  flush_interval 10s
</match>
```

この時、TDとElasticSearchの両方に同時に送るためにcopyアウトプットプラグインを利用している。
http://docs.fluentd.org/en/articles/out_copy

#### type elasticseachの時に指定できるパラメータ

- `logstash_format`: trueにすると、Kibanaが想定しているlogstash形式でログの時間情報を入れる
 - Timestampのインデックスの粒度を変えたい場合は、http://y-ken.hatenablog.com/entry/fluentd-elasticsearch-kibana-index-partitioning を参考に`logstash_dateformat`も指定する
- `include_tag_key`: matchで指定している部分のtag名をデータに含めるかどうか 
- `tag_key`: `include_tag_key`の場合、その時のキーの名前は何にするかを指定
- `id_key`: どのフィールドをelasticseachの`_id`として使うのか指定。指定しないとランダムになる
- `host`: elasticsearchのホスト(default: localhost)
- `port`: elasticsearchのポート(default: 9200)

細かいことは解説を読むより以下のコードを読むほうがはやい。
https://github.com/uken/fluent-plugin-elasticsearch/blob/master/lib/fluent/plugin/out_elasticsearch.rb

### td-agentを起動

```bash
ln -sfv /usr/local/opt/td-agent/homebrew.mxcl.td-agent.plist ~/Library/LaunchAgents/.
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.td-agent.plist
```

起動しているか確認：

```bash
ps aux | grep 'td-agent'
```

起動していなかったら、

```bash
tail /usr/local/var/log/td-agent/td-agent.log
```

を見てみると良い。

## その他、参考になったリンク

TD Queryの結果を別のTDのテーブルに入れる方法
http://docs.treasuredata.com/articles/result-into-td