case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

FluentdのFilterプラグインを使った日時変換について

Fluentdのプラグインで日時変換した際の備忘録です。

やりたいこと

Fluentdで取得したログをBigQueryにいれるためにJSTUTC変換して「+0000」も取り除く必要があります。

「2020-07-06 11:00:00 +0000」 → 「2020-07-06 02:00:00 UTC

実装

<filter>
  @type record_transformer
  enable_ruby
  <record>
    goRegistDT ${Time.parse(record['goRegistDT'].to_s.gsub('+0000', '+0900')).utc.strftime('%Y-%m-%d %H:%M:%S')}
  </record>
  <record>
    goModifyDT ${Time.parse(record['goModifyDT'].to_s.gsub('+0000', '+0900')).utc.strftime('%Y-%m-%d %H:%M:%S')}
  </record>
</filter>

その他の方法として、プラグイン側で用意してくれているInjectセクションとParseセクションの利用も検討しました。
問題点としてInjectセクションは複数セクション定義できないことと、FilterセクションだとStdoutやExecのみサポートしており今回の用途には合いませんでした。
Parserもログのタイプを細かく定義する必要があったので採用しませんでした。

<match>
  <format>
    @type json
  </format>
  <inject>
    time_key goModifyDT
    time_type unixtime
    time_format %Y-%m-%d %H:%M:%S
    timezone Asia/Tokyo
  </inject>
</match>

inject used plugins

Stdout filter
Exec output
Exec filter output
File output
Stdout output

parser

<filter >
  @type parser
  key_name goRegistDT
  <parse>
    @type regexp
    expression /(?<goRegistDT>[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} \+[0-9]{4})/
    types goRegistDT:time
    time_key goRegistDT
    time_type unixtime
    time_format %Y-%m-%d %H:%M:%S
    timezone Asia/Tokyo
  </parse>
</filter>

Config: Inject Section - Fluentd
fluentdからBigQueryへのログ出力で日本時間(JST)をUTCに変換 | ppoohh 's blog
Unable to send correct timestamp to ES · Issue #2718 · fluent/fluentd · GitHub
Unable to send correct timestamp to ES · Issue #2718 · fluent/fluentd · GitHub