created: 2019-12-28T02:12:24.000Z
Fluentd→Bigquery タグごとに別テーブルにinsert
こんな設定でできる
<source>
  @type forward
</source>
<match bigquery.**>
  @type bigquery_insert
  <buffer tag>
    flush_interval 10
  </buffer>
  <inject>
    time_key time
    utc true
  </inject>
  auth_method json_key
  json_key /home/jibun/fluentd/xxxxxx-123456-35640a504591.json
  project myprj-135512
  dataset ${tag[1]}
  table ${tag[2]}
</match>
プレースホルダー
この部分の設定で、タグごとに別テーブルへとinsertしている
  dataset ${tag[1]}
  table ${tag[2]}
fluentdは現在のバージョンでは ${tag[1]} というようなプレースホルダーを設定に使うことができる
たとえば bigquery.mydataset.temperature タグを渡すと、
mydatasetというデータセットのtemperatureテーブルにデータを入れてくれる
time_key
  <inject>
    time_key time
time_key time という設定をいれておくと、
時間を指定せずにメッセージを送ってもtimeカラムに送信日時が入ってくれる
例
こんなコマンドを何回か叩いたとして
# timeカラムをメッセージに含めていない
echo "{\"value\": $RANDOM}" | fluent-cat bigquery.mydataset.temperature
これでちゃんと時間が入ってくれる
+---------------------+-------+
|        time         | value |
+---------------------+-------+
| 2019-12-28 02:11:26 | 25425 |
| 2019-12-28 02:11:28 | 13507 |
| 2019-12-28 02:11:33 | 31525 |
+---------------------+-------+
buffer tag
この設定がないと
 <buffer tag>
こんなエラーが出る
Parameter 'bigquery_insert: project=xxxxxx-123456/dataset=${tag[1]}/table=${tag[2]}/fetch_schema_table=/template_suffix=' has tag placeholders, but chunk key 'tag' is not configured
ちゃんとプレースホルダーのドキュメントに書いてあった
When the chunk keys are specified, these values can be extracted in configuration parameter values.
タグプレースホルダーを使うときはchunk-key(bufferの設定)のところでtagを指定しないとダメ
その他
@type bigquery_load を使う場合、 サービスアカウントに bigquery.jobs.create 権限が必要 (BigQuery編集者だとその権限はついていなかった)
また、bigquery_load ではデータが少量すぎると以下のようなエラーが出ていた
failed to poll load job error_class=Fluent::BigQuery::UnRetryableError error="notFound: Not found: Job penguin-171212:job_H555BgtYLRUQpxq-bnSBH3uAbBfn"
データはbigqueryに入っていたので、おそらく初回のポーリングまでに処理が終わってしまうような量だと発生するエラーかも
