日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

fluentdのout exec pluginの使い方がわからなかったから色々試してみた

タイトルの通り
fluentdのout exec pluginを試してみました。

http://docs.fluentd.org/articles/out_execdocs.fluentd.org

リンクが切れていたので追記です。
docs.fluentd.org

概要

dummerによって作成したltsv形式のlogファイルをtail input pluginで監視して
exec output pluginで何らかの操作をする

ということをします。

dummerなどについては下記の記事を参考にしていただければと・・・

arata.hatenadiary.com

構成

fluentd 0.12.7

$tree
.
├── dummer.conf.rb
├── exec.sh
├── fluent.conf

dummer.conf.rb

configure 'sample' do
  output "dummy.log"
  rate 500
  delimiter "\t"
  labeled true
  field :id, type: :integer, countup: true, format: "%04d"
  field :time, type: :datetime, format: "[%Y-%m-%d %H:%M:%S]", random: false
  field :uri, type: :string, any: %w[/api/v1/people /api/v1/textdata]
end

dummer -c dummer.conf.rb によってこんなログが吐出されます。

$tail -n 2 dummy.log
id:36798	time:[2015-05-20 21:15:56]	uri:/api/v1/textdata
id:36799	time:[2015-05-20 21:15:56]	uri:/api/v1/people


fluentd.conf (初期段階)
はじめこんな感じでやりました。
この後matchの方に flush_interval が追加されます。

<source>
    type tail
    format ltsv
    path ./dummy.log
    tag dummy
    time_format "[%Y-%m-%d %H:%M:%S]"
</source>

<match **>
    type exec
    command sh ./exec.sh
    buffer_path ./pos
    format json
</match>

exec.sh (初期段階)

引数に何が来るのだろうと思っていたので、これを試しました。

#!/bin/sh

echo $0 >> out
echo $@ >> out

検証

iterm2で3画面用意します。
ディレクトリに移動後

  • dummer -c dummer.conf.rb
  • fluentd -c fluentd.conf
  • tail -f out

を実行します。
そしたら長いこと何も表示されませんでした・・・
なんでだろうと思って色々ググってたら下記にたどり着きました。

いますぐ実践! Linuxシステム管理


そこにこう書かれていました。
"「flush_interval」パラメータでは、どのくらいの頻度でコマンドを実行するのか、 時間を指定します。ログが来る度にコマンドを実行していては非効率ですので、 ある程度溜まったところで実行します。時間には「s」「m」「h」をつけます。 (ご想像通り、それぞれ、秒、分、時です。)"

flush_intervalってexecのコマンドをflushするintervalだったのか。
なのでfluentd.confを書き換えます。

fluentd.conf

<source>
    type tail
    format ltsv
    path ./dummy.log
    tag dummy
    time_format "[%Y-%m-%d %H:%M:%S]"
</source>

<match **>
    type exec
    command sh ./exec.sh
    buffer_path ./pos
    format json
    flush_interval 1s
</match>

これでどうだ。

  • dummer -c dummer.conf.rb
  • fluentd -c fluentd.conf
  • tail -f out

を実行

tailしていたoutファイルに変化がありました。

./pos.20150520.q5168261e2abaa54e.log
./exec.sh
./pos.20150520.q5168262012571269.log
./exec.sh
./pos.20150520.q51682621fa56206b.log
./exec.sh
./pos.20150520.q51682623e28036a2.log
./exec.sh
./pos.20150520.q51682625caa5b704.log

なるほど。
引数にposファイルを渡すのか。
それでflushなんですね。
なので、exec.shを下記のようにしてみました。

exec.sh

#!/bin/sh

cat $1

そしたらfluentd -c fluentd.confしている画面にexec.shによる標準出力が現れました。

{"id":"16845","uri":"/api/v1/people"}
{"id":"16846","uri":"/api/v1/people"}
{"id":"16847","uri":"/api/v1/people"}
{"id":"16848","uri":"/api/v1/people"}
{"id":"16849","uri":"/api/v1/textdata"}

こんな感じ

所感

exec plugin使い方がわかりました。
これで以前作ったSlackRTMpluginと合わせてslackの投稿があったら、何かするということがリアルタイムに出来そうです。

ref
arata.hatenadiary.com