仕事飽きたからfluentdのpluginを書いて遊んでいたよ。
これを試してみたくて。
fluentdのためのプラグインをイチから書く手順(bundler版) - tagomorisのメモ置き場
作ったのがこれ。
yunomu/fluent-plugin-diskutil · GitHub
例がoutputだったのでinputの方を書いてみた。
dfコマンドの結果を送るだけなので、execとかでもいけたのかもしれないよ。
lib/fluent/plugin/in_diskutil.rb
1 class Fluent::DiskUtilInput < Fluent::Input 2 Fluent::Plugin.register_input("diskutil", self) 3 4 config_param :tag, :string, :default => "diskutil" 5 config_param :interval, :integer, :default => 5 6 config_param :command, :string, :default => "/bin/df" 7 8 def initialize 9 super 10 end 11 12 def configure(conf) 13 super 14 @tick = @interval * 60 15 end 16 17 def start 18 super 19 @watcher = Thread.new(&method(:watch)) 20 end 21 22 def shutdown 23 super 24 @watcher.terminate 25 @watcher.join 26 end 27 28 private 29 def df 30 disks = `#{@command} -m`.split($/) 31 disks.shift 32 disks.map {|disk| 33 d = disk.split(/ +/) 34 ret = {} 35 ret[:device] = d.shift 36 ret[:total] = d.shift 37 ret[:used] = d.shift 38 ret[:available] = d.shift 39 ret[:percent] = d.shift.delete('%') 40 ret[:mount] = d.shift 41 ret 42 } 43 end 44 45 def watch 46 while true 47 Fluent::Engine.emit(@tag, Fluent::Engine.now, df) 48 sleep @tick 49 end 50 end
47行目のFluent::Engine.emitにオブジェクトを渡すとJSONっぽいのに変換して出力してくれるらしい。
デフォルトで5分に1回動きますというのが5, 14, 48行目あたりに書いてある。
あとはdfの出力結果を読むだけ。
あーこれWindowsじゃ動かないじゃん。
そのうちマニュアル書きます。fluentdの関係はだいたい「ソース読め」的な感じで、大変アレですね。
tag(required): tag
interval(option): ログを出す間隔。分単位。
command(option): dfコマンドのパス。