2013年2月12日火曜日

Fluentdの既存のプラグインを継承してメソッドをオーバーライドして使ってみた

スズキです。

Fluentdで既存の(Gemでインストールした)プラグインを少し改造して使う(簡単な)方法です。
(Fluentdは下記の方法でインストールされているとします)
CentOS6にFluentdをインストール
ポイントは以下に示した感じでしょうか?
  • 継承したクラス(ファイル)は"/etc/td-agent/plugin"に配置
    • ファイル名はプラグインのファイル名のルール通り
  • 継承するプラグイン(クラス)のファイルを"require"する
ということで、"fluent-plugin-datacounter"の挙動を、キリのいい時刻
(1分間隔の出力なら"hh::mm::00"でログ出力)でログ出力
("watch"メソッドをオーバーライド)するようにしてみました。
# cat /etc/td-agent/plugin/out_datacounter_ex.rb
module Fluent
    require 'fluent/plugin/out_datacounter'

    class DataCounterExOutput < DataCounterOutput
        Plugin.register_output('datacounter_ex', self)

        def watch
            @last_checked = Fluent::Engine.now
            while true
                sleep 0.5
                if Engine.now != @last_checked && Engine.now % @tick == 0
                    now = Engine.now
                    flush_emit(now - @last_checked)
                    @last_checked = now
                end
            end
        end

    end

end
オーバーライドした親のメソッドは下記の通りです。
def watch
    # instance variable, and public accessable, for test
    @last_checked = Fluent::Engine.now
    while true
        sleep 0.5
        if Fluent::Engine.now - @last_checked >= @tick
            now = Fluent::Engine.now
            flush_emit(now - @last_checked)
            @last_checked = now
        end
    end
end
当然、設定ファイルの修正(特に"type")も必要です。
cat /etc/td-agent/td-agent.conf
...
type      datacounter_ex
unit      minute
aggregate all
count_key ident
pattern1  history ^-bash$
pattern2  audit   ^audispd$
tag       datacounter.syslog
...
Fluentd(td-agent)を再起動すると、下記のように変更した挙動
(キリのいい時刻"hh:mm:00"でログ出力)で動作することが確認できます。
# tail /tmp/datacounter.syslog.20130212.b4d585c76d5883b21
...
2013-02-12T22:46:00+09:00 datacounter.syslog {"unmatched_count":3,"unmatched_rate":0.05,"unmatched_percentage":37.5,"history_count":0,"history_rate":0.0,"history_percentage":0.0,"audit_count":5,"audit_rate":0.08,"audit_percentage":62.5}
2013-02-12T22:47:00+09:00 datacounter.syslog {"unmatched_count":3,"unmatched_rate":0.05,"unmatched_percentage":37.5,"history_count":0,"history_rate":0.0,"history_percentage":0.0,"audit_count":5,"audit_rate":0.08,"audit_percentage":62.5}
2013-02-12T22:48:00+09:00 datacounter.syslog {"unmatched_count":3,"unmatched_rate":0.05,"unmatched_percentage":37.5,"history_count":0,"history_rate":0.0,"history_percentage":0.0,"audit_count":5,"audit_rate":0.08,"audit_percentage":62.5}
といっても1分間隔でしかテストしてないので、他の間隔だとおかしな挙動になってしまう
可能性は十分にあります...とりあえず、やり方としてのメモです。

だいぶRuby覚えてきた...
--------
http://www.suz-lab.com

0 コメント: