Tech Sketch Bucket of Technical Chips by TIS Inc.

これは便利!fluentdが更に便利になるfluent-plugin-forest

Pocket

この記事はeXcale Developer's Blogから移転されたものです。


eXcale開発チームの泉谷(@syguer)です。
今回はfluentdプラグインのfluent-plugin-forestについて紹介します。
fluent-plugin-forestは設定ファイルの書き方を拡張するプラグインです。
eXcaleでfluentdを活用していることは以前の記事でも紹介しましたが、fluentdの設定ファイルは書き方を工夫しないと冗長なものとなってしまいます。
eXcaleではそのような問題を解決する為にfluent-plugin-forestを使っています。
本記事では、そのfluent-plugin-forestの使い方について解説します。

※ fluentdの基本的な使い方についてはこちらの記事を参照してください。


eXcaleでは期間限定でサインアップキャンペーン実施中です。キャンペーン内容についてはこちらを参照してください。


設定ファイルで問題になってくる点

fluentdではタグを基準に複数のmatchディレクティブを書くことができますが、タグが増えてくるとmatchディレクティブも比例して増えることになります。

このように同じような設定を延々と記載しなければならないのは面倒な上に冗長で見辛くなります。

また、設定が冗長な他に拡張性の問題が有ります。
例えばサーバー群A、サーバー群Bから以下のようにログを受けるフォワードの設定をしていたとしましょう。

このようなときに新たにC、Dと足すことになった場合、都度設定を書き足さなければなりません。
また、設定を反映させるために都度再起動も必要になります。

このような冗長性と拡張性の問題を、テンプレートという概念を使って解決できるのがfluent-plugin-forestです。


fluent-plugin-forestについて

fluent-plugin-forestは設定ファイルの中でテンプレートを用意して、タグを動的に扱うことができるようにするプラグインです。
github上でソースが公開されており、Apache License, Version 2.0で配布されています。

本記事公開時点の最新バージョンはv0.2.4です。

ソースリポジトリ
https://github.com/tagomoris/fluent-plugin-forest

インストールはgemで行います。


基本的な使い方

さきほど上げた例を再度取りあげて、設定例を見てみます。

ここでfluent-plugin-forestのテンプレートを使うと以下のように書き換えられます。

設定の仕方を解説します。
まず、typeにforestを指定し、本来使いたいtypeをsubtypeで指定します。
そしてtemplateサブディレクティブ内で冗長になっていた設定を一般化します。
ここで、pathを指定しているタグ固有のところで${tag_parts[0]}なる変数を使っています。これはタグをドットで分けた物の0番目(この例ではAやB)を表しています。
forestでは他にもタグをそのまま使う${tag}や、ホスト名を使う${hostname}変数を使うことができます。
使うことができる変数はgithubページで解説されているのでそちらを参照してください。

この例では元々がA.messagesとB.messagesの2種類であったためそれほど設定が楽になったようには見えませんが、これがC、D、と増えたときには差が出てきます。
forestを使った設定では動的にタグを解釈するので、新たにC.messages、D.messagesが送られてきてもこの設定を変える必要がありません。
もちろん再起動も不要です。
対象が追加されるたびに冗長な設定をくどくど追加していちいち再起動する、といった運用とはおさらばです!


応用的な使い方

fluent-plugin-forestではテンプレートに加えてcaseを使って条件によって挙動を分けることもできます。
以下がその設定例です。

この例ではC.messagesだけ圧縮をかけるようにしています。
caseで指定した内容はtemplateを上書きするといった動きをします。templateで既に記載済みのものがあればcaseで再度記載する必要はありません。

より実践的な例としてeXcaleの裏側で動いている設定を紹介します。

おおまかに説明すると以下のように動作しています。
・copyプラグインを使って処理をAmazon S3、MongoDB、Elasticsearchに分岐
・copyプラグインをforest配下とすることですべての設定をテンプレート化
・Amazon S3に${tag}をpath名として保存
・MongoDBにタグをコレクション名として保存(tag_mappedオプションを使用)
・caseを使ってアクセスログのみElasticSearchに転送

eXcaleでは数百台のサーバーが動いているので、個々に設定を書くともはや読み解くのも困難となります。
fluent-plugin-forestを使うことで、たったこれだけの設定ですべてのサーバーに動的に対応できます。


最後に

このように、fluent-plugin-forestを使うことで設定ファイルの冗長性排除と拡張性を持たせることができます。
便利なプラグインなのでぜひ活用してみてください!

エンジニア採用中!私たちと一緒に働いてみませんか?