2020/01/01ツイート2013/01/16fluent-plugin-redeliverというのを書いた昔からとうてい世間に公表出来ないようなものばっかり作っていた私ですが、今年の目標に「パブリックにリリース出来るもの(製品およびライブラリ)をたくさん作る」と掲げておりまして、その第一弾というわけではないですが今をときめくイベントログ収集ツールのFluentのプラグインを書きました。名前はredeliverプラグインです。ログに別のタグをつけて再送するんです。思って探してみたりはしました。するとそれっぽいものとしてrewriteプラグインとrewrite-tag-filterプラグインが見つかりました。あら...どちらの作者も名字は違うけどKentaroさんなんですね...ってそれはおいておいて、残念ながらドキュメント読んでみると微妙にぼくの使い方に合致しないため使えませんでした。ぼくが必要としていた使い方は、「既存のFluentでログを取ってるシステムに対して、別の人がつくったFluentベースのログ集約システムにログを送る必要があるものの、タグの命名規則が違うのでタグだけ書き換えて送りたい」という感じです。rewriteプラグインは現在のタグにprefixの一括追加削除と、任意のrecordのキーに対する正規表現を用いた値書き換えは可能なんですが、タグを正規表現で書き換えることはできなさそうでした。rewrite-tag-filterはrecordの特定のキーを指定し、そのキーで取得出来る値が正規表現にマッチしていたら指定したタグに書き換えるという感じでした。ぼくの用途はrecordのキーではなくてtagをキーとしてそれを正規表現で別のタグに書き換えたかったんですが、どうもそれはできないようでした。うーんなんでタグの正規表現書き換えができないんだーと思ったんですが、よく考えてみれば普通はニーズが出てこないもんないんですよね。いうと、ログを吐き出すプログラムでそういうタグにして吐き出せば解決なんですもの。今回は既存のWebサービスと既存のログ集約システムの仕様のスキマを埋めるために必要ということで、ホントにレアケースになりそうですが、とりあえずプラグインとして作りました。redeliverを指定すると、regexpで指定した正規表現にマッチするかどうかチェックし、マッチするようであればreplaceで指定したパターンに従ってタグを書き換えて同じデータを再emitします。このとき、tag_attrでキーを指定すると、ログデータのJSON(record)に書き換える前のオリジナルのタグをそのキーの値として追加することも出来ます。ウッ、1段落で機能説明がおわってしまった。('-';)ひとまず、かなり薄くて軽いプラグインですので複数のOutputプラグインの間に挟んだりして使うと意外と使い物になるかもしれません。ログのJSONをFluentからMongoDBに入れるとタグが入らないので、タグにも意味がある場合はそれに相当するデータをJSONに含める必要があります。それをアプリでやるとアプリのコードが冗長な感じになり、タグに相当するデータをJSONに含め忘れてつらい思いをしたことがある人もいるかもしれません。このプラグインを使えばオリジナルのタグをプラグインでrecordに追加して別のタグで再配送できますので、MongoDBに入れるためのタグを定義してそこへ再配送すればそういう煩わしさからおさらばできますね!もうちょっと設定と使い方について詳しく書こうかと思ったんですが、眠くなってきたのでリクエストがあればまた今度書くって感じにしたいとおもいます。Effectiveのところにアプリからapp.error.*で出力したものをファイルに出力しつつ、logging.error.*に書き換えてMongoDBに格納しつつfluent-plugin-suppressで数を間引いてアラートするというような例を書いてあります。いう風にタグを書き換えながらチェインさせてくことができるっていうことが分かるとFluentってホント柔軟にできてるなぁと感心しますね。そんなわけで今回はFluentのプラグインを書きましたが、実はRuby書いたの初めてでまさかPerlのCPANモジュールデビューよりも先にRubyのRubyGemsデビューすることになるとは全く思っていませんでした。前の会社にいた頃はこの手の仕事上作った便利モジュールを公開するのはなかなかはばかられる雰囲気だった(と思っている)のですが、今年くらいからは便利そうなものはオープンにしていきたいなぁと思っている今日この頃です。acidlemonです。鎌倉市在住の普通のITエンジニアです。30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。