Fluent-Bit v0.11 リリース

Fluent-Bit v0.11 が2017/03にリリースされました。今回のリリースはかなりすごいですよ!

http://fluentbit.io/download/

おおまかなTopic

  • in_tail Plugin (ログをはじめとするファイルの各行を収集)
  • in_disk Plugin (ストレージへの Read/Write アクセスサイズを収集)
  • in_proc Plugin (特定プロセスのメモリ使用量やfd消費数を収集)
  • out_file Plugin (ファイルへの出力)
  • Filter Plugin
  • Parser
  • out_forward に Secure forward mode追加
  • in_memの書式がfree(1)っぽくなりました

あたりでしょうか。他にも色々と新機能がありますので詳しくは公式のリリースノートを参照ください。

Fluent Bit v0.11.0 - Release Notes

では、個別に追って見ましょう。

in_tail Plugin & Parser

本家 Fluentd でも利用頻度が高いと思われるin_tail Plugin、ついにFluent-bitに実装されました! 後述のParser機能と組み合わせることで、お手持ちのログを構造化しつつ転送できます。 ログローテーションや、アスタリスク指定による複数ファイルにも対応しています。

Parser にはOnigmoが、ログファイル内の位置情報を記憶しておくために、sqlite3が使われています。 本家Fluendにはまだまだ及びませんが、プロパティが充実していますので詳しくはドキュメントを参照してください。

Tail · Fluent Bit v0.11 Documentation

in_tail 応用例

Parserを使うことで、ログの各行を構造化することができます。これ非常に強力ですよ。 nginxやApacheのParserはデフォルトで入っていますので、下記のファイルを使いましょう。 おおまかにはParserファイルを指定し、そのファイルの中のどの正規表現を使うか更に指定する流れになります。

fluent-bit/parsers.conf at master · fluent/fluent-bit · GitHub

では、nginxのログをパースして構造化してみましょう。 サンプルのログは下記から取得してみました。

github.com

-R オプションでparsers.confを指定し、その中に書かれている定義を、in_tailの"parser"プロパティで指定します。 コマンドラインでのサンプルは下記です。下記のようにログ一行が構造化されている様子が分かるかと思います。

$  fluent-bit -i tail -p 'path=./nginx_logs' -p parser=nginx  -R ../conf/parsers.conf -o stdout
Fluent-Bit v0.11.0
Copyright (C) Treasure Data

[2017/04/04 23:32:12] [ info] [engine] started
[0] tail.0: [1431817532, {"remote"=>"93.180.71.3", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"304", "size"=>"0", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"}]
[1] tail.0: [1431817523, {"remote"=>"93.180.71.3", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"304", "size"=>"0", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"}]
[2] tail.0: [1431817524, {"remote"=>"80.91.33.133", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"304", "size"=>"0", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.17)"}]
[3] tail.0: [1431817534, {"remote"=>"217.168.17.5", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"200", "size"=>"490", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.10.3)"}]
[4] tail.0: [1431817509, {"remote"=>"217.168.17.5", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_2", "code"=>"200", "size"=>"490", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.10.3)"}]

設定ファイルは下記。適宜ファイルパスを置き換えてください。

[SERVICE]
    Parsers_File /path/to/parsers.conf

[INPUT]
    Name        tail
    Path        /path/to/nginx_logs
    
    # nginx is defined parsers.conf
    Parser      nginx

[OUTPUT]
    Name   stdout
    Match  *

in_disk Plugin

ストレージへのRead/Write アクセスサイズを定期収集するプラグインが追加されました。 内部的には/proc/diskstatsを定期的に読み出し、前回からの差分サイズを計算・収集しています。*1 デフォルトでは、/proc/diskstats全てのアクセスについて対象としていますが、 “dev_name” プロパティを指定することでアクセス対象を限定することが出来ます。(e.g. -p dev_name=sda3 のような感じです。)

$ fluent-bit -i disk -p dev_name=sda3 -o stdout
Fluent-Bit v0.11.0
Copyright (C) Treasure Data

[2017/01/28 16:58:16] [ info] [engine] started
[0] disk.0: [1485590297, {"read_size"=>0, "write_size"=>0}]
[1] disk.0: [1485590298, {"read_size"=>0, "write_size"=>0}]
[2] disk.0: [1485590299, {"read_size"=>0, "write_size"=>0}]
[3] disk.0: [1485590300, {"read_size"=>0, "write_size"=>11997184}]

設定ファイル形式の場合は、下記のような書式で設定します。

[INPUT]
    Name disk
    Tag  disk.all
    Dev_Name sda3

in_proc Plugin

特定プロセスのメモリ使用量等を収集するプラグインになります。例えば、プロセスのリーク監視に使えるかと思います。 mem.*というキーで、/proc/PID/statusの各種メモリ使用量を収集します。*2 各々の値の詳細はman procを参照してください。オープン中のfd個数も収集します。

$ fluent-bit -i proc -p proc_name=fluent-bit -o stdout
Fluent-Bit v0.11.0
Copyright (C) Treasure Data

[2017/01/30 21:44:56] [ info] [engine] started
[0] proc.0: [1485780297, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1120000, "mem.VmRSS"=>1120000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]
[1] proc.0: [1485780298, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1148000, "mem.VmRSS"=>1148000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]
[2] proc.0: [1485780299, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1152000, "mem.VmRSS"=>1148000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]
[3] proc.0: [1485780300, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1152000, "mem.VmRSS"=>1148000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]

out_file Plugin

収集したデータをファイルに吐き出すことができるプラグインです。現在はJSONフォーマットのみの出力になります。 出力先のファイル名は"path"プロパティで指定可能ですが、未指定の場合はタグ名でファイルを生成します。

$ fluent-bit -i mem -o file
Fluent-Bit v0.11.0
Copyright (C) Treasure Data

[2017/04/04 22:58:50] [ info] [engine] started
^C[engine] caught signal

mem.0というタグ名でファイルが出力されますので、catしてみます。

$ cat mem.0 
mem.0: [1491314331, {"Mem.total":1016044, "Mem.used":772140, "Mem.free":243904, "Swap.total":2064380, "Swap.used":149084, "Swap.free":1915296}]
mem.0: [1491314332, {"Mem.total":1016044, "Mem.used":772172, "Mem.free":243872, "Swap.total":2064380, "Swap.used":149084, "Swap.free":1915296}]
mem.0: [1491314333, {"Mem.total":1016044, "Mem.used":772172, "Mem.free":243872, "Swap.total":2064380, "Swap.used":149084, "Swap.free":1915296}]
mem.0: [1491314334, {"Mem.total":1016044, "Mem.used":772148, "Mem.free":243896, "Swap.total":2064380, "Swap.used":149084, "Swap.free":1915296}]

設定ファイルによる指定は下記のような感じです。

[OUTPUT]
    Name file
    Match *
    Path output.txt

Filter Plugin

Filter Pluginのサポートが入りました。v0.11ではfilter_stdout, filter_grep, filter_kubernetesが使用可能です。 余剰な情報をフィルタすることで、過度なログ転送を抑制することができ、送信先の負荷を減らすことができます。

filter_grep

正規表現を使い、マッチするログのみ送信(Regex)、マッチするログのみ抑制(Exclude)することができます。

設定ファイルの例は下記。in_tailの例に併せて404のログのみ出力してみましょう。

[SERVICE]
    Parsers_File /path/to/parsers.conf

[INPUT]
    Name        tail
    Path        /path/to/nginx_logs
    Parser      nginx

[FILTER]
    Name  grep
    Match *
    Regex code 404

[OUTPUT]
    Name   stdout
    Match  *

出力例は下記です。404なログのみ出力されていることがお分かり頂けるでしょうか。 逆に404のログだけ除外したい場合は、上記設定ファイルの"Regex"を"Exclude"と置き換えてみてください。

$ fluent-bit -c tail.conf 
Fluent-Bit v0.11.0
Copyright (C) Treasure Data

[2017/04/04 23:52:06] [ info] [engine] started
[0] tail.0: [1431817502, {"remote"=>"217.168.17.5", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_2", "code"=>"404", "size"=>"337", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.10.3)"}]
[1] tail.0: [1431817542, {"remote"=>"217.168.17.5", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"404", "size"=>"332", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.10.3)"}]
[2] tail.0: [1431817545, {"remote"=>"46.4.66.76", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"404", "size"=>"318", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (1.0.1ubuntu2)"}]
[3] tail.0: [1431817526, {"remote"=>"93.180.71.3", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"404", "size"=>"324", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"}]
[4] tail.0: [1431817538, {"remote"=>"37.26.93.214", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_2", "code"=>"404", "size"=>"319", "referer"=>"-", "agent"=>"Go 1.1 package http"}]
[5] tail.0: [1431817511, {"remote"=>"93.180.71.3", "host"=>"-", "user"=>"-", "method"=>"GET", "path"=>"/downloads/product_1", "code"=>"404", "size"=>"340", "referer"=>"-", "agent"=>"Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"}]

filter_kubernetes

すいません、kubernetesに疎いのでドキュメントに丸投げします。メタデータの付加をしてくれる?そうです。

当初は組み込みにフォーカスしていたFluent-bitですが、軽量コンテナ内にも居場所を見つけたようなので、そこ向けの機能かと思われます。

Kubernetes · Fluent Bit v0.11 Documentation

out_forward に Secure forward mode追加

従来は平文通信のみだったのですが、TSL/SSLによる暗号通信にも対応したようです。 手元では試せていませんが、ドキュメントに詳しい設定方法がありますので参照ください。 Fluentdと同様に、基本的にSecure forward modeで運用することが推奨されていくと思われます。

Forward · Fluent Bit v0.11 Documentation

余談ですが、v0.11ではOutput側のみサポートで、Input側(つまりin_forward)はSecure forward には対応してなさげです。

in_memの書式がfree(1)っぽくなりました

in_memの書式がfree(1)っぽくなり、併せてSwap量も出力するようになりました。なお、単位はKBです。

$ fluent-bit -i mem -t memory -o stdout -m '*'
Fluent-Bit v0.11.0
Copyright (C) Treasure Data

[2017/03/03 21:12:35] [ info] [engine] started
[0] memory: [1488543156, {"Mem.total"=>1016044, "Mem.used"=>841388, "Mem.free"=>174656, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
[1] memory: [1488543157, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
[2] memory: [1488543158, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
[3] memory: [1488543159, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]

そのほか

他にもElasticSearch用のoutput PluginがLogstashフォーマットに対応したり、ネストしている出力にも対応したりしています。

余談

今回のリリースですが、なんとメインコミッタの@edsiperさんがプレゼン中にリリースしたとのこと! そんな技があったとは。

*1:procfsを使っているため、Linuxのみのサポートです。

*2:これも procfsを使っているため、Linuxのみのサポートです。