ようへいの日々精進XP

よかろうもん

norikra を試す(2)〜 td-agent と norikra を試す 〜

はじめに

  • 前回の続き
  • td-agent(fluentd) と norikra を連携させて使ってみる

参考

引き続き、以下を参考にさせて頂いた。


準備

以下のような構成で試す。

f:id:inokara:20131229040430p:plain

環境の構築にあたってはこちらDockerfile を利用して環境構築を行った。git clone して手元の環境で docker build してコンテナイメージを作成すればすぐに試すことが出来る(はず)

fluent-plugin-norikra について

fluent-plugin-norikranorikra に対して三つのプラグインが利用出来る。

  • in_norikra
  • out_norikra
  • out_norikra_filter

詳細についてはこちら又は、こちらに詳しく記載、説明されている。ちなみに、今回は out_norikra を試してみる。

td-agent.conf

td-agent が既にインストールされていて、fluent-plugin-norikra もインストールされているという状態で下記のような td-agent.conf を作成した。

<source>
  type tail
  format nginx
  path /var/log/nginx/access.log
  tag nginx.access
  pos_file /tmp/fluentd.pos
</source>

<match nginx.*>
  type copy

  <store>
    type file
    path /tmp/test.log
  </store>

  <store>
    type norikra
    norikra xxx.xxx.xxx.xxx:26571

    target_map_tag yes
    remove_tag_prefix nginx

  </store>
</match>

<match norikra.**>
  type stdout
</match>

type norikra の後の norikra xxx.xxx.xxx.xxxnorikra サーバーの IP アドレスを指定して td-agent を再起動する。


試す

ログを流してみる(norikra に event を流してみる)

nginx を起動させて適当にアクセスしてみると /var/log/td-agent/td-agent.log に以下のようなログが出力された。

2013-12-29 01:31:56 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2013-12-29 01:31:57 +0000 error_class="RuntimeError" error="norikra server is not ready for this targets: access" instance=69934318184480
  2013-12-29 01:31:56 +0000 [warn]: /usr/lib/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluent-plugin-norikra-0.1.0/lib/fluent/plugin/norikra/output.rb:202:in `write'
  2013-12-29 01:31:56 +0000 [warn]: /usr/lib/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluentd-0.10.41/lib/fluent/buffer.rb:292:in `write_chunk'
  2013-12-29 01:31:56 +0000 [warn]: /usr/lib/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluentd-0.10.41/lib/fluent/buffer.rb:272:in `pop'
  2013-12-29 01:31:56 +0000 [warn]: /usr/lib/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluentd-0.10.41/lib/fluent/output.rb:305:in `try_flush'
  2013-12-29 01:31:56 +0000 [warn]: /usr/lib/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluentd-0.10.41/lib/fluent/output.rb:131:in `run'
2013-12-29 01:31:58 +0000 [warn]: retry succeeded. instance=69934318184480

これはおそらく norikra 側に access という名前で target が作成されていない為だと思われる。

2013-12-29 01:31:56 +0000 [INFO] : opening target, target:"access", fields:{}, auto_field:true
2013-12-29 01:31:58 +0000 [INFO] : opening lazy target, target:#<Norikra::Target:0x7b284266 @fields={}, @name="access", @auto_field=true>

同タイミングで norikra 側に以下のようなログが出力されていた。その後、WebUI を確認すると以下のように target が作成されていた。

f:id:inokara:20131229112647p:plain

フィールドのタイプを指定していない為、全てのフィールドが String となっている。

クエリーでログを処理する

以下のようなクエリーを WebUI から登録する。

select agent,path from access.win:time(60min)

クエリを登録してから改めて nginx でアクセスした後、WebUI で確認すると...

f:id:inokara:20131229113739p:plain

おお、クエリで処理された event が確認出来た。また、norikra-cli からも以下のようにして確認出来た。

norikra-client event fetch access-test

以下のような結果が出力された。

{"time":"2013/12/29 01:37:57","path":"/","agent":"curl/7.26.0"}
{"time":"2013/12/29 01:37:59","path":"/","agent":"curl/7.26.0"}
{"time":"2013/12/29 01:37:59","path":"/","agent":"curl/7.26.0"}
{"time":"2013/12/29 01:37:59","path":"/","agent":"curl/7.26.0"}
{"time":"2013/12/29 01:37:59","path":"/","agent":"curl/7.26.0"}
{"time":"2013/12/29 01:38:01","path":"/","agent":"curl/7.26.0"}

なるほど、なるほど、norikra を使えば単位時間のアクセス数とか特定の時間のアクセス数が SQL ライクなクエリで取得出来るな。(今頃実感として湧いてくる)


最後に

  • norikra 単体で使っている時よりも td-agent を合わせて利用することで、その利便性について強く実感することが出来た
  • 確かに td-agent で流れてくるログを簡単に SQL ライクに操作出来る環境はニーズがありそう!(弊社にて)
  • ちなみに norikra 本来の機能では無いが WebUI からクエリーの結果が全て閲覧出来る、もしくは CSV としてダウンロード出来る機能があるといいなあと思ったり