背景
Fluentd 運用中、レコードに指定した key がないとランタイムエラーを起こしてしまうプラグインを利用する場合、先に key がないレコードを破棄したいという要求がありました。
調査不足かも知れませんが、既存のプラグインに key の有無でフィルターするものが無かったため fluent-plugin-has-keys を作成しました。今回初めて rubygems のアカウント登録したような私のプラグインなので、動作の保証はできないですが、もし全く同じことで困られた方がいらっしゃれば参考になると幸いです。
fluent-plugin-has-keys とは
fluent-plugin-has-keys は、fluentd.conf で指定された keys がレコード内に含まれない場合、そのレコードを破棄するプラグインです。
利用する場合には、fluentd.conf に以下の様な filter 節を追加します。
<filter test>
@type has_keys
keys hoge, foo
</filter>
この節を追加すると、test タグを持つレコードは hoge と foo 両方の key を含まないと破棄されます。具体的には、上記の設定のもと、下記の入力があった場合、
2016-05-03T11:22:33 test {"hoge" => "fuga", "foo" => "bar"}
2016-05-03T11:22:34 test {"hoge" => "fuga"}
2016-05-03T11:22:35 test {"foo" => "bar"}
2016-05-03T11:22:36 test {"spam" => "ham"}
2016-05-03T11:22:37 test {"hoge" => "fuga", "foo" => "bar", "spam" => "ham"}
hoge と foo の key を含む、以下の 2 レコードだけが出力されます。
2016-05-03T11:22:33 test {"hoge" => "fuga", "foo" => "bar"}
2016-05-03T11:22:37 test {"hoge" => "fuga", "foo" => "bar", "spam" => "ham"}
まとめ
fluent-plugin-has-keys は key がないためにプラグインがランタイムエラーを起こし、Fluentd の動作も停止させてしまうことを回避するために作りました。ランタイムエラーに依る動作の停止は deep_copy などの機能で防げる場合もありますが、エラーそのものも起こしたくない場合、このプラグインが役に立つのではないかと思っています。
これから、このプラグインが日々の運用に耐えうるのかを検証し、より安心して使っていただけるようにしたいと思っています。反対に、この記事を見られた方で、このプラグインがなくとも同じことができるという場合はコメント頂けると幸いです。