Fluent-Bit v0.12 リリース

Fluent-Bit v0.12 が2017/08にリリースされました。parser pluginが少しずつ充実してきました。

http://fluentbit.io/download/

Fluent-Bit とは?

Cで書かれた軽量なLog forwarder です。どんなソフトかは下記記事を参照して下さい。

nokute.hatenablog.com

おおまかなTopic

  • ナノ秒サポート
  • in_netif Plugin (送受信パケット数、パケットサイズ収集)
  • in_dummy Plugin (テスト用ダミーデータ生成)
  • in_systemd Plugin (Systemdのログ収集)
  • filter_record_modifier (fieldの追加、余計なfieldの除去)
  • filter_parser (任意のfieldをparseして展開)
  • out_kafka_rest Plugin (Kafka REST Proxyサーバへの出力)
  • parser が型変換をサポート

そのほかもいくつか変更点があります。詳しくは公式のリリースノートを参照してください。

Fluent Bit v0.12.0 - Release Notes

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

ナノ秒サポート

Fluent-bitもナノ秒単位でタイムスタンプを取り扱うようになりました。

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

[2017/08/21 22:17:46] [ info] [engine] started
[0] mem.0: [1503321467.000308167, {"Mem.total"=>3920464, "Mem.used"=>3490564, "Mem.free"=>429900, "Swap.total"=>2064380, "Swap.used"=>0, "Swap.free"=>2064380}]
[1] mem.0: [1503321468.000348090, {"Mem.total"=>3920464, "Mem.used"=>3490596, "Mem.free"=>429868, "Swap.total"=>2064380, "Swap.used"=>0, "Swap.free"=>2064380}]
[2] mem.0: [1503321469.000500532, {"Mem.total"=>3920464, "Mem.used"=>3490596, "Mem.free"=>429868, "Swap.total"=>2064380, "Swap.used"=>0, "Swap.free"=>2064380}]

従来どおりに秒単位で転送する(Fluentd v0.12系やFluent-Bit v0.11以前 に送信する場合など)

Fluentd v0.12はナノ秒単位のデータを取り扱えません。Fluentd v0.12やFluent-Bit v0.11以前に送信する(Forwardする)場合は、out_forward pluginの設定値Time_as_Integer をtrueにして使ってください。

[INPUT]
    Name  mem
    Tag   mem

[OUTPUT]
    Name  forward
    Match *
    Host  localhost
    Time_as_Integer true

in_netif Plugin (送受信パケット数、パケットサイズ収集)

ネットワークパケット数やサイズを定期収集するプラグインです。/proc/net/devを定期的にparseし、送受信パケット数やデータサイズを収集します。 監視するInterface名(e.g. eth0, ens33)が必要になりますので、ifconfigなどで確認の上ご利用ください。なお、verbose を指定すると取れるだけの情報を収集します。

$ fluent-bit -i netif -p interface=eth0 -o stdout
Fluent-Bit v0.12.0
Copyright (C) Treasure Data

[2017/08/21 22:32:30] [ info] [engine] started
[0] netif.0: [1503322351.000838300, {"eth0.rx.bytes"=>361466756, "eth0.rx.packets"=>270147, "eth0.rx.errors"=>0, "eth0.tx.bytes"=>9581090, "eth0.tx.packets"=>90412, "eth0.tx.errors"=>0}]
[1] netif.0: [1503322352.000757569, {"eth0.rx.bytes"=>98, "eth0.rx.packets"=>1, "eth0.rx.errors"=>0, "eth0.tx.bytes"=>98, "eth0.tx.packets"=>1, "eth0.tx.errors"=>0}]
[2] netif.0: [1503322353.000829344, {"eth0.rx.bytes"=>98, "eth0.rx.packets"=>1, "eth0.rx.errors"=>0, "eth0.tx.bytes"=>98, "eth0.tx.packets"=>1, "eth0.tx.errors"=>0}]

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

[INPUT]
    Name netif
    Tag  netif.all
    Interface eth0

in_dummy Plugin (テスト用ダミーデータ生成)

ダミーデータを生成するためのプラグインです。軽めの動作確認やバグ報告時の異常データ作成などに使えます。Fluentdのものを参考に移植しています。

下記のようにJSONでダミーデータを設定可能です。rateによって1秒間辺りに生成するイベント数を設定できます。

[INPUT]
    Name dummy
    Tag  dummy.data
    Dummy {"type":"test", "name":"john", "age":20}
    Rate 100

[OUTPUT]
    Name stdout
    Match *

コマンドラインだと下記のようになります。

$ fluent-bit -i dummy -t dummy.data -p 'dummy={"type":"test", "name":"john", "age":20}' -p rate=100 -o stdout
Fluent-Bit v0.12.0
Copyright (C) Treasure Data

[2017/08/28 22:05:12] [ info] [engine] started
[0] dummy.data: [1503925512.520811870, {"type"=>"test", "name"=>"john", "age"=>20}]
[1] dummy.data: [1503925512.530241262, {"type"=>"test", "name"=>"john", "age"=>20}]
[2] dummy.data: [1503925512.540228138, {"type"=>"test", "name"=>"john", "age"=>20}]

in_systemd Plugin (Systemdのログ収集)

(TODO)

Systemd · Fluent Bit v0.12 Documentation

filter_record_modifier (fieldの追加、余計なfieldの除去)

filter_record_modifierを使うことでfieldの追加(Record)、削除(Remove_key, Whitelist_key)を行うことができるようになりました。 ユニークな値を付加したり、余計な情報の転送を抑制することで通信量やDiskの使用量を抑える用途に使えます。

Fieldを追加する(hostnameを追加する例)

RecordによってFieldを追加することが出来ます。 下記は環境変数を使ってkeyがhostnameなFieldを追加する例になります。

[INPUT]
    Name mem
    Tag  mem.local

[OUTPUT]
    Name  stdout
    Match *

[FILTER]
    Name record_modifier
    Match *
    Record hostname ${HOSTNAME}

コマンドラインでは下記のように書けます。

$ fluent-bit -i mem -o stdout -F record_modifier -p 'Record=hostname ${HOSTNAME}' -m '*'

出力例は下記のようになります。最後に"hostname"=>"localhost.localdomain"が追加されていることが分かるかと思います。

[0] mem.local: [1505701696.016712347, {"Mem.total"=>3920464, "Mem.used"=>3508872, "Mem.free"=>411592, "Swap.total"=>2064380, "Swap.used"=>0, "Swap.free"=>2064380, "hostname"=>"localhost.localdomain"}]

Fieldを削除する(memory, swapのused値を削除する)

削除については、Remove_key もしくは Whitelist_key で指定できます。 それぞれの違いは、

  • Remove_key: 指定されたものを削除する
  • Whitelist_key: 指定されたものを残す

点です。

では、memory情報からusedのFieldを削除する例について書いてみます。

[INPUT]
    Name mem
    Tag  mem.local

[OUTPUT]
    Name  stdout
    Match *

[FILTER]
    Name record_modifier
    Match *
    Remove_key Mem.used
    Remove_key Swap.used

もしくは[FILTER]の箇所を下記のようにWhitelist_keyを使って書くこともできます。

[FILTER]
    Name record_modifier
    Match *
    Whitelist_key Mem.total
    Whitelist_key Mem.free
    Whitelist_key Swap.total
    Whitelist_key Swap.free

これを実行すると、下記のようにMem.usedSwap.usedが削除されていることが分かります。

[0] mem.local: [1505702284.002455403, {"Mem.total"=>3920464, "Mem.free"=>423088, "Swap.total"=>2064380, "Swap.free"=>2064380}]

参考までにフィルタしない場合の出力例は下記です。

[0] mem.local: [1505702544.015796143, {"Mem.total"=>3920464, "Mem.used"=>3508940, "Mem.free"=>411524, "Swap.total"=>2064380, "Swap.used"=>0, "Swap.free"=>2064380}]

filter_parser (任意のfieldをparseして展開)

parser専用のfilter Pluginが加わりました。今まではin_tailなど一部のinput pluginしかparserをサポートしていませんでした。このfilter_parser を使うことで、任意のinput pluginが生成したFieldをparseすることができます。

下記はin_dummyで生成したFieldをparseする例になります。ここでは、"data":"100 0.5 true This is example" というFieldを生成しています。parse後は、{"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}というように変換してみましょう。

まず、下記のようにParsers file(parsers.conf)を用意します。dummy_testというparser名を定義し、正規表現を記述します。名前つきキャプチャを使用することで、展開後のkey名を定義することができます。

[PARSER]
    Name dummy_test
    Format regex
    Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$

そしてconfig fileです。先ほどのParsers fileのパスをParsers_Fileとして記述する必要があります。

filter_parserの設定としては、Key_NameでparseするFieldのKey(ここではdata)を指定し、先ほど定義したparser名をParserによって指定します。

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

[INPUT]
    Name dummy
    Tag  dummy.data
    Dummy {"data":"100 0.5 true This is example"}

[FILTER]
    Name parser
    Match dummy.*
    Key_Name data
    Parser dummy_test

[OUTPUT]
    Name stdout
    Match *

これを実行すると、下記のように"data":"100 0.5 true This is example"を各Key-Valueに展開することができます。デフォルトではStringとして展開されますが、後述する機能を使うことで、数値型などに変換することができます。

[0] dummy.data: [1499347993.001371317, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]

out_kafka_rest Plugin (Kafka REST Proxyサーバへの出力)

kafkaについては詳しくないので公式ドキュメントを参照して下さい。

Kafka REST Proxy · Fluent Bit v0.12 Documentation

parser が型変換をサポート

parserによって展開された値はデフォルトでは文字列になります。Fluentdライクに型を指定することもできるようになりました。

下記では、"data":"100 0.5 true This is example"をparseして、integer, float, bool, 文字列に展開する例となります。 Parsers file にて、Types INT:integer FLOAT:float BOOL:boolのように、types <field_name_1>:<type_name_1> <field_name_2>:<type_name_2> .... と設定することで型を指定できます。 Fluentd とは異なり、,(コンマ)でなくスペース区切りな点に注意してください。

[PARSER]
    Name dummy_test
    Format regex
    Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$
    Types INT:integer FLOAT:float BOOL:bool

config file は filter_parserのものを使用してください。

これによって、下記のように出力されます。細かいですが、ダブルクォート(")が一部無くなっているのが分かるでしょうか。

[0] dummy.data: [1506081688.029663388, {"INT"=>100, "FLOAT"=>0.500000, "BOOL"=>true, "message"=>"This is example"}]