以下は2014年末での情報です。fluentd-0.12.xでの利用方法については追記2をご確認ください。
背景
Fluentd+Elasticsearch+Kibanaの構成でミリ秒単位のタイムスタンプを扱いたい。
fluentd
内部でレコードに対して付与されるtimeはunixtimeである。
そのため、ミリ秒単位でのタイムスタンプを標準でサポートしていない。
(内部データをfloatにする方法が検討されているらしい。)
fluent-plugin-elasticsearch
- fluentdの内部で渡されるtimeを@timestampに変換してelasticsearchへ渡している。
- レコードに@timestampが予め用意されている場合はそれをelasticsearchへ投げる。
- この段階で@timestampがミリ秒のデータを含み、適切なフォーマット"%Y-%m-%dT%H:%M:%S.%L%z"の場合、elasticsearchに適切な状態で保存されKibanaで取り扱い可能となる。
実装
以下の二つの方法を用意した。
- fluent-plugin-elasticsearchの修正版(フォーク) https://github.com/shivaken/fluent-plugin-elasticsearch
- fluentd用フィルタプラグイン https://github.com/shivaken/fluent-plugin-better-timestamp
1はmsecをレコードに用意するだけで動作する。
2はフィルタなので以下の様な設定を追加する必要がある。
<source>
type tail
format
format /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).(?<msec>\d{3}) .....
...
tag log
</source>
<match log>
type better_timestamp
tag log.with_msec
</match>
<match tag log.with_msec>
type elasticsearch
...
</match
1をgit経由で利用するか2のgemをインストールしてフィルタを一段追加するかは事情に合わせて選ぶのが吉。
1については別途issueを通じて本体へのマージを目指してます。
issueで意見言ってからプルリク出したほうがいいのかな。。
追記: プルリクエスト出しました。
https://github.com/uken/fluent-plugin-elasticsearch/pull/82
追記2: fluentd 0.12.xでの設定方法について出てました。
https://github.com/uken/fluent-plugin-elasticsearch/issues/39#issuecomment-171642223