Fluent-Bit v0.12 リリース
Fluent-Bit v0.12 が2017/08にリリースされました。parser pluginが少しずつ充実してきました。
Fluent-Bit とは?
Cで書かれた軽量なLog forwarder です。どんなソフトかは下記記事を参照して下さい。
おおまかな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.used
と Swap.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"}]