fluentdに送信したログをBigQueryのテーブルへ動的に出力

2020年1月22日

前回、fluentdに送信したログをBigQueryに出力という記事を書きましたが、
ログの種類によって別のテーブルへ出力したいといったことがあり実際に試してみました。

実現方法

  • ログを送信する際のタグからBigQueryのデータセット、テーブルを判別
  • fluent-plugin-forestのプラグインを利用
    今回利用したバージョンは (0.3.3)

td-agent.confの設定

fluent-plugin-forest によって ${tag_parts[1]} といった記述で設定を動的に置き換えます。schema_path のファイルは必要なテーブルの分用意する必要があります。

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match bqlog.*.*>
  @type forest
  subtype copy

  <case bqlog.*.*>
    <store>
      @type bigquery_insert
      auth_method json_key
      json_key /etc/td-agent/json_key/xxxxxxxxxx.json
      email xxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxxxxxxx.iam.gserviceaccount.com

      project gcp_project
      dataset ${tag_parts[1]}
      table ${tag_parts[2]}
      schema_path /etc/td-agent/schema/${tag_parts[1]}/${tag_parts[2]}.json

      <buffer>
        @type memory
        chunk_limit_size 16m
        queue_limit_length 256
        timekey 1h
        flush_at_shutdown true
        flush_thread_count 1
        flush_mode interval
        flush_interval 1s
        retry_forever
        retry_wait 1s
      </buffer>

      <inject>
        time_key time
        time_type unixtime
        time_format %Y-%m-%d %H:%M:%S
        timezone Asia/Tokyo
      </inject>

    </store>
  </case>

</match>

動作確認

fluent-catコマンドでFluentdにログを送信

echo '{"time":"2019-12-06 18:50:00","body":"1"}' | /opt/td-agent/embedded/bin/fluent-cat bqlog.test.log1
echo '{"time":"2019-12-06 18:50:00","body":"2"}' | /opt/td-agent/embedded/bin/fluent-cat bqlog.test.log2

これでBigQueryのテーブルを確認するとlog1、log2それぞれのテーブルにレコードが追加されていました。

ちなみにデータセットを変更しても問題なく動作することも確認できました。

備考

新しいFluentdなら ${tag[1]} といった記述でタグ内容に応じた設定ができると思ったのですが、
うまく機能してくれずに fluent-plugin-forest を利用することにしました。