タイトルが長いですが、つまりそういうものをGoで書いています。
(hydraっていうのは首のいっぱいあるアレです。キングヒドラとか)
特徴
- fluent-agent-lite 的なファイルを tail -F のように追尾する機能
- 1プロセスで複数ファイルを追跡できます
- in_tail のような pos_file, parse 機能は今のところありません
- in_forward 的な TCP で msgpack 形式のログを受け取る機能
- 上記から入力されたログを fluentd に送信する out_forward 的な機能
- 複数の送信先を登録し、primary の fluentd がダウンしたら次の fluentd に送信を試みます
- 送信先がダウンしてる場合はファイルの追尾を進めないので、内部バッファが溜まることはありません
- (in_forward のバッファは溢れることがあります)
- 動作状況を JSON で返す stats monitor httpd
- 監視に便利
- Goで書かれているのでバイナリ1ファイル(+設定ファイル)で動作します
- daemonize 機構はないので、何らかの supervisor (daemontools, supervisord, runitなど) 経由で動作させる必要はあります
- Windowsでも動きました
開発背景
これまで自分の環境では、Web(App)サーバから集約 fluentd へのログ転送について
- ファイル追尾には fluent-agent-lite
- アプリケーションからログを受け付けるのは fluentd (in_forward)
を利用していました。
fluent-agent-lite では 1プロセスで 1ファイルを扱うため、多数のファイルを追尾する場合にはファイル数分 fluent-agent-lite + tail のプロセスが必要になります。
それ自体はメモリ消費が多少大きくなるぐらいでさほど問題ではないのですが
- agent-lite は起動時にファイルが存在しないとプロセスが終了してしまう
- プロセスの起動順により、追尾したいログがまだない、ということがあり得る
- agent-lite プロセス数で監視を行うと、追跡するファイル数が増えるごとに監視設定を追従する必要がある
という点が多少不便だったのと、自分のユースケース的には in_forward も1プロセスで賄えたら便利かな、というのと、あと単純に作ってみたかったからです。
【追記】
fluent-agent-lite にファイルがなくても起動しておけるオプションあり?(前に足した) > URL
Go での fluentd 代替実装については Ik が既にありますが、本家 fluentd のように plugin アーキテクチャになっていて重厚なのと、あとドキュメントがなかったので手を出せずに、という感じです。
ただし、in_forward 機能の実装にあたって、Ikからコードを頂いた部分が多くあります。ありがとうございます。
パフォーマンス
fluentd (in_tail+out_forward), fluent-agent-lite, fluent-agent-hydra の3者で、fluentd-benchmark / one_forward のベンチマークを取りました。
ベンチマーク結果はこちらです https://github.com/fujiwara/fluent-agent-hydra#benchmark
ざっとまとめると、通常使用する領域 (秒間数百〜数万lines/secまで) において
- CPU使用率は lite < hydra < fluentd
- メモリ使用量は hydra < lite << fluentd
という結果です。
ピーク性能では lite が 580,000/sec、hydraでバッファサイズとGOMAXPROCSを調整すれば 700,000/sec までいけましたが、秒間50万行ファイルにログを書く人はいないと思いますので、あまり意味のある結果ではないですね。
現状
数日間、某所環境で特にメモリリークもローテート時の取りこぼしもなく快調に動いているので、一応使えるレベルではないかと思いますが、α版状態です。
今後、本番に導入を進めて安定させたいと思います。
バイナリリリースもありますので、お試しいただければ幸いです。