へろへろもへじ

(ブログタイトル募集中)

Fluentdのプラグイン「fluent-plugin-assert」をリリースしました

データをアサーションするフィルタープラグイン、「fluent-plugin-assert」をリリースしました。個人的にリリースしたプラグインはこれで4個目となりました。Ruby初心者の自分でも簡単にプラグインが作れてしまうFluentdのアーキテクチャ、素晴らしいですね!! 今回はモダンな文法とかを意識しつつ、COOKPADさんが提供してくれているRubyコーディング規約を参考にしつつ、コードを書いてみました。

公開情報

https://github.com/fukuiretu/fluent-plugin-assert

https://rubygems.org/gems/fluent-plugin-assert

概要

例えば、以下の様なデータが流れてくるとして、

{"id":1,"num":"123456789","created_at":"2014-01-01 00:00:00"}

"num":"123456789"に数値以外のデータや、想定外の桁数のデータを弾きたい場合にこのプラグインを挟むことで実現することができます。

"数値"かつ"8桁"以外を弾く場合、以下のディレクティブを定義します。

<match assert.**>
  assert_pass_remove_tag_prefix assert
  assert_fail_tag_prefix fail
  <test>
    mode len,type
    key num
    len 8 eq
    data_type integer
  </test>
</match>

上記で弾かれたレコードは以下のように書き換わります。

{"fail_1":{"message":"num=123456789 is assert fail.","test":"<test>\n  mode len,type\n  key num\n  len 8 eq\n data_type integer</test>\n","origin_record":"{\"id\"=>1, \"txt\"=>\"barhogefoo\", \"created_at\"=>\"2014-01-01 00:00:00\"}"}}

他に正規表現も使えます。詳細はGitHubのREADMEを見て頂ければと思います。

ユースケース

MySQLPostgreSQL、Redshiftなどにデータを挿入する前段のvalidation的な使い方 etc...

その他

弾いたデータは他のプラグインと組み合わせて、ファイルに吐くなり、メールで送信するなり、IRCやチャットに通知するなりしておくと幸せになれるかもしれません。良かったら使ってやってください。