まいんだーのはてなブログ

はてブなのはてブロなのどっちなの

Fluentd と Norikra をもっとカジュアルに使おう

Norikra とは

Norikra とはリアルタイムイベントストリームに対して SQL ライクな言語で処理できる cool なプロダクトです。

例えば、Nginx のアクセスログを Norikra に流し込み、n分あたりのアクセス数やレスポンスタイムをリアルタイムに集計するといった事が可能です。
もちろん Nginx だけではなく、ご自身が書かれたアプリが出力するログも流し込んで集計できます。

更に Fluentd を組み合わせると GrowthForecast や Mackerel といったツールに集計結果を渡して可視化するなどといったことも容易なので、速報値集計やシステム運用状況の可視化に持ってこいです。

Fluentd と Norikra を活用して可視化する例

fluent-plugin-norikra と可視化ツール(GrowthForecast等)を組み合わせるとすぐに可視化できます。

fluent-plugin-norikra では in/out 両方とも実装されており、"Norikra へデータを入れる" "Norikra で実行されたクエリの結果を取り出す" 事が簡単にできます。
例えば広告配信などで毎分の配信結果やクリック、コンバージョンの速報値を可視化したいといった向きにマッチします。

今回の例では、仮に下記のような体裁のログを log.ad として forward することを想定します

{ "time": 1417886121, "ad_id": 100, "spot_id": 1234, "publisher_id": 4321, "charge_price": 100, "payment_price": 50 }

Norikra は事前にスキーマ定義を設定しておく必要はなく、データを送れば自動的にテーブルを作ってくれます。
データ型を明示的に指定したいときは auto_field 設定を false にし、登録する内容を明記することもできます。
このログの場合すべて整数なので、integer として扱われます。

Norikra へログを送信する場合、fluentd の設定ファイルには

<match log.*>
  type    norikra
  norikra norikra-server:26571

  remove_tag_prefix log
  target_map_tag    true
</match>

と書いておくだけで、Norikra 側には自動的に ad テーブルが作られます。

Norikra にデータが送られたら event(SQLライクなやつ) を登録しましょう、例で指定したタイムウィンドウ毎にクエリ結果がためられていきます。
event にはグループ名とターゲット名を指定する必要があり、このグループ名やターゲット名を使って、処理した結果を受け取ることになります。
今回は ad_request_count_1min としておきましょう。

select count(*) as count from ad.win:time_batch(1 min)

そのクエリ結果を取り出すには、fluentd 側で下記のような設定をしましょう。

<source>
  type    norikra
  norikra norikra-server:26571
  <fetch>
    method   event
    target   ad_request_count_1min
    tag      string ad_request_count_1min.all
    interval 60s
  </fetch>
</source>

ここまでで取り出した結果を別の plugin (例えば fluent-plugin-growthforecast) に渡してグラフを作れば、簡単に可視化することができます。
この程度の可視化であれば、fluent-plugin-datacounter を使っても同じことができますが、複数のログストリームを JOIN したり、項目で(例えばホストごと) GROUP BY などする際には fluent-plugin で頑張るよりも手軽です。
また、fluent-plugin では集計対象を登録、削除する際に再起動が必要ですが、Norikra は再起動無しに追加削除が可能なので、運用上も手間が少ないという利点があります。

筆者はこういったログから配信状況の推移や売上/支払の速報値について、Mackerel のサービスメトリックを用いて可視化しています。

<match request_count_1min.all>
  type mackerel
  api_key api_key_string
  service ServiceName
  metrics_name request_count_1min.${out_key}
  out_keys ad_request_count_1min,appimp_request_count_1min,imp_request_count_1min,click_request_count_1min,conversion_request_count_1min
</match>

f:id:myfinder:20141207024717p:plain

更にカジュアルに使うために

オフィシャルサイトに案内がある通り、インストールには jruby が必要です。
Norikra だけを動かすサーバが用意できるなら、jruby をインストールしてほげほげするのも容易ですが、

"ちょっと試そっかなー、でもあのサーバだと他に ruby が必要なコンポーネントとバッティングするしな〜"

というふうな状況に二の足を踏んでいる方もいらっしゃるのではないでしょうか。
そんな二の足を踏んでいる皆様がもっとカジュアルに Norikra を使えるよう、Docker Hub に Dockerfile を用意しました。


myfinder/docker-norikra Repository | Docker Hub Registry - Repositories of Docker Images

Docker がインストールされ、稼働している環境であれば下記コマンド一発で Norikra が動き始めます。

docker run -d -p 26578:26578 -p 26571:26571 -v /var/tmp/norikra:/var/tmp/norikra:rw -t myfinder/docker-norikra norikra start --stats /var/tmp/norikra/stats.json -l /var/tmp/norikra

これで人類は Norikra のインストールをどうするかという悩みから開放され、どこでも気軽に動かすことができるようになりました。
(Norikra 自体の詳しい使い方はオフィシャルサイトをご覧ください)

今後もこの Dockerfile は upstream に追随して更新していく予定ですが、自分で管理したいという方はどんどん fork するといいのではないかと思います。
あるいはいずれオフィシャルに Docker Image が提供されるようになるかもしれません。その時はオフィシャルの方を喜んで使いましょう。