Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

不具合修正版 fluent-plugin-rewrite-tag-filter v1.3.1 をリリースしました #fluentd

ログ収集ツールFluentdに、Apachemod_rewriteのようにtagを自在に書き換える機能を追加する、fluent-plugin-rewrite-tag-filterのv1.3.1をリリースしました。

今回は不具合修正のみです。

変更内容概要

修正履歴より紹介します。

特に前者の不具合は影響が大きいため、詳細な説明を行います。

「後方参照・タグプレースホルダが正常に動作しない現象」の詳細

後方参照またはタグプレースホルダを利用した場合に、以下の不具合が発生します。 是非アップデートをお願いします。

不具合例 その1

agent.ie.${tag}を元にそれぞれ別のタグに書き換わる挙動が意図通りです。
しかし最初にagent.ie.${tag}を通った時にagent.ie.ap01に展開されてしまうため、rewriterule1 agent MSIEに該当するパターンは以後全てagent.ie.ap01というタグに書き換えられる現象が発生します。

# 設定例
<match apache.access.*>
  type rewrite_tag_filter
  rewriterule1 agent MSIE agent.ie.${tag}
  remove_tag_prefix apache.access
</match>
  • v1.1.0〜v1.3.0での挙動

    • apache.access.ap01agent.ie.ap01
    • apache.access.ap02agent.ie.ap01 ※ap02ではなくap01となっている
  • 本来の意図

    • apache.access.ap01agent.ie.ap01
    • apache.access.ap02agent.ie.ap02

不具合例 その2

site.$1を元にそれぞれ別のタグに書き換わる挙動が意図通りです。

# 設定例
<match apache.access.*>
  type rewrite_tag_filter
  rewriterule1 domain ([a-z])\.com site.$1
</match>
  • v1.1.0〜v1.3.0での挙動

    • domainがfoo.comsite.foo
    • domainがbar.comsite.foo ※barではなくfooとなっている
  • 本来の意図

    • domainがfoo.comsite.foo
    • domainがbar.comsite.bar

謝辞

タグプレースホルダの不具合は、 Tad@JP Tad@JP (@tad_jp)さんによる報告です。
ありがとうございます。

反省点

破壊的メソッドの使い方を誤ったことによる不具合でした。 以下に該当のソースを抜粋します。

@rewriterules.each do |rewritekey, regexp, match_operator, rewritetag|
  ...snip...
  `rewritetag.gsub!(/(\${[a-z]+}|__[A-Z]+__)/, placeholder)`
  ...snip...

configureで作成した変数@rewriterulesの中身、rewritetaggsub!で書き換えていました。

あとがき

修正した際にテストを追加できなかったことが心苦しいです。

Fluentdのユニットテストで、<match apache.*>といった入力の
テスト実装方法があれば、どなたか助言頂けると嬉しいです。