2013年4月18日木曜日

Kibanaってなんじゃ?(Kibana+elasticsearch+fluentdでログ解析)

前回の記事では splunk enterpriseを使ってみました。

今回もログ解析プラットホームである、Kibanaを使ってみます。
Kibanaは検索などにElasticsearchを利用します。
またKibanaはデータの収集にLogstashの利用を推奨しています。

それぞれ以下のようなプロダクトです。

Logstash
ログデータを収集し、解析して保存します。
この組み合わせで使用する場合、保存先はelasticsearchになります。

Elasticsearch
リアルタイムデータの全文検索や統計などをRestfulインターフェースで提供します。

Kibana
データの情報を描画し、検索したりドリルダウンで情報をたどれるGUIアプリケーションです。



この3つを組み合わせて使用すると便利なログ解析プラットホームが作れますよというのがKibanaの売りです。
データの収集や解析を行うLogstashは、入力、フィルタ、出力のプラグインを組み合わせて使うようになっているようです。こう見るとfluentdを思い出さずにはいられません。

そこでElasticsearchにfluentdでOUT出来ればLogstashの替わりにfluentdを使うことができ、より便利そうです。

探してみると、、、、
やっぱり、elasticsearchプラグインを作っている方がいました。
https://github.com/uken/fluent-plugin-elasticsearch


つまり、


fluentd + fluent-plugin-elasticsearch
ログデータを収集し、解析して保存します。
この組み合わせで使用する場合、保存先はelasticsearchになります。



ということで、完全にLogstashを置き換えられそうです。

そういうわけで早速インストールしてみました。

# cd ~/
# mkdir app
# cd app/
# curl -OL https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.6.tar.gz
# tar xzvf elasticsearch-0.20.6.tar.gz
# cd elasticsearch-0.20.6
# ./bin/elasticsearch -f

フロントで起動されました。今回はこのまま使います。

別のターミナルで同じマシンにログインします。

# cd ~/app
# yum -y install gcc ruby ruby-devel rubygems rdoc
# git clone --branch=kibana-ruby https://github.com/rashidkpc/Kibana.git
# cd Kibana/
# gem install bundler
# gem install eventmachine -v '1.0.3'
# bundle install

設定ファイルを以下のように編集します。
# vim ./KibanaConfig.rb
~略~

  Elasticsearch = "localhost:9200"

  #Set the Net::HTTP read/open timeouts for the connection to the ES backend
  ElasticsearchTimeout = 500

  # The port Kibana should listen on
  KibanaPort = 5601

  # The adress ip Kibana should listen on. Comment out or set to
  # 0.0.0.0 to listen on all interfaces.
  #KibanaHost = '127.0.0.1'
  KibanaHost = '0.0.0.0'

~略~


それでは起動してみます。
# ruby kibana.rb


これでKibanaとElasticsearchが起ち上がりました。

Kibanaはデフォルト5601ポートで起動するので、
http://xxx.xxx.xxx.xxx:5601/
にブラウザでアクセスします。



なにもデータがないため殺風景です。
データを用意しましょう。

データは別のサーバーからfluentdで送信します。

apacheを稼動しているサーバーで、fluentdを起動し、プラグインをインストールします。

# vim /etc/yum.repos.d/td.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
# yum install td-agent -y


次に、プラグインをインストールします。
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch


そして、設定ファイルを作ります。 今回は、apacheのaccess_logをtailしてelasticsearchに送信します。
# vim /etc/td-agent/td-agent.conf
<source>
  type tail
  format apache
  path /var/log/httpd/access_log
  tag server1.apache.access
</source>

<match *.apache.*>
  index_name adminpack
  type_name apache
  type elasticsearch
  include_tag_key true
  tag_key @log_name
  host 54.248.82.123
  port 9200
  logstash_format true
  flush_interval 10s
</match>

ここで、ポイントは、sourceのtagにサーバー名.apache.accessとしたことです。
matchディレクティブでtag_key @log_nameとすると、Kibanaに送られた後にこの名前で絞込みができ、別サーバーや別のタイプのログなどと区別できます。

それではfluentdを起動します。
# /etc/init.d/td-agent start


これで準備は整ったので、このサーバーのコンテンツにアクセスしてアクセスログを発生させます。
その後、Kibanaの画面を再度確認すると、、


ログのデータが表示されています。
左側のペインで一覧にカラム表示する項目を+押下して選択します。

ヘッダ中央のキーワード入力欄に
code:404などとすると404レスポンスを返したログだけを絞り込めます。

また、@log_nameという項目が、先ほどのtagになるので、キーワード入力欄に
 @log_name:"server1.apache.access"
と入力すると、サーバーやログの種類で絞りこまれます。




現在Kibanaは複数ログに対応する機能がないようなので、このようにしてログ毎の集計をとる形になりそうです。


やはりsplunkと比べると機能面では物足りませんが、用途によってはこれで十分な場合もありますので、選択肢の一つとして覚えておきたいです。

以上です。