たごもりすメモ

コードとかその他の話とか。

#fluentd 用ログ収集専用のエージェント fluent-agent-lite 書いた

みんな大好きfluentdはたいへん便利ですが、ログの収集&集約だけをしたい、というときにちょっとオーバースペック気味のところがあります。特に in_tail はログの読み込みと同時に parse をする仕組みになっており、まあログが書かれた場所ならparseのルールもわかってるでしょ、というところは合理的なものでもあるのですが、loadavgが高いサーバでそういうことをするのは正直にいってなかなか厳しいです。

そういうわけで以前に scribeline というエージェントツールを作ったのでこれを fluentd 以降後も使い続けていたのですが、ログをいったん集約するところの fluentd がCPU使用率的にいっぱいいっぱいになって厳しいものがありました。「scribe(Thrift)じゃなくてMessagePackにすれば倍くらいさばけるよ」ということを某開発者が言っていたような気もするので、fluentd ネイティブなプロトコルで送ってやりたい。

ということで、作りました。

tagomoris/fluent-agent-lite · GitHub

perl 5.8 があれば動く(あとのモジュールはインストール時に自動で入れる)ので、たいていの環境で簡単に導入できると思います。

機能

指定されたログファイルから行単位で読み込み、各行のログメッセージを特定のフィールド*1に詰め、指定された fluentd に対して送ります。ログ行末尾の改行は取り除かれています。ログメッセージには指定したタグが付与されます*2
複数のログファイルを指定した場合、その数だけプロセスが起動するのでご注意ください。

送り先サーバは primary と secondary をそれぞれ指定できるため、primaryがダウンしているときにはsecondaryに自動的にフェイルオーバします。また30分毎に再接続を行うため、障害後にprimaryが復旧すれば、そのうち(30分前後で)primaryにテイクバックします。
また primary と secondary はそれぞれリストを書いたファイルを指定できるようになっています。リストを指定された場合、その中からランダムにひとつを選んで接続します。これにより簡単な負荷分散も行えます。

その他、特に負荷の高いサーバで走らせる場合に特化した最適化設定用の項目がいくつかあります。

導入方法

tar.gz をダウンロードするかgithub repositoryをcloneし bin/install.sh を実行するとセットアップが走ります。それで完了のはず。

また SPEC/fluent-agent-lite.spec が用意してあるので、rpmパッケージの作成もできるはずです。デフォルトの送信先サーバなどをセットした状態の設定ファイルとセットにして作るのがよいでしょう。

セットアップが完了したら init script が使えます。

  /etc/init.d/fluent-agent-lite [start|stop|restart|reload|status] 
実績

まだ手元で実戦投入してませんが、scribeline という機能的に酷似したツールの経験があるので、まあ大丈夫じゃないかなーと思います。某サービスで試験的に動かした結果、1日半(2回のlogrotateを含む)の間、3台のサーバから約1億行のログを転送して問題なく動作しました。

まとめ

余計なことをせず生ログをそのままfluentdに流したい、という要求がどのくらいあるのかはわかりませんが、そのような目的に特化して作っているので、ハマる人には大変有用なツールじゃないかなと思います。「まず収集して保存だけ」という場合は使えるでしょう。
その後にあれこれしたくなった場合は自分やっているように out_exec_filter で parse することになるかもしれません。

使えそうだと思われたかた、どうぞご利用ください。

*1:デフォルトでは message

*2:TAG_PREFIX を一括して指定することもできます