Fluent Bit 是 Fluentd 的輕量化版本,最初為了在 Embedded Linux 與 IoT 設備上收集 Log 而設計。隨著 Observability 三大訊號(Logs、Metrics、Traces)逐漸成為標配,Fluent Bit 也把自己重新定位為「Telemetry Agent for Logs, Metrics and Traces」,能夠從各種來源蒐集事件,並送往 Loki、Fluentd、Elasticsearch、Datadog、Kafka 與多種雲端服務。
歷史上,Fluent Bit 由 Eduardo Silva 於 2014 年在 Treasure Data 發起;Treasure Data 由 Fluentd 作者 Sadayuki Furuhashi 創辦。2020 年 Eduardo 進一步創立 Calyptia,提供與 Fluent Bit 相關的顧問與 SaaS 服務。
核心概念#
Event#
Fluent Bit 把每一筆 Log、Metric 或 Trace 都視為一個 Event。例如以下四行系統 Log,會被當成四個獨立 Event:
Jan 18 12:52:16 flb systemd[2222]: Starting GNOME Terminal Server
Jan 18 12:52:16 flb dbus-daemon[2243]: ... Successfully activated service '...'
Jan 18 12:52:16 flb systemd[2222]: Started GNOME Terminal Server.
Jan 18 12:52:16 flb gsd-media-keys[2640]: # watch_fast: ...每個 Event 包含三個欄位:
TIMESTAMP:時間戳記。
METADATA:自 2.1.0 版起新增,以 Key-Value 形式承載額外屬性。
MESSAGE:實際訊息內容。
2.1.0 版之前的格式為
[TIMESTAMP, MESSAGE],之後則擴展為[[TIMESTAMP, METADATA], MESSAGE],新版仍能向後相容舊格式。
Config File#
Fluent Bit 的設定檔同時支援以 INI 為基礎的傳統格式與 YAML。舊版 INI 風格範例:
[INPUT]
Name dummy
Tag dummy
Dummy {"message": "hello world"}對應的 YAML 寫法:
input:
name: dummy
tag: dummy
dummy: '{"message": "hello world"}'Pipeline#
Fluent Bit 把資料處理拆成一條 Pipeline,主要組件包括:
- Input:資料來源,例如讀檔、訂閱 Kafka Topic、從 Forwarder 接收事件。
- Parser:把原始字串轉成結構化資料,例如解析 JSON、logfmt。
- Filter:對資料做篩選、加欄位、改欄位,例如排除 Debug 等級事件。
- Buffer:當 Output 暫時不可用時暫存資料,避免遺失。
- Routing:依據 Input 的 Tag 與 Filter/Output 的 Match,決定資料要走哪條路。
- Output:資料目的地,例如寫檔、送到 Loki。
Tag 與 Match#
Tag 與 Match 是 Pipeline 路由的核心:
- Tag 在 Input 設定,作為事件來源的識別字。若沒指定,預設會用
<input_name>.<序號>,例如dummy.0。 - Match 在 Filter 與 Output 設定,用來宣告「這個元件要處理哪些 Tag 的資料」。
範例:
[INPUT]
Name dummy
Tag my_first_dummy
Dummy {"message": "hello world"}如果 Output 只想處理 my_first_dummy,可以這樣寫:
[OUTPUT]
Name stdout
Match my_first_dummy也可以使用萬用字元 * 接收所有事件,或是 my_* 接收特定前綴:
[OUTPUT]
Name stdout
Match *如果 Filter 或 Output 沒有設定 Match,預設不會處理任何事件。新手很容易在這裡踩坑,看到 Pipeline 沒輸出時,先檢查 Tag 與 Match 是否對齊。
Input#
Input 提供多種來源,常見如:
- Tail:讀取檔案,類似
tail -f。 - Systemd:讀取 systemd journal。
- Kafka:訂閱 Kafka Topic。
- Dummy:產生測試訊息,方便驗證 Pipeline。
每個 Input 都有自己的參數,例如 Tail 可以指定檔案路徑與多行(Multiline)解析器:
[INPUT]
name tail
path /var/log/python/*.log
multiline.parser pythonParser#
解析器(Parser)負責把原始字串轉成結構化欄位,常見格式有 JSON、Logfmt 與正規表示式。共通參數包含 Name、Format、Time_Key 等。在 Parser 區塊定義之後,於 Input 中以 Parser <name> 引用即可。
Filter#
Filter 是 Fluent Bit 最常被使用的功能,可選擇 Grep、Modify、Nest、Kubernetes 等多種行為,並依設定檔出現順序執行,例如以 Grep 過濾事件、以 Modify 增改欄位。
Output 與綜合範例#
Output 把資料送到目的地。下面範例把三段串起來:從 Dummy 產生事件、由 Grep 留下含 error 的訊息、最後送到 stdout:
[INPUT]
Name dummy
Tag my_first_dummy
Dummy {"msg": "error: got error"}
[FILTER]
Name grep
Match my_first_dummy
Regex msg error
[OUTPUT]
Name stdout
Match my_first_dummy把 Output 替換成 loki 並設定 Host、Port、Labels,即可把資料送到 Loki;更多 Output 選項可查官方文件。
Service#
SERVICE 區塊用來控制 Fluent Bit 自身的行為,例如 Flush 頻率、是否走 Daemon 模式、Log 等級:
[SERVICE]
Flush 5
Daemon off
Log_Level debug它影響的是 Agent 本身,而不是事件 Pipeline。
Lab 重點#
文章 Lab 提供三組情境作為練習方向:
- Basic:以 Dummy 與 Random Input 作為來源,將事件送到 stdout。
- Container Log with Loki:搭配 Docker 的 Fluentd Logging Driver,把 Container Log 透過 Forward Input 收進 Fluent Bit,再以 Loki Output 寫出。
- Container Log with Vivo:同樣用 Forward Input 接收 Container Log,但 Output 改為轉發給 Calyptia 推出的 Vivo,作為 Telemetry 視覺化前端。
小結#
Fluent Bit 把 Fluentd 的彈性壓縮進輕量、低資源消耗的執行檔,並具備完整的 Plugin 生態。它能與 Fluentd 無縫銜接,作為前線 Forwarder 與後端 Aggregator 的搭檔;隨著 Calyptia 推出 Vivo,整個生態系也在持續往「Logs、Metrics、Traces 通吃」的方向前進。對於需要在多種儲存後端間保留切換彈性的團隊,Fluent Bit 是一個值得認真評估的選項。
原文出處#
- 原書/iThome:https://ithelp.ithome.com.tw/articles/10332341