Kibana 3 + Rails + Fluentdのサンプルアプリを作ってみた

miyagawaさんのPodcast Rebuild: 19でKibanaの話があってちょっと盛り上がり始めてるので、簡単に動作を試せるサンプルアプリセットを作ってみました。

https://github.com/y310/kibana-trial

git cloneしてREADMEに書いてある手順を実行していくと大体動くと思います。

railsからfluentdにログを送る部分は、こんな感じでrack middlewareを使って送ります。

# application_controller.rb
class ApplicationController < ActionController::Base
  around_filter :collect_metrics

  def collect_metrics
    yield
  # ensureを使うのは例外時のログも捕捉するため
  ensure
    # controllerのコンテキストで取りたい情報はここで追加する
    env['rack.metrics'] = params.slice(:user_id, :controller, :action).merge(
      path: request.path,
      user_agent: request.user_agent,
      method: request.method
    )
  end
end

# lib/rack/metrics_logger.rb
module Rack
  class MetricsLogger
    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, body = @app.call(env)

      # リクエストの終わりに取りたい情報はここで追加
      metrics = (env['rack.metrics'] || {}).merge(
        status: status,
        runtime: headers['X-Runtime']
      )
      logger.post("kibana", metrics)
      [status, headers, body]
    end

    def logger
      @logger ||= Fluent::Logger::FluentLogger.new(nil)
    end
  end
end

ひと通り立ち上がったら、curl localhost:3000を何回か叩くと http://localhost:4567/index.html でKibanaのグラフが表示されるはずです。 これはjmeter/test_request.jmxを使ってJMeterで1分間リクエストを流した時のグラフです。

f:id:y_310:20130911223533p:plain

バー1本が1秒なので、8 rpsくらいのリクエストが流れていることがわかります。

平均レスポンスタイムはどうなっているでしょうか。 右上のヒストグラムの設定リンクをクリックすると以下の設定画面が出てくるので、Modeをmeanにして、Value Fieldをruntimeにすると平均レスポンスタイムのグラフに変わります。

f:id:y_310:20130911224048p:plain

サンプル数が少ないのでばらつきが激しいですが大体40msくらいで返せているようです。

f:id:y_310:20130911224103p:plain

次は、エラーになったリクエストがどれくらいあるか見てみます。 検索クエリはstatusが200のものと、それ以外のものとします。 Kibanaでは複数の検索クエリに名前をつけてPinしておくことができます。 ちょっとわかりづらいですが、クエリフィールドにクエリ(ここではstatus:200)を入力してから、フィールドの端にある緑の丸をクリックすると画像のようなポップアップが表示されるので、ここにクエリの名前を入力して左上のピンアイコンをクリックすると保存されます。

f:id:y_310:20130911224857p:plain

同様にエラーのリクエストについても-status:200と入力して保存します。 この時点でグラフには2つのクエリの結果がstackされて表示されます。

f:id:y_310:20130911230237p:plain

OKに比べてErrorが少なすぎて見づらいのでグラフを分けてみます。 設定からそのグラフで表示させるクエリを選ぶことができるので、グラフを追加した上でそれぞれのグラフに1つずつクエリを割り当てます。

f:id:y_310:20130911225721p:plain

するとこのように成功したリクエストとエラーリクエストを分けて見ることができます。

f:id:y_310:20130911230249p:plain

最後にここまで作ったDashboardを保存します。右上のフロッピーアイコンをクリックすると保存ウィンドウが出てくるので、そこに名前を入力して保存してください。保存した設定はフォルダアイコンの方からロードすることができます。この設定はElasticSearchのkibana-intというインデックスに保存されます。

f:id:y_310:20130911231010p:plain

まとめ

こんな感じでクエリを保存してグラフに設定することで見たい情報を一覧できるダッシュボードを簡単に作ることができます。 データの表示形式はヒストグラム以外にも円グラフや地図、表など色々ありますが、今までの経験ではヒストグラムと表以外はあまり実用上役に立ったことはありませんでした。他の表示方法で便利に使っているユースケースがあったらぜひ教えて下さい!