Fluentdの組み込みプラグインに、 in_exec / out_exec というのがある。
- in_exec
任意のコマンド/プログラムの実行結果をイベントのソースとする - out_exec
イベントのMsgをファイルとして任意のコマンド/プログラムに渡す。そのファイル名が引数となる。
インターバルを指定し、その間隔においてプログラムが実行される。
…と聞いても分かったような分からないような微妙な心境なので、とにかく動かす。実行環境はAWS上のCentOS6.5 1台。td-agentはインストール済み。
in_execの動作を確認してみる。こんなスクリプトを用意。
random_number.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import random for i in range(0, 30): print random.choice( [0,1,2] )
はい、以上。
このスクリプトを、in_execで実行するための設定が以下のようになる。
/etc/td-agent/td-agent.conf
<source> type exec command /tmp/random_number.py keys val tag in_exec_test time_format %Y-%m-%d %H:%M:%S run_interval 5s </source> <match in_exec_test.**> type file path /var/log/fluentd/in_exec_log </match>
td-agentを再起動後、/var/log/fluentd/in_exec_logにcommandの実行結果が吐き出され、以下のようなログが生成された。real worldのユースケースとしては、統計情報を送り込んだり、あたりか。
$ tail -f /var/log/fluentd/in_exec_log.20140712.b4fdfe77b1fd5c888
2014-07-12T12:49:09Z in_exec_test {"val":"1"}
2014-07-12T12:49:09Z in_exec_test {"val":"0"}
2014-07-12T12:49:09Z in_exec_test {"val":"1"}
2014-07-12T12:49:09Z in_exec_test {"val":"0"}
2014-07-12T12:49:09Z in_exec_test {"val":"1"}
2014-07-12T12:49:09Z in_exec_test {"val":"2"}
:
:
次にout_exec。(参考: fluentdに画像データを送ってみる)
必要なディレクトリを作成。
$ sudo mkdir -p /var/td-agent/{bin,tmp}
$ sudo mkdir -p /var/td-agent/data/test
$ sudo chown -R td-agent:td-agent /var/td-agent
以下、execで実行させるスクリプト。引数として渡されたイベントの中身をそのままファイルに吐き出しているだけで本来必要のないものではあるが、まぁとにかく動作をチェックしたかったので。6行目の sys.argv[1]
が、イベントを含むファイル名に相当する。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys r = open(sys.argv[1], 'rb') f = open('/var/td-agent/data/test/out_exec.log', 'ab') strList = r.readlines() for line in strList: f.write(line) f.close()
td-agent.conf はこんな風。テンプレートの中身は残しておいて、最後に追記する。
<match out_exec_test.**> type exec command /usr/bin/python /var/td-agent/bin/out_test.py time_key got_at time_format %Y-%m-%d %H:%M:%S format json flush_interval 5s buffer_path /var/td-agent/tmp/buffer </match>
td-agent再起動後、以下によりMsgを投入。
$ curl -X POST -d 'json={"msg":"Wooooooooooow!"}' http://localhost:8888/out_exec_test.test
$ curl -X POST -d 'json={"msg":"Yeeeeeeeeeeey!"}' http://localhost:8888/out_exec_test.test
すると指定したファイルにMsgが記録された!この時引数として渡されるファイルは/var/td-agent/tmp/buffer.yyyymmdd.[hash値].log
となるが、バッファがクリアされたら消滅する。なるほどぉー。
(淡々と書いているようだが、実は動きがわかって嬉しい)
$ cat /var/td-agent/data/test/out_exec.log
{"msg":"Wooooooooooow!","got_at":"2014-07-13 02:24:18"}
{"msg":"Yeeeeeeeeeeey!","got_at":"2014-07-13 02:25:16"}
ということで一応out_execの動きは理解できたが、本来であれば外部プログラムを実行させるのではなくRubyプラグインを作るのが本筋なんだろうし、こういった外部プログラムにゴリゴリ複雑な処理をさせるのも本来の使い方ではないんだろうな、という気がする。そうなるとまさにCEP(complex event processing)の領域だし。とはいえ、この辺りをゴニョゴニョすると面白いことができそうではある。