ElasticSearchとは
Elasticsearchは、割と設定とかが簡単で使いやすい全文検索エンジンで、内部でJava実装のLuceneを利用している。
http://www.elasticsearch.org/overview/elasticsearch
Kibana連携の際は、単に検索というより、可視化したいデータを高速にフィルタリングして集計する用途で使われていると思ったほうが良い感じ。
ElasticSearchのインストール
brew install elasticsearch
Kibanaとは
ElasticSearch社が提供している、ログデータの可視化ツール。Apatchなどのシステムログを用いる例ばっかりWeb上で見つかるが、別に検索のクエリログやWebサイトの行動ログだってちゃんと入れて設定すれば使える。
Kibanaのインストール
ElasticSearchのプラグインとしてインストール
plugin -i elasticsearch/kibana
(現在はkibana3
としなくても、Kibana3が標準でインストールされる。package.jsonみたら3.0.0pre-milestone5
バージョンがインストールされていた。)
とりあえずここまででKibanaを見てみる
http://localhost:9200/_plugin/kibana にアクセス
何かバージョンが古いよみたいなこと言われるけど、気にしないで使える。
こうすると、Elasticsearch自身のログを使ってサンプルダッシュボードを表示してくれるため、ElasticSearchを使ってインデックスを作ってみたりしていれば何かが表示されるはず。
Kibanaに関しては、他に何が出来るかなどの公式情報が全然ない。Demoや本番でWebUIで使いつつカスタマイズしていく感じ。
Kibanaで表示できるパネルの種類などは日本語では以下のページがよくまとまっていた。
ここにも書いてあるけど、カスタマイズ後に保存を忘れないように!
Fluentdとは
色んな所からログを集めてきて、必要な部分を必要なところに、出来る限り失敗しないように出力するツール
公式のページの図がわかりやすいので引用
基本的な、入力元や出力先の設定方法は以下を参照
http://docs.fluentd.org/ja/articles/config-file
(リンクをたどっててエラーになる場合はjaをenに変えると読めます)
Fluentd(td-agent)のインストール
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連携の記事はいくつもあるけど、公式ドキュメントは以下
Fluentd, Elasticearch連携用Fluentdプラグインのインストール
gem install fluentd fluent-plugin-elasticsearch
とドキュメントには書いてあるけれど、これでインストールされる場所はfluentdの起動時に読み込まれるgemの空間と違う可能性があるので以下のようにするのがオススメ。
/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 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
のプレフィックスを取ると良いはず)
<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を起動
ln -sfv /usr/local/opt/td-agent/homebrew.mxcl.td-agent.plist ~/Library/LaunchAgents/.
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.td-agent.plist
起動しているか確認:
ps aux | grep 'td-agent'
起動していなかったら、
tail /usr/local/var/log/td-agent/td-agent.log
を見てみると良い。
その他、参考になったリンク
TD Queryの結果を別のTDのテーブルに入れる方法
http://docs.treasuredata.com/articles/result-into-td