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  python

Parser#

解析器(Parser)負責把原始字串轉成結構化欄位,常見格式有 JSON、Logfmt 與正規表示式。共通參數包含 NameFormatTime_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 並設定 HostPortLabels,即可把資料送到 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