fluent-plugin-tdの説明


英語では少し情報はあるんですが，日本語だとTreasure DataのFluentdプラグインのまとまった情報がない気がしたので，とりあえず書いておく．いずれは公式ブログとかドキュメントの日本語化がされた時に整理されて公開される予定です．

Treasure Dataに関しては，公式サイトや公式ブログに色々と記事が公開されているので，参照してみてください．

http://www.treasuredata.com/jp/
http://treasure-data.hateblo.jp/

# Treasure Dataプラグインについて

https://github.com/treasure-data/fluent-plugin-td

その名の通りTreasure Dataにログを転送するFluentdプラグインです．Treasure DataのデータストアはスキーマレスなのでひたすらJSONなログを突っ込むことが出来，Fluentdと相性が良いです．実際はSchema on Readのアプローチをとっていて，読むときにデータに対してスキーマを付与出来ます．今ならAuto-update Schemaの機能があるので，データを元に自動でスキーマが付与されます(もちろん変更可能)．

## 設定

以下は簡単な例で，3分間隔でTreasure Dataにデータをインポートします.

```aconf
<match td.*.*>
  type tdlog
  apikey YOUR_API_KEY

  auto_create_table
  buffer_path /var/log/td-agent/tdlog
  flush_interval 180  # second unit
</match>
```

設定出来る項目についてそれぞれ説明します．

* type

`tdlog`を指定します．

* apikey

必須項目です．Treasure DataのAPIキーを設定します．

* auto_create_table

デフォルトでtrueです．書き込み先のデータベースやテーブルが存在しない場合に自動でデータベース・テーブルを作ります．最初に書いた通りTreasure Dataのテーブルはスキーマが必須ではないので，アプリケーションの用件に合わせてその場で自動で作ることが出来ます．

* database / table

Treasure Dataに保存するデータベース名とテーブル名を指定します．`auto_create_table`が`true`の場合には，なければ自動で作られます．

これらはオプショナルな設定です．これらを指定しない場合には，タグを`.`で分割したものがデータベース名・テーブル名に使われます．使われる部分は，タグの後ろ2個分です．例えば以下のようになります．

```
foo.bar # データベースがfoo，テーブルがbar
foo.bar.baz  # データベースがbar，テーブルがbaz
foo.bar.baz.qux # データベースがbaz，テーブルがqux
```

実際の所，`database` / `table`オプションを省略してアプリケーションからタグで指定し，ログの対象が増えてもFluentdの設定を変更しなくて良いようにしているユーザが多いです．`td`をprefixにして，`td.app.event`のようなタグがよく使われます．

* http_proxy

プロキシがある場合に設定します．

* tmpdir

Treasure Dataにデータをあげるチャンクを加工するときに使うディレクトリです．通常だとRubyの`Dir.tmpdir`が使われるのでこれで問題ないと思います．どうしてもディレクトリを変更したい時だけ指定してください．

* connect_timeout
* read_timeout
* send_timeout

名前の通り，データを転送するときの各フェイズのタイムアウトの設定です．ネットワークに問題がある環境以外では，設定する必要はないです．

* buffer_type
* buffer_path
* buffer_chunk_limit
* buffer_queue_limit
* flush_interval
* num_threads

`tdlog`は[BufferedOutputプラグイン](http://docs.fluentd.org/articles/output-plugin-overview#overview)なので，バッファやフラッシュ間隔も設定出来ます．Treasure Data自体にはMongoDBやBigQueryのようなインポートにおける容量制限や流量制限はないので，ログの流量に合わせて調整します．よほどトラフィックが多くない限りは，デフォルトで問題ないです．

`flush_interval`に関しては，スループットをあげるために数秒とかではなく，1分以上の方が良いと思います．デフォルトだと5分です．

`tdlog`は他の`BufferedOutput`プラグインとは違い，デフォルトで`buffer_type`が`file`になっています．そのため`buffer_path`を指定する必要がありますが，td-agentに同梱している設定だとすでに適切な場所を指定済みなので，そのままで問題ないです．

## 動作例

以下の設定ファイルでFluentdを起動し，

```aconf
<source>
  type forward
</source>

<match td.**>
  type tdlog
  apikey YOUR_API_KEY

  auto_create_table
  # for testing
  buffer_type memory
  flush_interval 10s
</match>
```

以下のコマンドを打てば，

    $ echo '{"app":"command", "id":1, "message":"Hi!"}' | fluent-cat td.fluent.test

10秒以内にデータが入ります．[Treasure DataのWebコンソール](https://console.treasuredata.com)からテーブルは確認可能で．タグベースでデータベース・テーブルが作られ，データに合わせて自動でスキーマが付与されてるのが分かります．

![td_fluentd_table_test.png](https://qiita-image-store.s3.amazonaws.com/0/566/3f046d01-43d3-a076-a94d-dfc2ba621678.png "td_fluentd_table_test.png")

### fluent-plugin-tdのインストール

td-agentを使っている場合には最初から同梱されています．Fluentdを直接利用している場合には，以下のコマンドでインストールしてください．

    $ fluent-gem install fluent-plugint-td

## Treasure Data側での重複排除

Treasure Dataにデータをインポートする時には，unique idを指定することが出来ます．unique idを覚えておくことで，各インポートをまたいでの重複を検知しています．例えば，`tdlog`プラグインはバッファチャンクからunique idを生成し，データのインポートを行っています．
これにより，ネットワークの不調によってデータのインポートは成功しているのにリトライが起こった場合などで，重複してデータがインポートされないようにしています．現在のチェック間隔は12分です．このチェック間隔は，バックエンドの改善によってもっと伸びる可能性があります．

## まとめ

Fluentdプラグインの簡単な説明と，それに関係ありそうな情報を書いてみました．

Treasure Dataには他にも[JS SDK](http://docs.treasure-data.com/articles/javascript-sdk)や[Mobile SDK](http://docs.treasure-data.com/categories/mobile-sdks)などがあり，Fluentd(td-agent)にこだわらなくても簡単にデータを貯めることができるので，この辺の紹介もいずれやる予定です(他の人が書くかもしれない)．

またフリープランがあるので，興味のある方はアカウント作ってどんな感じか簡単に触れてみることが出来ます．[Result機能](http://docs.treasure-data.com/categories/result)を使えば，スケジューリングと合わせて外部の可視化ツールで簡易レポーティングとかｻｸｯと作れるので，趣味のデータ集めはこれで困ってなかったりも([この記事](http://qiita.com/inokappa/items/03ce0240300ba489b239)だとGoogle Spreadsheetと連携)．いずれはこの辺も何か書ければなぁとは思ってます．

### 関連リンク

- [Treasure Data JavaScript SDKの使い方](http://qiita.com/kzk9/items/15f4e01cafa30fb8e7a5)

JavaScript SDKの使い方に関する記事．