やりたいこと
上記のような構成で、fluent-plugin-elasticsearchを使ってログ収集する際に、web-server側のイベント時間を@timestampフィールド(fluent-plugin-elasticsearchがタイムスタンプとして利用するフィールド)としてレコードに追加したい。
fluentdの設定
<match oreno.access>
type record_reformer
enable_ruby true
tag oreno.access.timestamp
<record>
@timestamp ${time.strftime('%Y-%m-%dT%H:%M:%S%z')}
</record>
</match>
fluent-plugin-record-reformerを利用して、こんな感じの設定をweb-serverのfluentdに追加した。(正規表現でフォーマットしないと、スペース入りのtimestampになってしまって、Elasticsearch側で正しく処理されなかった)
何が嬉しいのか
@timestampフィールドはデフォルトだとfluent-plugin-elasticsearchが動作しているfluentdのtimeを適用するので、アグリゲーターとして動かしているfluentdがダウンしている時間があった場合などに、再起動後からのタイムスタンプを付与してしまう。送信側でバッファしていたログがあった場合は、再起動後ではなく、ログの出力時間を基準にmetricsを構築しないと、正しいアクセス数などが集計できないため、こんな感じの設定を入れた。