yunomuのブログ

酒とゲームと上から目線

fluentdのpluginを書いてみた: fluent-plugin-diskutil

仕事飽きたから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コマンドのパス。