FluentbitをDocker上で手軽に試す方法
初めに
通常のFluentbitイメージはDistroless(OSが無い状態)で配布[1]されています。
一方で<version>-debug
ではShellが用意されているので自由にデバッグできます。今回検証に使ったのは「Fluentbit 2.0.8」(執筆時最新)です。
試し方
ここではtailプラグインを用いて説明します:
docker pull fluent/fluent-bit:latest-debug
docker run --name fluentbit --rm fluent/fluent-bit:latest-debug \
/fluent-bit/bin/fluent-bit -i tail \
-p path=/tmp/test \
-p refresh_interval=5 \
-o stdout
docker exec -it fluentbit bash -c "echo $(date) >> /tmp/test"
すると「terminal1」では以下のような文字列が出力されたら動作確認は終了です。
[2023/01/19 15:39:35] [ info] [fluent bit] version=2.0.8, commit=9444fdc5ee, pid=1
[2023/01/19 15:39:35] [ info] [storage] ver=1.4.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
...
[2023/01/19 15:41:00] [ info] [input:tail:tail.0] inotify_fs_add(): inode=3691433 watch_fd=1 name=/tmp/test
[0] tail.0: [1674142988.435493254, {"log"=>"Thu Jan 19 16:43:08 CET 2023"}]
Terminal 1のオプションの意味は次の通りです。
/fluent-bit/bin/fluent-bit -i tail -p path=/tmp/test -p refresh_interval=5 -o stdout
-i, --input=INPUT set an input
複数あるInputの方式で、https://docs.fluentbit.io/manual/pipeline/inputs/tail を利用する
-p, --prop="A=B" set plugin configuration property
- path: 定期的にウォッチするログのパス
- refresh_interval: ウォッチする秒間隔 (デフォルトは60秒)
-o, --output=OUTPUT set an output
複数あるOutputの方式で、https://docs.fluentbit.io/manual/pipeline/outputs/standard-output を利用する。
色々な設定を試す
Dockerコンテナには以下のような形式でログを出力するものがあります。
2022-12-20T08:50:59.715524095Z stdout F {"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}
これをParseする際には以下のように表現することが可能です。
(?<time>\S+) (?<stream>\S+) (?<flag>\S+) (?<log>.*)
💡豆知識
(?<任意の値>正規表現)
は名前付きキャプチャと呼ばれ、一致した正規表現に名前をつけてグループ化することが可能です。これを使うことで、例えばElasticsearchではグループ化された項目が自動でタグ付けされ、特定のタグの値を検索する際に非常に便利です。[1]
今回はDetachモード(出入力なしでバックグラウンドで実行)でDockerコンテナを動かします。
docker run --detach --name fluentbit --rm fluent/fluent-bit:latest-debug
Parserなしの状態
- Terminal 1上で入力を受け付ける
$ docker exec -it fluentbit bash
root@2004013caa9a:/# /fluent-bit/bin/fluent-bit -i tail -p path=/tmp/test -p refresh_interval=5 -o stdout
Fluent Bit v2.0.8
* Copyright (C) 2015-2022 The Fluent Bit Authors
- 新規Terminal上でファイルを作成。
$ docker exec -it fluentbit bash
$ vim /tmp/test
2022-12-20T08:50:59.715524095Z stdout F {"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}
- Terminal1上では以下のように表示される
[0] tail.0: [1674073729.915343507, {"log"=>"2022-12-20T08:50:59.715524095Z stdout F {"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}"}]
構造的にはJSONで出力されキー名 "log"に先ほどの値が入力されています。
Parserありの状態
先ほどのTerminal1のFluentbitプロセスをCtrl + C で終了させ、以下2つのファイルを作成します。
vim /tmp/parser.conf
[PARSER]
Name my-parser
Format regex
Regex (?<time>\S+) (?<stream>\S+) (?<flag>\S+) (?<log>.*)
vim /tmp/app.conf
[SERVICE]
Parsers_File /tmp/parser.conf
[INPUT]
Name tail
Tag dummy.data
Path /tmp/test
Parser my-parser
Refresh_Interval 5
[OUTPUT]
Name stdout
Match *
先ほど作ったファイルを読み込んで動かし、別ターミナルで再度同じインプットを入力してファイルを上書きします。
/fluent-bit/bin/fluent-bit --config /tmp/app.conf
すると以下のようにParseされて表示されました。
[0] dummy.data: [1674074700.090086220, {"time"=>"2022-12-20T08:50:59.715524095Z", "type"=>"stdout", "flag"=>"F", "log"=>"{"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}"}]