td-agent3（Fluentd v1.0）でBigQueryにログを保存する。2018-03-07

# 内容
https://github.com/kaizenplatform/fluent-plugin-bigquery を参考に、`td-agent3`（`Fluentd v1.0`）で `BigQuery` にログを保存する設定をします。

# 準備
* `td-agent3`（`Fluentd v1.0`）のインストールは済んでいるものとします
    * 参考: [Ubuntu 16.04.3 LTSにtd-agent3（Fluentd v1.0）をインストールする](https://qiita.com/abetomo/items/86d5c0ab152a593d9fc7)
* GCP、BigQueryでの準備作業が必要になりますが、割愛します


# `fluent-plugin-bigquery` のインストール
* `fluent-plugin-bigquery` というプラグインが必要なのでインストールします。
* インストールで使うコマンドは `/opt/td-agent/embedded/bin/fluent-gem` にあります。

# インストール
```
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-bigquery
... 表示が多いので詳細は割愛
Done installing documentation for uber, declarative, declarative-option, representable, retriable, mime-types-data, mime-types, little-plugger, logging, jwt, memoist, os, signet, googleauth, google-api-client, fluent-plugin-bigquery after 159 seconds
16 gems installed
```

ちょっと時間がかかります

## 確認
```
$ /opt/td-agent/embedded/bin/fluent-gem list fluent-plugin-bigquery

*** LOCAL GEMS ***

fluent-plugin-bigquery (1.2.0)
```

# `fluent-plugin-bigquery@v2.0.0` のインストール（2018-03-07時点）
* `@type bigquery_insert`
* `@type bigquery_load`

を利用したいのですが、使えるのはv2.0.0からのようです。
上記の手順でインストールすると、v1.2.0 なので一手間かけてv2.0.0をインストールします。

## 追記
https://rubygems.org/gems/fluent-plugin-bigquery/versions/2.0.0.beta
gemに2.0.0.betaがあります。こちらをインストールすれば以下のGitHubからのインストールの必要はありません。

## GitHubからインストールする準備
```
$ sudo /opt/td-agent/embedded/bin/fluent-gem install --no-document specific_install
Fetching: specific_install-0.3.3.gem (100%)
Successfully installed specific_install-0.3.3
1 gem installe
```

## GitHubから最新の `fluent-plugin-bigquery` をインストール
```
$ sudo /opt/td-agent/embedded/bin/fluent-gem specific_install https://github.com/kaizenplatform/fluent-plugin-bigquery.git
/usr/bin/git
git installing from https://github.com/kaizenplatform/fluent-plugin-bigquery.git
Cloning into '/tmp/d20180307-1588-1vvfhc6'...
remote: Counting objects: 2133, done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 2133 (delta 60), reused 94 (delta 39), pack-reused 2008
Receiving objects: 100% (2133/2133), 461.14 KiB | 0 bytes/s, done.
Resolving deltas: 100% (799/799), done.
Checking connectivity... done.
WARNING:  open-ended dependency on rake (>= 0, development) is not recommended
  if rake is semantically versioned, use:
    add_development_dependency 'rake', '~> 0'
WARNING:  open-ended dependency on rr (>= 0, development) is not recommended
  if rr is semantically versioned, use:
    add_development_dependency 'rr', '~> 0'
WARNING:  open-ended dependency on test-unit (>= 0, development) is not recommended
  if test-unit is semantically versioned, use:
    add_development_dependency 'test-unit', '~> 0'
WARNING:  open-ended dependency on test-unit-rr (>= 0, development) is not recommended
  if test-unit-rr is semantically versioned, use:
    add_development_dependency 'test-unit-rr', '~> 0'
WARNING:  open-ended dependency on google-api-client (>= 0.11.0) is not recommended
  if google-api-client is semantically versioned, use:
    add_runtime_dependency 'google-api-client', '~> 0.11', '>= 0.11.0'
WARNING:  open-ended dependency on googleauth (>= 0.5.0) is not recommended
  if googleauth is semantically versioned, use:
    add_runtime_dependency 'googleauth', '~> 0.5', '>= 0.5.0'
WARNING:  open-ended dependency on multi_json (>= 0) is not recommended
  if multi_json is semantically versioned, use:
    add_runtime_dependency 'multi_json', '~> 0'
WARNING:  See http://guides.rubygems.org/specification-reference/ for help
  Successfully built RubyGem
  Name: fluent-plugin-bigquery
  Version: 2.0.0.beta
  File: fluent-plugin-bigquery-2.0.0.beta.gem
Successfully installe
```

## 確認
```
$ /opt/td-agent/embedded/bin/fluent-gem list fluent-plugin-bigquery

*** LOCAL GEMS ***

fluent-plugin-bigquery (2.0.0.beta, 1.2.0)
```


# 設定の例（bigquery_insert）
* ApacheのアクセスログをBigQueryに送る例です
* `auth_method` には `json_key` を使います

```conf:/etc/td-agent/td-agent.conf
# <source> についての詳細は割愛
<source>
  @type tail
  path /var/log/apache2/access.log
  tag apache.access
  pos_file /var/log/td-agent/apache-access-log.pos
  format apache2
  keep_time_key true
</source>

# <match> の内容が本題
<match apache.access>
  @type bigquery_insert

  auth_method json_key
  json_key /tmp/json_key.json

  project PROJECT_NAME
  dataset DATASET_NAME

  auto_create_table true
  table apache_access_%Y%m%d

  <buffer time>
    @type file
    path /var/log/td-agent/bigquery
    timekey 1d
  </buffer>

  <inject>
    time_key time
    time_type string
    time_format %Y-%m-%d %H:%M:%S
  </inject>

  schema [
    {"name": "time", "type": "TIMESTAMP"},
    {"name": "host", "type": "STRING"},
    {"name": "user", "type": "STRING"},
    {"name": "method", "type": "STRING"},
    {"name": "path", "type": "STRING"},
    {"name": "code", "type": "INTEGER"},
    {"name": "size", "type": "INTEGER"},
    {"name": "referer", "type": "STRING"},
    {"name": "agent", "type": "STRING"}
  ]
</match>
```

## 動作確認
以上の設定例で `td-agent` を起動してログ（`/var/log/td-agent/td-agent.log`）を確認します。
特に問題がなさそうであれば

```
$ while true; do curl localhost > /dev/null && sleep 1; done
```

などでアクセスログを出力して、BigQueryにログがたまっていくか確認します。

## BigQueryの状況を確認
* 日付付きのテーブルが自動で作成され、そこにinsertされました
    * <img width="505" alt="スクリーンショット 2018-03-07 12.11.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/3800/d760cd48-0cfa-c28a-d987-c82693525cf7.png">
* BigQueryにたまったログ

```sql
#standardSQL
SELECT
  *
FROM
  DATASET_NAME.apache_access_20180307
ORDER BY
  time DESC
```

<img width="785" alt="スクリーンショット 2018-03-07 12.10.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/3800/497e0a14-63e0-0dcb-baae-a0ae08558d29.png">


# 設定の例（bigquery_load）
* ApacheのアクセスログをBigQueryに送る例です
* `auth_method` には `json_key` を使います
* `flush_XXX` のdefalut値を参考にしつつ設定し、ある間隔で定期的に送るようにします
    * https://github.com/kaizenplatform/fluent-plugin-bigquery#buffer-section
* 上限があるので気をつけましょう
    * https://cloud.google.com/bigquery/quotas?hl=ja

```conf:/etc/td-agent/td-agent.conf
# <source> についての詳細は割愛
<source>
  @type tail
  path /var/log/apache2/access.log
  tag apache.access
  pos_file /var/log/td-agent/apache-access-log.pos
  format apache2
  keep_time_key true
</source>

# <match> の内容が本題
<match apache.access>
  @type bigquery_load

  auth_method json_key
  json_key /tmp/json_key.json

  project PROJECT_NAME
  dataset DATASET_NAME

  auto_create_table true
  table apache_access_%Y%m%d

  <buffer time>
    @type file
    path /var/log/td-agent/bigquery
    timekey 1d

    flush_at_shutdown true
    flush_interval 25
  </buffer>

  <inject>
    time_key time
    time_type string
    time_format %Y-%m-%d %H:%M:%S
  </inject>

  schema [
    {"name": "time", "type": "TIMESTAMP"},
    {"name": "host", "type": "STRING"},
    {"name": "user", "type": "STRING"},
    {"name": "method", "type": "STRING"},
    {"name": "path", "type": "STRING"},
    {"name": "code", "type": "INTEGER"},
    {"name": "size", "type": "INTEGER"},
    {"name": "referer", "type": "STRING"},
    {"name": "agent", "type": "STRING"}
  ]
</match>
```

## 動作確認
`bigquery_insert` のときと同様

## BigQueryの状況を確認
* 基本的に `bigquery_insert` のときと変わらないので詳細は割愛
* `flush_XXX` の間隔である程度たまってから送られていた

# まとめ
`td-agent3`（`Fluentd v1.0`）で `BigQuery` にログを保存できました。

# その他
## エラーが出た
```
[error]: #0 Permission denied @ rb_sysopen - /var/log/apache2/access.log
```

のようなエラーが出るときはchmodします。

```
$ sudo chmod -R 755 /var/log/apache2/
```

## エラーが出た2
`fluent-plugin-bigquery` もエラーを出していましたが、beta版なので気にしないことにしました
エラーは出ましたが、それっぽく動いていました