fluentd + growthforecastを早速試してみた

Fluentd Casual Talks に参加させていただき、
いろいろと捗る話を聞いていうちに
「Fluentdやばいこれは使うしかない!」
というテンションになったので早速試してみました。

インストール

gem install fluent
# 捗りそうなプラグインも
gem install fluent-plugin-mongo
gem install bson_ext
gem install fluent-plugin-flowcounter
gem install fluent-plugin-datacounter
gem install fluent-plugin-growthforecast

今回試すアプリ

ping のレスポンスをログって、そのままgrowthforecastに投げて可視化するまでを目標とします。

pingをログるスクリプト

use strict;
use utf8;
use Time::Piece;
use Time::HiRes qw/gettimeofday tv_interval/;
use Net::Ping::External qw/ping/;

while (1) {
    my $start = [gettimeofday];
    ping(host => 'yahoo.co.jp', timeout => 3);
    my $end = [gettimeofday];

    my $time = Time::Piece->new->strftime('%Y-%m-%dT%H:%M:%S');
    printf "%s %d\n", $time, tv_interval($start, $end) * 1000;
    #printf "%s %.4f\n", $time, tv_interval($start, $end) * 1000;

    sleep 5;
}

これをログにリダイレクトしておく。

perl ping.pl > /tmp/ping.log

growthforecast

今回は直接growthforecastにアクセスするので
事前にたちあげておきます。
インストールは割愛。以下参照。
http://blog.nomadscafe.jp/2011/12/growthforecast.html

fluentdの設定

今回は送信/受信を同一サーバで行うため
一つのコンフィグファイルに記述します。

<source>
  type forward
</source>

# 入力:pingログをtailで読み込む
<source>
  type tail
  format /^(?<date>[^ ]+) (?<response_time>[^ ]+)/
  time_format %Y-%m-%dT%H:%M:%S
  path /tmp/ping.log
  tag net.ping
  pos_file /tmp/ping.log.pos
</source>

# 出力(中間):レスポンスを集計する設定
<match net.ping>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type                 datacounter
    count_key            response_time
    outcast_unmatched    true
    aggregate            all
    tag                  ping.result
    pattern1  0_10ms     ^\d{1,1}$
    pattern2  10_100ms   ^\d{2,2}$
    pattern3  100_900ms  ^\d{3,3}$
    pattern4  1s_over    ^\d{4,}$
  </store>
</match>

# 出力:集計した結果をgrothforecastに投げる設定
<match ping.result>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type growthforecast
    gfapi_url http://localhost:5125/api/
    service   servicetest
    section   ping2
    name_keys 0_10ms_count,10_100ms_count,100_900ms_count,1s_over_count
  </store>
</match>

fluentd起動

コンフィグファイルを指定して起動。
ログがズラズラ出てきて赤いのがなければ多分大丈夫。

fluentd -c fluent.conf

結果

わかりにくいけど一応出たようだ。

雑記

まだまだ使いこなせていませんが
datacounter / flowcounter は使い所ありまくりんぐな印象。やばい。
これを使えばリアルタイム集計っぽいのが出来そうですね!


つぎにTips的なこと。
stdoutにも出力するとデバッグログとして使えるので重宝しました。


あと
ログ出力をファイルにしたらうまくいかなかった、とか
ping.logで出力するところを source type exec でやってみようとしたけど
やり方がよく分からなかった、とか
growthforecastプラグインでname_keysの間にスペース入れると複数表示されない、とか
細かい部分でハマったり。。。


最後に。
ログ管理に困っている方/業務を捗らせたい方は是非とも導入すべき!
でしょう。
しかしWebの情報はまだまだ少ないと感じたので
最初はドキュメント見ながらある程度自分で頑張る必要があるかもしれませんね。
レシピがどっかにまとまっているといいなぁ〜