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分間リクエストを流した時のグラフです。
バー1本が1秒なので、8 rpsくらいのリクエストが流れていることがわかります。
平均レスポンスタイムはどうなっているでしょうか。 右上のヒストグラムの設定リンクをクリックすると以下の設定画面が出てくるので、Modeをmeanにして、Value Fieldをruntimeにすると平均レスポンスタイムのグラフに変わります。
サンプル数が少ないのでばらつきが激しいですが大体40msくらいで返せているようです。
次は、エラーになったリクエストがどれくらいあるか見てみます。
検索クエリはstatusが200のものと、それ以外のものとします。
Kibanaでは複数の検索クエリに名前をつけてPinしておくことができます。
ちょっとわかりづらいですが、クエリフィールドにクエリ(ここではstatus:200
)を入力してから、フィールドの端にある緑の丸をクリックすると画像のようなポップアップが表示されるので、ここにクエリの名前を入力して左上のピンアイコンをクリックすると保存されます。
同様にエラーのリクエストについても-status:200
と入力して保存します。
この時点でグラフには2つのクエリの結果がstackされて表示されます。
OKに比べてErrorが少なすぎて見づらいのでグラフを分けてみます。 設定からそのグラフで表示させるクエリを選ぶことができるので、グラフを追加した上でそれぞれのグラフに1つずつクエリを割り当てます。
するとこのように成功したリクエストとエラーリクエストを分けて見ることができます。
最後にここまで作ったDashboardを保存します。右上のフロッピーアイコンをクリックすると保存ウィンドウが出てくるので、そこに名前を入力して保存してください。保存した設定はフォルダアイコンの方からロードすることができます。この設定はElasticSearchのkibana-intというインデックスに保存されます。
まとめ
こんな感じでクエリを保存してグラフに設定することで見たい情報を一覧できるダッシュボードを簡単に作ることができます。 データの表示形式はヒストグラム以外にも円グラフや地図、表など色々ありますが、今までの経験ではヒストグラムと表以外はあまり実用上役に立ったことはありませんでした。他の表示方法で便利に使っているユースケースがあったらぜひ教えて下さい!