fluentdでBigQueryにログを送る設定とハマった時のTips

fluentd触ったことなかったので所々ハマってしまったのと、ハマった時こうデバッグしましたみたいのをメモにしておく。 にしてもfluentdよくできてると思った。 fluentdのイベントサイクルに関してはこのDocがとにかくわかりやすい

docs.fluentd.org

fluentdを起動して設定ファイルがあっているかとか、必要なプラグインがインストールされているかとかは一旦実行してみるといい。

$ fluentd -c fluent.conf

ハマりポイントを回避する1つの手段として、急に設定ファイルを頑張って書き始めないことだと思った。この記事でいうと「fluentdでBigqueryにログを投げる」という設定になるんですが、まずは導通テストをするのをオススメする。 fluentdは、sourceで指定したデータソースからmatchしたものを設定ファイルに基づいて出力するものなので、例えばこんな感じ。 インフラエンジニアとかにとっては当たり前なのかもしれない。アプリケーションエンジニアでいうところの、puts 'hogehoge'だろうなと思った。

<source>
  type forward
  port 24224
</source>
 
<match **>
  type stdout
</match>

24224ポートで受け取ったログソースで、**正規表現でいうところの全て)をstdout(標準出力)するものなので、少なくともアプリケーション側でログを投げるようにしてfluentdを起動すれば受け取るログ全てを出力することになる。ここで、何もログが測れないのであれば何がおかしいかの調査のスコープを狭くできるのでおすすめ。

fluentd -> Bigquery

fluentd -> Bigqueryに関してはgemがあってこちらを使用させてもらった。

github.com

documentationも充実して素晴らしいOSSです。 サーバー側でgemをインストール

$ fluent-gem install fluent-plugin-bigquery

ストリーミングインサートするならばこんな感じで素直に動く。

<match dummy>
  @type bigquery_insert

 auth_method json_key
    json_key {
        "private_key": "private_key_from_gcp_account",
        "client_email":"email from gcp account"
    }

  project yourproject_id
  dataset yourdataset_id
  table   tablename

  schema [
    {"name": "time", "type": "INTEGER"},
    {"name": "status", "type": "INTEGER"},
    {"name": "bytes", "type": "INTEGER"},
    {"name": "vhost", "type": "STRING"},
    {"name": "path", "type": "STRING"},
    {"name": "method", "type": "STRING"},
    {"name": "protocol", "type": "STRING"},
    {"name": "agent", "type": "STRING"},
    {"name": "referer", "type": "STRING"},
    {"name": "remote", "type": "RECORD", "fields": [
      {"name": "host", "type": "STRING"},
      {"name": "ip", "type": "STRING"},
      {"name": "user", "type": "STRING"}
    ]},
    {"name": "requesttime", "type": "FLOAT"},
    {"name": "bot_access", "type": "BOOLEAN"},
    {"name": "loginsession", "type": "BOOLEAN"}
  ]
</match>

schemaに存在しないカラムがあったりするとBigQueryではエラーになるので、どういうログを扱うかにもよるかもしれないですが、ignore_unknown_valuesのオプションはtrueにすると良さそうだった。

References

fluentdの学習に以下のドキュメント、記事が本当に勉強になりました。素晴らしい記事を公開していただいていることに感謝しています。

Fluentdを使うアプリケーションの導通テストにstdoutプラグインを使う。 | 三度の飯とエレクトロン

Life of a Fluentd event - Fluentd

Fluentd と BigQuery を使用したリアルタイム ログ分析  |  ソリューション  |  Google Cloud

td-agentからデータをBigQueryに入れる | Simple is Beautiful.

Install by Ruby Gem - Fluentd