Fluentd update 2013

Fluentd / td-agentのリリースマネージャをしているrepeatedlyです．Fluentd Advent Calendarの8日目の記事になります．

色々とネタはあるのですが，なんかまとめっぽい記事の方が話題になると聞いたので，それっぽいネタで行くことにしました．2日目に「[Fluentd 2013年開発・状況まとめ / 2014年に向けて](http://kzk9.tumblr.com/post/68650355514/fluentd-2013-2014)」という開発体制的な話が出たので，この記事ではこの1年でFluentdに入った機能をいくつか紹介することにします．
MLには毎度投げているのですが，全部の変更を追うのは難しいとは思うので，バージョンアップの目安にしてもらえればと思います．

各機能の後の()は利用可能になったバージョンです．

# Fluentd本体

## --dry-runオプション (0.10.36)

他のサーバなどにあるconfigtestをするためのオプションです．--dry-runオプションを使うことで，デーモンのrestart前に設定をチェックし，予期せぬデーモンの停止を防ぐことが出来るようになります．
td-agentはこれを使ってチェックをするようにしています．

## Ruby DSLによる設定 (0.10.37)

Chefとかと同じように，Rubyで設定が書けるようになりました．v10ではv11とは違って試験的な扱いなので，実はドキュメントに書いてなかったりします．

どんなのか気になる方は実装した[@tagomoris](https://twitter.com/tagomoris)さんによる「[Fluentd Config DSLについての話](http://d.hatena.ne.jp/tagomoris/20130909/1378722331)」の記事を参照してください．なんかバグがあったらissue切って[@tagomoris](https://twitter.com/tagomoris)さんにpingしてもらうとすぐfixしてもらえると思います．

## --suppress-repeated-stacktraceオプション (0.10.41)

これは同じエラーが続いた時に，同じ内容のスタックトレースがログに何度も出力され，ログファイルのサイズが一気に膨れあがるという問題に対処するために入れました．バッファが溢れた場合や，おかしなフォーマットをInput/Outputが処理した時などこの状況が起こったりします．これを入れることで数行 - 10数行に及ぶにスタックトレースの代わりに「suppressed same stacktrace」という一行が出力されるようになります．

# Inputプラグイン

## LTSVフォーマット in in_tail (0.10.32)

ApacheやNginxのログをロバストに拡張できるフォーマットとして注目を集めている[LTSV](http://ltsv.org/)フォーマットをin_tailで指定出来るようになりました．

```conf
format ltsv

# optional parameters
# delimiter \t
# label_delimiter :
```

## in_monitor_agentプラグイン (0.10.33)

Fluentdのプラグイン毎のバッファキューの長さなどをHTTP + JSONで返すサーバがFluentd内部で立ち上がります．これを使うことで，モニタリングが外部からやりやすくなります．

```conf
<source>
  type monitor_agent
</source>
```

ドキュメントは…と[docs.fluentd.org](docs.fluentd.org)にないですね．後で追加します…

### idパラメータの追加

上と連動しているのですが，実はプラグインの設定にidというのが増えています

```conf
id hoge
```

と書くと，プラグインにidが付与されます．これによって上記のin_monitor_agentから一意に識別出来るようになります．idをつけないとRubyのオブジェクトのidになるので，再起動すると値が変わって運用が難しくなったりします．

## formatオプション in in_exec (0.10.37)

in_execは昔はTSVでしか受け渡しが出来なかったのですが，TSVに加えjsonとmsgpackでも受け渡しが出来るようになりました

```conf
format msgpack # or json. default is tsv
```

## noneフォーマット in in_tail (0.10.39)

fluent-agent-liteがすでに使っている機能なのですが，ログをパースせずに`{"message":"log line"}`みたいにして送る機能です．
元々正規表現でも実現出来たのですが，処理が重たいのと，他のプラグインと組み合わせることでin_tailでは出来ない処理が実現出来るという要望もあり，入れました

```conf
format none
```

# Outputプラグイン

## TCPハートビート in out_forward (0.10.31)

out_forwardプラグインの設定に

```conf
heartbeat_type tcp
```

と書くことで利用出来ます．デフォルトはUDPなのですが，環境によってはUDPが通らない所や，OSのバージョンによってUDPがドロップしまくるなどの問題があり，その場合TCPハートビートを使うことで解決出来ます．

## queued_chunk_flush_intervalパラメータの追加 (0.10.33)

一部の人から要望があった機能なためおおっぴらにはしてないのですが，チャンクのフラッシュ間隔を秒単位で弄れる設定があります．これは，ネットワークが不安定な環境などで複数サーバがあった場合，チャンクがたまった状態で各サーバが同タイミングで一気にフラッシュし，バーストが起こるという問題を緩和するために入れました．

これと同じタイミングで，ランダム要素を入れてwaitを計算するように変更したので，バーストは起こりにくくなっているのではないかと思います．

## symlink_pathパラメータ in out_file (0.10.36)

out_fileプラグインで，ファイルバッファを使っている場合にsymlinkを貼ることが出来るようになりました．

```conf
symlink_path /path/to/symlink
```

これにより書き出し先のサーバで，symlinkを通してログのtailが出来るようになりました．0.10.39でハンドリングを少し改善しました．

## deep_copyオプション in out_copy (0.10.39)

out_copyは複数のOutputプラグインに出力を振り分けるプラグインですが，shallow copyを行っていて，あるプラグインがレコードを弄るとそれが他のプラグインに影響するという問題があります．
これを利用して，一番上にレコードを弄るプラグインを配置して，それより下のプラグインでの処理を軽くするという技が使える一方，予期せぬ変更が加わるということも起きていました．
その問題を回避するために，各Outputプラグインにdeep copyしたレコードを渡すオプションがdeep_copyになります

```conf
deep_copy true
```

# ドキュメント

[docs.fluentd.org](docs.fluentd.org)ですが，地味に色々と改善しています．

## 日本語版ドキュメントの開始

各ページの右上に`Available languages | en | ja |`みたいなのが増えてます(日本語版がないページは英語がそのまま表示されます)．コミュニティベースでの翻訳で，今現在は[@mazgi](https://twitter.com/mazgi)さんが一人で翻訳をやっている状況です．
是非，皆さんの力を借りたい所なので，自分が読んだページなどを翻訳してもらえるとかなり助かります！

`rake outdated`と打つと，英語版に比べて古いドキュメントがリストアップされる機能を入れているので，どのドキュメントを翻訳すればいいかなどを分かりやすくしているつもりです．

## grep and mailプラグインの説明の追加

http://docs.fluentd.org/articles/splunk-like-grep-and-alert-email

日本だと様々な人が記事を書いているので，色々とユースケースが伝わっていると想うのですが，海外だとまだまだ単なるforwarderだと思っている人も少なくありません．
なので，日本で広く使われているユースケースとかを，どんどん追加したいなと考えています．こちらも，協力してくれる人を絶賛募集中です．今現在は[@kiyototamura](https://twitter.com/kiyototamura)さんがこの辺をハンドリングしています．

# まとめ

運用などに影響があるであろう機能追加を中心にリストアップしてみました．pull requestやissueを上げてくれた皆さん，ありがとうございました！これら以外にももちろん，パフォーマンスやメモリ使用量やエラー処理など，色々と改善を行っています．
v11やWindows対応など色々と課題はあるのですが，これからもFluentdをよろしくお願いします :)

明日はFluentdの作者である [@frsyuki](https://twitter.com/frsyuki) です！