fluentdとKibanaでRailsのログを簡単に可視化

  • 43
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

昨年の秋から,学生プロジェクトで学内向けの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を動かしているため,ログは最小限に.)

/etc/td-agent/td-agent.conf
<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のメトリクス収集に使っています.
追加で設定は必要ないのですが,一応マッピングだけ定義しておきます.

mapping.sh
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に上げています

rails_fluentd_kibana.png

上のカラムがステータスコードの割合のヒストグラムとパイチャート.
下のカラムが応答時間のヒストグラムです.
シンプルですが,当面はこのくらいの情報量で十分かなと思っています.

まとめ

fluentdとElasticsearch,Kibanaというオーソドックスな構成で可視化してみました.
一番大変だったのは,fluentdのformatを作るところでしょうか….
このノウハウは他にも応用が効きそうなので,色々ログ収集と可視化をしてみたいですね.

また,今回は以下の記事を参考にしました.