昨年の秋から,学生プロジェクトで学内向けのRailsアプリを開発しています.
2月からオープンベータで公開されるので,それに向けてログの収集と可視化をしてみました.
環境は下記の通りです.
- Ubuntu Server 14.04
- Ruby 2.2.0 & Ruby on Rails 4.2.0
- td-agent 0.10.58
- Elasticsearch 1.4.1
- Kibana 3.1.2
fluentdのインストール
fluentdはOSSなログ収集ツールです.
Rubyで書かれているので,gemでpluginを追加したりします.
今回はRailsアプリを動かすサーバにtd-agentを入れました.
td-agentは,Treasure Dataがメンテナンスしているfluentdの安定板です.
公式のマニュアルに従って,debパッケージをインストール.
スタートアップに登録して,Elasticsearch用のpluginをインストールします.
(libcurl4-openssh-devを入れないとcurl-configでエラーが出ました.)
$ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
$ sudo update-rc.d td-agent defaults
$ sudo apt-get install -y libcurl4-openssl-dev
$ sudo td-agent-gem install fluent-plugin-elasticsearch
td-agentの設定は以下のようにしました.
formatでは,ログのステータスコードと応答時間だけを取っています.
(非力なVMでElasticsearchを動かしているため,ログは最小限に.)
<source>
type tail
format /^I, \[(?<time>[^\.]+).+\] INFO -- : Completed (?<status>[^ ]+) .+ in (?<benchmark>[^m]+)ms.*$/
time_format %Y-%m-%dT%H:%M:%S
path /path/to/app/log/production.log
pos_file /tmp/app.log.pos
tag app.rails.access
</source>
<match *.rails.*>
type elasticsearch
host 127.0.0.1
port 9200
type_name ruby-on-rails
include_tag_key true
tag_key @log_name
logstash_format true
logstash_prefix ruby-on-rails
flush_interval 10s
</match>
Elasticsearchの設定
Elasticsearchは既にSensuのメトリクス収集に使っています.
追加で設定は必要ないのですが,一応マッピングだけ定義しておきます.
curl -XPUT http://127.0.0.1:9200/_template/ruby-on-rails -d '{
"template": "ruby-on-rails-*",
"mappings": {
"_default_": {
"numeric_detection" : true,
"properties": {
"@timestamp": { "type":"date", "format":"dateOptionalTime" },
"@log_name": {type: "string"},
"status": {type: "integer"},
"benchmark": {type: "integer"}
}
}
}
}'
Kibanaの設定
KibanaもSensuのメトリクス可視化のために導入済です.
今回は新しくRails用にダッシュボードを作りました.
コード量が多いので,Gistに上げています
上のカラムがステータスコードの割合のヒストグラムとパイチャート.
下のカラムが応答時間のヒストグラムです.
シンプルですが,当面はこのくらいの情報量で十分かなと思っています.
まとめ
fluentdとElasticsearch,Kibanaというオーソドックスな構成で可視化してみました.
一番大変だったのは,fluentdのformatを作るところでしょうか….
このノウハウは他にも応用が効きそうなので,色々ログ収集と可視化をしてみたいですね.
また,今回は以下の記事を参考にしました.