Debian(Wheezy)にfluentdとElasticsearchとKibanaを導入する

#はじめに
Debian(Wheezy)にfluentdとElasticsearchを導入して、Kibanaするまで。
まずはApacheのログをKibanaで見るところまでやってみる。
[こちら](http://blog.hrendoh.com/how-to-install-fluentd-elasticsearch-and-kibana4/)の記事がよくまとまっているので、ベースはこちらを参考に実施した。

fluentdに関しては[こちら](http://qiita.com/shuntaro_tamura/items/e897cdc8a155cfcf9da7)を参照するといいかも。結構イメージが湧く。
全体的な流れは[こちら](http://qiita.com/kasaharu/items/b36c3c4fcd3dd969f544)を参考にした。

#準備
##fluentd(td-agent)の導入
~~[こちら](http://sweng.web.fc2.com/ja/software/fluentd/install-on-debian-wheezy.html)の記事が一番わかりやすいので、こちらを参考にして導入した。
ポイントはバージョンですな。
fluentd(td-agent)は1.1.17-1を利用する。
libsslは0.9.8を利用する。
導入が完了したらコマンド叩いて動いているか確認する。~~

追記：2015/11/05にtd-agent v2のインストール方法を記載しました。
こちらのほうが断然に簡単なので、そちらを参照してください。

##Elasticsearchの導入

###OpenJDK7
前準備としてOpenJDK7が必要なのでインストールする。
既に導入済みかどうかは`dpkg -l openjdk*`などで確認可能。
導入が完了したらバージョンを確認する。

```bash
hoge@fuga:~# java -version
java version "1.6.0_36"
OpenJDK Runtime Environment (IcedTea6 1.13.8) (6b36-1.13.8-1~deb7u1)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
```

上記のように違うバージョンが動作している場合には[こちら](http://symfoware.blog68.fc2.com/blog-entry-1166.html)の情報を参考にして、JVMの切り替えを行う。
`update-java-alternatives -s java-1.7.0-openjdk-amd64`のように1.7.0を指定して、再度確認する。
update-java-alternatives自体が使えない場合には、`apt-get install java-common`でインストールを行う。
切り替え時に「mozilla-javaplugin.so の alternatives がありません」という表示が出るが問題があるのか不明。（未調査）

```bash
hoge@fuga:~# java -version
java version "1.7.0_85"
OpenJDK Runtime Environment (IcedTea 2.6.1) (7u85-2.6.1-6~deb7u1)
OpenJDK 64-Bit Server VM (build 24.85-b03, mixed mode)
```

となっていればOK。

###Elasticsearch
[公式情報](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html)と、[こちら](http://symfoware.blog68.fc2.com/blog-entry-1540.html)を参考にして、apt-getでインストールする。
インストールが完了したらElasticsearchを起動してみる。

```bash
hoge@fuga:~# /etc/init.d/elasticsearch start
[ ok ] Starting Elasticsearch Server:.
```

実際に動作しているかを確認するにはcurlコマンドでレスポンスを確認してみる。
下記のようにレスポンスが返ってくれば動いている。

```bash
hoge@fuga:~# curl http://localhost:9200
{
  "name" : "Typhon",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.0.0",
    "build_hash" : "de54438d6af8f9340d50c5c786151783ce7d6be5",
    "build_timestamp" : "2015-10-22T08:09:48Z",
    "build_snapshot" : false,
    "lucene_version" : "5.2.1"
  },
  "tagline" : "You Know, for Search"
}
```

##Kibanaの導入
[こちら](http://blog.hrendoh.com/how-to-install-fluentd-elasticsearch-and-kibana4/)を参考にインストールする。
記事作成時の最新はKibana4.2.0。

起動スクリプトは[こちら](https://github.com/Xaway/script/blob/master/init_kibana)をベースにDebian(Wheezy)でも動くように修正した。
ポイントは/etc/init.d/functionsの場所が違う点。（詳細は[こちら](http://backyard.hatenablog.com/entry/20131003/1380765021))
あとはkillprocの処理方法を変更した。（詳細は[こちら](http://hogespace.hatenablog.jp/entry/2013/06/13/222637))

元のスクリプトではプロセスが停止しない＆pidファイルを削除していないので、停止しないを解決しても二度目の起動でpidfileが残っていて起動しない。
プロセスが停止したことを確認してpidfileとlockfileの両方を消すようにした。

```bash:/etc/init.d/kibana
#!/bin/sh
#
# kibana -- startup script for kibana4
#
# chkconfig: - 85 15
# processname: kibana
# pidfile: /var/run/kibana.pid
# description: Kibana is a webui to visualize data
#
### BEGIN INIT INFO
# Provides: kibana
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop kibana
### END INIT INFO
#
#
. /lib/lsb/init-functions

PIDFILE="/var/run/kibana.pid"
LOCKFILE="/var/lock/subsys/kibana"
KIBANA_DIR="/opt/kibana/"

start() {
        echo -n "Starting Kibana Daemon: "
        if [ -f $PIDFILE ]; then
                PID=`cat $PIDFILE`
                echo Kibana already running: $PID
                exit 1;
        else
                cd $KIBANA_DIR
                PID=`./bin/kibana >/dev/null 2>&1 & echo $! > $PIDFILE`
                echo `cat $PIDFILE`
        fi

}

stop() {
        echo -n "Shutting down Kibana Daemon: "
        echo
        killproc -p $PIDFILE
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f $LOCKFILE $PIDFILE
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status kibana
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $?
```

#apacheログを見てみる
仕上げにapacheのログをfluentd→Elasticsearchに渡して、Kibanaで見られるようにする。
[こちら](http://blog.hrendoh.com/how-to-install-fluentd-elasticsearch-and-kibana4/#Apache)の設定を行う。
/etc/td-agent/td-agent.confの設定を実施した後に、td-agentを再起動すればよい。
うまく動作するとこんな感じ。

![スクリーンショット 2015-10-31 02.10.52.png](https://qiita-image-store.s3.amazonaws.com/0/95484/0612ae73-1475-dbfc-1901-42f08e917221.png)

#さいごに
駆け足でfluentd、Elasticsearch、Kibanaを導入した。
それぞれじっくり使い方を学ぶ必要がある。
ElasticsearchはRest APIで色々なデータを流し込んで遊べる要素がたくさんある。
Kibanaも同様にネタの宝庫なので引き続き遊んでみる。

#追記：2015/10/31
td-agent.confの設定が甘かったのでいくつか修正した。
以下簡単に解説。
type httpはcurlでfluentdにデータを送ることができる。
`http://<IP>:<PORT>/<TAG>`のような形式でjsonをデータとして送信可能。
本例ではRaspberryPi2からtemperデータをfluentdへ送るために使っている。

type tailの箇所はapacheログからElasticsearchへ送るためのもの。
matchでElasticsearchに送り込んでいる。

```xml:td-agent.conf
<source>
	type http
	port 8888
</source>

<source>
	type tail
	format apache2
	path /var/log/apache2/access.log
	tag apache.local
</source>

<match apache.*>
	logstash_prefix apache-access
	type_name access_log
	type elasticsearch
	include_tag_key true
	tag_key @log_name
	host localhost
	port 9200
	logstash_format true
	flush_interval 3s
</match>

<match temper.*>
	logstash_prefix temper-log
	type_name hash
	type elasticsearch
	include_tag_key true
	tag_key @log_name
	host localhost
	port 9200
	logstash_format true
	flush_interval 3s
</match>
```

#追記：2015/11/01 elasticsearchのデータを消す
色々試しているとElasticsearchに中途半端なデータや試行錯誤のデータが残ったりする。
その場合には以下のようにcurlからindexの検索と削除を行うと良い。
登録されたindexの検索：`curl -X GET http://localhost:9200/_aliases?pretty`
indexの削除：`curl -X DELETE http://localhost:9200/<index>*`

#追記：2015/11/03 elasticsearch-head導入
elasticsearch-headを試しに導入した。
導入手順は[elasticsearch-head」がとても便利](http://yuheikagaya.hatenablog.jp/entry/2013/07/14/185752)を参考にした。
自分の環境はDebian(Wheezy)だったので多少環境が違ったのでメモ。
以下でインストールができた。(-installではなくinstall。詳細は-hでヘルプが出る。）
`/usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head`

インストールされたプラグインを確認するには以下のように入力。
`curl -X GET 'http://localhost:9200/_nodes?plugin=true&pretty'`

本当は[elasticsearch-analysis-kuromoji](https://github.com/elastic/elasticsearch-analysis-kuromoji)入れたいんだけどES2.0に対応してない・・・

#追記：2015/11/05 td-agentのv2移行
td-agentをv2に移行した。
すごく簡単でした。（最初から気づけばよかった・・・）
[Overview of Streaming Import by Treasure Agent (td-agent)](http://docs.treasuredata.com/articles/td-agent)を参考にtd-agentをインストールした。
あっさり完了。
Debian Wheezyの環境なので下記コマンド一発だった。
`$ curl -L http://toolbelt.treasuredata.com/sh/install-debian-wheezy-td-agent2.sh | sh`

dkg -lでバージョン確認。
`ii  td-agent       2.2.1-0      amd64        Treasure Agent: A data collector`

elasticsearchのプラグインを再度インストール。
`/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch`
もしくは`td-agent-gem install fluent-plugin-elasticsearch`でもOK。

プラグインの情報は[List of All Plugins](http://www.fluentd.org/plugins/all)を参照のこと。

#追記：2015/11/15 kuromoji導入

elastincsearch2.0でkuromojiの導入方法に気づいたので、追記。
[Japanese (kuromoji) Analysis plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji.html)を参考に導入したらあっさりOKでした。

`hoge@fuga:~# /usr/share/elasticsearch/bin/plugin install analysis-kuromoji`
でインストール。

引数をlistにすればインストール済みのプラグインを確認できる。

```bash
hoge@fuga:~# /usr/share/elasticsearch/bin/plugin list
Installed plugins in /usr/share/elasticsearch/plugins:
    - analysis-kuromoji
    - head
```

こうなってたら導入できてる。

#追記：2016/04/23 Kibanaのapt-get導入

Kibanaをapt-getから導入するように変更。
この操作で今後はKibanaをapt-getで更新できるようになる。

[こちら](https://www.elastic.co/guide/en/kibana/current/setup.html#install)を参考に手順通りに実施すれば問題なく導入できた。
今後のバージョンアップ等を考慮すると、こちらの導入方法が良いと思う。

#追記：2016/04/23 elasticsearch.ymlの設定

elasticsearch-headを導入しておきながら、なぜかブラウザから見られずに放置していたが、ようやく解決。
[Elasticsearch2.3とkibana4.5でドハマリしたあなたに送る1分で動く一発スクリプト](http://qiita.com/btamari-gy/items/44434c31c3294198c828)を参考に、elasticsearch.ymlに`network.host: 0.0.0.0`を追記することであっさり解決した。
結構ハマるポイントだと思う。