英語では少し情報はあるんですが,日本語だとTreasure DataのFluentdプラグインのまとまった情報がない気がしたので,とりあえず書いておく.いずれは公式ブログとかドキュメントの日本語化がされた時に整理されて公開される予定です.
Treasure Dataに関しては,公式サイトや公式ブログに色々と記事が公開されているので,参照してみてください.
http://www.treasuredata.com/jp/
http://treasure-data.hateblo.jp/
Treasure Dataプラグインについて
その名の通りTreasure Dataにログを転送するFluentdプラグインです.Treasure DataのデータストアはスキーマレスなのでひたすらJSONなログを突っ込むことが出来,Fluentdと相性が良いです.実際はSchema on Readのアプローチをとっていて,読むときにデータに対してスキーマを付与出来ます.今ならAuto-update Schemaの機能があるので,データを元に自動でスキーマが付与されます(もちろん変更可能).
設定
以下は簡単な例で,3分間隔でTreasure Dataにデータをインポートします.
<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プラグインなので,バッファやフラッシュ間隔も設定出来ます.Treasure Data自体にはMongoDBやBigQueryのようなインポートにおける容量制限や流量制限はないので,ログの流量に合わせて調整します.よほどトラフィックが多くない限りは,デフォルトで問題ないです.
flush_interval
に関しては,スループットをあげるために数秒とかではなく,1分以上の方が良いと思います.デフォルトだと5分です.
tdlog
は他のBufferedOutput
プラグインとは違い,デフォルトでbuffer_type
がfile
になっています.そのためbuffer_path
を指定する必要がありますが,td-agentに同梱している設定だとすでに適切な場所を指定済みなので,そのままで問題ないです.
動作例
以下の設定ファイルでFluentdを起動し,
<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コンソールからテーブルは確認可能で.タグベースでデータベース・テーブルが作られ,データに合わせて自動でスキーマが付与されてるのが分かります.
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やMobile SDKなどがあり,Fluentd(td-agent)にこだわらなくても簡単にデータを貯めることができるので,この辺の紹介もいずれやる予定です(他の人が書くかもしれない).
またフリープランがあるので,興味のある方はアカウント作ってどんな感じか簡単に触れてみることが出来ます.Result機能を使えば,スケジューリングと合わせて外部の可視化ツールで簡易レポーティングとかサクッと作れるので,趣味のデータ集めはこれで困ってなかったりも(この記事だとGoogle Spreadsheetと連携).いずれはこの辺も何か書ければなぁとは思ってます.
関連リンク
JavaScript SDKの使い方に関する記事.