たごもりすメモ

コードとかその他の話とか。

LogStashからTreasure Dataにデータを投入する

このエントリは(2日遅れましたが)Treasure Data Advent Calendar 2015の12月25日分の記事です!

みなさんTreasure Dataにログ入れてますか? FluentdやEmbulkで入れてますよね?
しかし世界的に見てFluentdはまだまだ最有力のソフトウェアとは言えず、特にUSやヨーロッパのスタートアップ界隈ではLogStashが強い勢力を誇っています。Treasure Dataにログを投入するためだけにFluentdをインストールするのには抵抗のある向きもそちらには多いのです。

ということで、しょうがないから作りました! 本日から使えます。
logstash-output-treasure_data | RubyGems.org | your community gem host
tagomoris/logstash-output-treasure_data · GitHub

ただし現状ではdev releaseのライブラリに依存しており、この後ちゃんとメンテナンスリリースが出せるよう直すつもりです。また公式のlogstash-pluginsに入れてもらえるようにするつもりです。2016年かな。

How to install / use

LogStashを手元に展開したら、以下のコマンド一発でインストールできます。

$ bin/plugin install logstash-output-treasure_data
Validating logstash-output-treasure_data
Installing logstash-output-treasure_data
Installation successful

そして設定ファイルを用意します。以下の設定は stdin を用いて標準入力から1行ずつ読み込み message というフィールドに入れ、そのイベントを treasure_data プラグインを用いてTreasure Dataの指定したデータベース/テーブルにアップロードします。(API Keyやデータベース名、テーブル名は実際に使用するものに置き換えてください)

input {
  stdin {}
}
output {
  treasure_data {
    apikey => "0/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    database => "dbname"
    table => "tablename"
  }
}

準備できたら起動するだけです。コンソールにメッセージを適当に入力し、終わったら Ctrl-D で入力を終端できます。終端したら自動的にflushされ、Treasure Dataへのアップロードが行われます。

$ bin/logstash -f ~/example.conf 
Settings: Default filter workers: 2
Logstash startup completed
line 1
line 2
line 3
line 4
line 5
Logstash shutdown completed

https://i.gyazo.com/fc5b009f4ce425e49e17b2e59daa0b38.png

簡単ですね! やった!

注意点

LogStashはソフトウェアの機能としてはバッファリング機構を持っておらず、そのため logstash-output-treasure_data では他の多くのプラグインにあわせる形で、オンメモリでのキャッシュを行っています。
Treasure Dataにあまり細かい単位でbulk importを行うのは非常に効率が悪いため、現在はデフォルトでは10,000レコード、もしくは5分毎にflushを行うことになっています。*1

通常の手順でLogStashをシャットダウンすればその際にflush/uploadが行われますが、プロセスの異常終了などが起きた場合はメモリ内のデータは失われるのでご注意ください。

まとめ

Happy Logging!

*1:これらの設定は flush_size および flush_interval で制御できます。