Fluentdプラグイン in_exec, out_execの動作を確認する

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)の領域だし。とはいえ、この辺りをゴニョゴニョすると面白いことができそうではある。