fluent-plugin-bigquery利用時に、tableを動的に設定する

# 経緯

ちょうどログ解析基盤を移行しようとしていたところに、下記の記事が。
[Googleの虎の子「BigQuery」をFluentdユーザーが使わない理由がなくなった理由 #gcpja](http://qiita.com/kazunori279/items/10ac0066ac9b0b5aaaf3)

BigQueryは、社内の利用者も多いGoogle Apps Script用のAPIも用意されているので、これは検証せねばと思っていました。

検証には、こちらの記事がたいへん参考になりましたm(__)m
[FluentdでGoogle BigQueryにログを挿入してクエリを実行する](http://qiita.com/harukasan/items/0e0da49c65839e9517c4)

そして、課題も。。
[fluent-plugin-bigquery](https://github.com/tagomoris/fluent-plugin-bigquery)単体では、BigQueryの格納先tableを動的に変更することができません。

BigQueryの[Pricing](https://developers.google.com/bigquery/pricing)をみると、クエリ毎にtableのデータ量で課金されます。また、recordの削除はできないので、定期的にtableを変更してクエリ対象のtableが肥大化しすぎないように制御する必要があると認識しました。

先週、[Cloud Platform Developer Roadshow 2014](http://googledevjp.blogspot.jp/2014/05/cloud-platform-developer-roadshow-2014.html)の大阪会場に参加しましたので、質疑応答時に[kazunori279](http://qiita.com/kazunori279)さんに質問したり、懇親会で同じ悩みをもつ複数の方とお話しました。そこで、とりあえずIssue書こうと思ったんですが、やりとりが英語。。。

でもでも、よくよく考えると、[fluent-plugin-forest](https://github.com/tagomoris/fluent-plugin-forest)のplaceholderを利用すれば、実現できるのではないかと思って検証した結果がこちらになります。

# 検証結果

結論から言うと、出来ました。
検証環境は`Amazon Linux AMI 2014.03`、fluentdは`yum`で`td-agent`をインストールして検証しています。

2つのPluginを利用しています。
 * [fluent-plugin-record-reformer](https://github.com/sonots/fluent-plugin-record-reformer)
 * [fluent-plugin-forest](https://github.com/tagomoris/fluent-plugin-forest)

下記の例では、Apacheのaccess_logをBigQueryに格納する際に、月毎にテーブルを分割しています。また、Amazon S3にもバックアップしています。

```
<source>
  type tail
  format apache
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/httpd/access_log
  tag td.apache_access_log
  pos_file /var/lib/fluent/td.apache_access_log.pos
</source>

...

<match td.apache_access_log>
  type record_reformer
  enable_ruby true
  tag ${tag}.${time.strftime('%Y%m')}
  <record>
    input_tag    ${tag}
    port         ${port}
    host         ${host}
    user         ${user}
    method       ${method}
    path         ${path}
    http_version ${http_version}
    conde        ${conde}
    size         ${size}
    referer      ${referer}
    agent        ${agent}
  </record>
</match>

<match td.**>
  type forest
  subtype copy
  remove_prefix td
  <template>
    # Amazon S3
    <store>
      type s3
      s3_bucket s3-bucket
      path /
      buffer_path /var/log/td-agent/buffer/s3.${tag}.*.buffer
      time_slice_format ${tag_parts[0]}/%Y/%Y%m%d/${tag}-%Y%m%d-%H
    </store>
  </template>
  # Google BigQuery
  <case apache_access_log.**>
    <store>
      type bigquery
      method insert
      auth_method private_key
      email XXXXXXXXXXXX@developer.gserviceaccount.com
      private_key_path /etc/td-agent/XXXXXXXXXXXX-privatekey.p12
      project your-project-id
      dataset your_dataset
      table apache_access_log_${tag_parts[-1]}
      time_format %s
      time_field time
      schema_path /etc/td-agent/apache_access_log_schema.json
    </store>
  </case>
</match>
```

ポイントは2つです

 1. `record_reformer`を利用して、`enable_ruby true`としつつ、tagの末尾に年月`tag ${tag}.${time.strftime('%Y%m')}`を付与しています。
 2. `bigquery`にて、`table apache_access_log_${tag_parts[-1]}`とすることによって、格納先のtableを月毎に自動的に分割します。
 

# 課題
 * BigQueryのtable作成は、別途仕組みを作る必要があります。
 * `record_reformer`にて、`enable_ruby true`とすることは、推奨されていないようです。

```
but, please note that enabling ruby codes is not encouraged by security reasons and also in terms of the performance.
```

ということで、`fluent-plugin-bigquery`自体で、table分割に対応されると嬉しいなと思いました。