Edited at
FluentdDay 14

FluentdでRuby DSLを使う

More than 3 years have passed since last update.


Ruby DSLとは?

fluentdの設定のRuby DSL的な記法。

--use-v1-configでRubyのコードを設定に書くことが出来ますが、さらに柔軟な記法が可能になる。

以前調べていたことがあるので、まとめてみる。


実行方法

設定ファイルの拡張子がrbであればDSLモードで起動する

$ fluentd -c fluent.rb


どう書く?

これが、


fluent.conf

<match {foo,bar}.**>

type stdout
</match>

<match hoge.**>
type copy
<store>
type stdout
</store>
<store>
type file
path /tmp/hoge.txt
</store>
</match>

<source>
type forward
</source>


こうなる。


fluent.rb

match ('{foo,bar}.**') {

type :stdout
}

match ('hoge.**') {
type :copy
store {
type :stdout
}
store {
type :file
path "/tmp/hoge.txt"
}
}

source {
type :forward
}



eachを使う

これだけだとちょっとメリットがわかりづらいので。

もうちょっとわかりやすく。

これが、


fluent.conf

<match foo1.**>

type stdout
</match>

<match foo2.**>
type stdout
</match>

<match foo3.**>
type stdout
</match>

<match foo4.**>
type stdout
</match>


こうなる。


fluent.rb

(1..4).each do |i|

match ("foo#{i}.**") {
type :stdout
}
end


ifで分岐

web系のサーバではtailするとか


fluent.rb

source {

type :forward
}

hostname = ruby.open('|hostname').read.strip

if hostname.include?('web')
source {
type :tail
path "/var/log/httpd/access_log.ltsv"
format 'ltsv'
time_key 'time'
time_format "%d/%b/%Y:%H:%M:%S %z"
pos_file "/tmp/access.pos"
tag "hogehoge.batch"
}
end


三項演算子とか

hostname = ruby.open('|hostname').read.strip

match ('hoge.**') {
type :file
path hostname.include?('web') ? "/tmp/web.txt" : "/tmp/batch.txt"
}


外部ライブラリ読み込む

dotenv使ってHIPCHATのtokenを隠蔽するとか


fluent.rb


ruby.require 'dotenv'
Dotenv.load!
ruby.puts ENV['HIPCHAT_API_TOKEN']

match ('hipchat.**') do
type :hipchat
default_room '000000'
api_token ENV['HIPCHAT_API_TOKEN']
default_from 'fluentd'
default_color 'red'
default_notify 0
default_format 'html'
end


openとかputsとかrequireなどのrubyの処理を記述する際は、prefixにrubyをつける必要がある。


pluginのパラメータにArrayやHashを使う

plugin側が対応している必要があるが、ArrayやHashも使える。


fluent.rb

name = 'user3'

match ('hoge.**') do
type :hoge
tags [ "java", "ruby" ]
user id: 3, name: name
users [
{ id: 1, name: 'user1' },
{ id: 2, name: 'user2' }
]
end


  • 上記の例ではtagsはArray、userはHash。

  • usersの例のように改行して記述できる。(v1記法でも可能)


td-agentで使う場合

/usr/sbin/td-agentを書き換える


/usr/sbin/td-agent

-ENV["FLUENT_CONF"]="/etc/td-agent/td-agent.conf"

+ENV["FLUENT_CONF"]="/etc/td-agent/td-agent.rb"


  • 拡張子が.rbだったらdslで設定が読み込まれる。(参考)


備考


  • includeは現状は使えないが、ここにissueが上がっている。


    • rubyなのでevalでゴニョゴニョやれば出来るかもしれない。。(未確認)