Fluentd 和 Fluent Bit 是常用的日誌收集和處理工具,在建構可觀測性系統中扮演重要角色。本文將引導讀者完成 Fluentd 和 Fluent Bit 的安裝、設定和基本運作,並使用 LogSimulator 和 Postman 進行測試,確保日誌流程的暢通。首先,我們會使用 gem 安裝 Fluentd,並確認安裝的版本和相關工具。接著,會說明 Fluentd 的核心設定檔結構,包含 <system><source><match> 區塊的用途和引數設定。為了模擬日誌來源,我們會使用 LogGenerator 工具,並設定 Java 和 Groovy 的執行環境。最後,我們會使用 Postman 和 LogSimulator 傳送測試日誌,驗證 Fluentd 和 Fluent Bit 的運作狀態,並觀察控制檯輸出。

Fluentd 的安裝、架構與佈署

Fluentd 的安裝可以透過 Ruby 的套件管理器(gem)完成。在企業環境中,可能需要透過代理伺服器或本地 gems 伺服器進行安裝。安裝完成後,可以透過以下命令測試:

fluentd --help

此命令將顯示 Fluentd 的幫助資訊。同時,也可以檢查 Fluentd 和其他 gems 是否已正確安裝在佈署位置,例如 lib\ruby\gems\2.7.0\gems\(以及其他作業系統的等效路徑)。

除了核心的 Fluentd 外,安裝還提供了一些輔助工具,我們將在後續章節中使用這些工具。主要的工具如表 2.3 所示。

Fluentd 支援工具

Fluentd 工具工具描述
fluent-binlog-reader用於讀取 Fluentd 建立的二進位制日誌檔案,並生成可讀內容。
fluent-ca-generate用於建立基本(自簽名)憑證,以加密 Fluentd/Fluent Bit 節點之間的通訊。
fluent-cat提供了一種將單個日誌訊息注入 Fluentd 的方法;需要組態 forward 外掛。例如:`echo ‘{“message”:“hello”}’
fluent-debug用於遠端除錯,與 Ruby 工具結合使用。
fluent-gem本質上是 Ruby gem 命令的別名,用於列出所有可用的 gems。
fluent-plugin-config-format用於查詢外掛以取得支援的組態引數詳情。可以生成多種格式的檔案,例如:fluent-plugin-config-format -f txt input tail 將檢索 tail 輸入外掛的組態詳情。
fluent-plugin-generate生成外掛開發的程式碼框架,包括 Gem 檔案、README、外掛的 stubbed Ruby 程式碼和骨架測試框架。

內容解密:

  • fluent-binlog-reader:用於讀取二進位制日誌檔案,對於需要壓縮和效能最佳化的場景非常有用。
  • fluent-ca-generate:提供了一種簡單的方式來建立自簽名憑證,以確保 Fluentd 節點之間的安全通訊。
  • fluent-cat:可以用於測試 Fluentd 的路由、過濾和輸出步驟,但無法檢查輸入外掛的組態。
  • fluent-debug:結合 Ruby 工具進行遠端除錯。
  • fluent-gem:管理 Fluentd 外掛和依賴項。
  • fluent-plugin-config-format:為外掛生成檔案,方便在 CI/CD 管道中使用。
  • fluent-plugin-generate:簡化了外掛開發過程,提供了基本的程式碼結構。

佈署 Fluentd

作業系統差異

Linux 和 Unix 系統支援中斷訊號框架,可以傳送訊號給應用程式以控制其行為。Fluentd 可以利用這些訊號觸發操作,如重新載入組態檔案而無需重啟。

Linux 訊號對 Fluentd 的影響
SIGINT 或 SIGTERM優雅地關閉 Fluentd,清空記憶體中的資料,並確保檔案緩衝處於乾淨狀態。
SIGUSR1將所有快取值(包括日誌事件)重新整理到儲存,並重新整理檔案控制程式碼。
SIGUSR2安全地重新載入組態,確保快取被安全儲存,不丟失日誌事件。
SIGHUP強制重新載入組態,與 SIGUSR2 相似,但也會重新整理內部日誌。
SIGCONT記錄 Fluentd 的內部狀態,包括執行緒資訊、記憶體分配等。

檔案控制程式碼

在 Linux 檔案系統中,可以控制同時開啟的檔案控制程式碼數量,而 Windows 的限制由作業系統版本和架構決定。Linux 使用檔案控制程式碼表示真實檔案和網路連線。Fluentd 的預設檔案控制程式碼數量可能過低,需要在生產環境中調整。

調整檔案控制程式碼限制可以透過編輯組態檔案或使用 Linux 的 ulimit 命令來完成。正確的檔案控制程式碼數量取決於寫入檔案的數量和速度、支援的網路埠數量等因素。

內容解密:

  • Linux 訊號允許對 Fluentd 進行精細控制,如優雅關閉、重新載入組態等。
  • 檔案控制程式碼限制是 Linux 系統中的一個重要引數,需要根據實際負載進行調整,以避免 Fluentd 在高負載下出現問題。

2.2.6 佈署日誌生成器

在測試 Fluentd 的設定時,我們需要一個可以持續傳送日誌事件的工具,以驗證輸入外掛的組態是否正確,以及日誌輪替等功能的運作。LogGenerator 是一個非常有用的工具,可以從 GitHub 上取得(https://github.com/mp3monster/LogGenerator)。這個工具提供了多種實用的功能:

  • 可以重播現有的日誌檔案,重新寫入日誌事件,並保持原始的時間間隔。
  • 可以根據測試日誌檔案的描述,重播日誌事件,並保持正確的時間間隔。
  • 可以根據指定的模式生成日誌檔案,支援多種日誌格式。
  • 可以透過 Java Logging 框架傳送日誌,模擬應用程式使用日誌框架的行為。

LogGenerator 是使用 Groovy 編寫的,這意味著它本質上是 Java,並且使用了標準的 Java 類別和函式庫。Groovy 相較於 Java 提供了一些便利之處,例如可以直接執行指令碼,使得開發和修改更加快速和容易。此外,它還包含了方便處理 REST 和 JSON 的類別。

JAVA 安裝

要安裝 Java,可以使用套件管理器或從 www.java.com/en/download/ 下載。LogGenerator 需要 Java 8 或更高版本,但必須安裝 Java Development Kit(JDK)而非 Java Runtime Environment(JRE)。安裝完成後,需要確保正確的 Java 版本被設定在 PATH 環境變數和 JAVA_HOME 中。

檢查 Java 版本

可以使用 java –version 命令檢查目前使用的 Java 版本。

GROOVY 安裝

如果想要直接使用編譯好的 JAR 檔案,可以跳過本文。但如果想要使用 Groovy 版本、瞭解其工作原理或進行修改,則需要安裝 Groovy。安裝 Groovy 的方法包括下載(https://groovy.apache.org/download.html)或使用套件管理器。與 Java 相同,也需要將 Groovy 設定在 PATH 環境變數和 GROOVY_HOME 中。

設定環境變數(Windows)

set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_221
set PATH=%JAVA_HOME%\bin;%PATH%
echo Set Shell to Java
java -version
set GROOVY_HOME=C:\Program Files\Groovy-3.0.2\
set PATH=%GROOVY_HOME%\bin;%PATH%
echo Set Shell to Groovy
groovy --version

設定環境變數(Linux)

export JAVA_HOME=/usr/lib/jdk1.8.0_221
export PATH=$JAVA_HOME/bin:$PATH
echo Set Shell to Java
java -version
export GROOVY_HOME=/usr/lib/Groovy-3.0.2
export PATH=$GROOVY_HOME/bin;$PATH
echo Set Shell to Groovy
groovy --version

執行 LogSimulator

LogSimulator 使用一個屬性檔案來控制其行為,並使用一個描述一系列日誌條目的檔案來重播日誌事件。可以在後續章節中使用它來測試日誌輪替等功能的運作。

以 Groovy 執行 LogSimulator

groovy LogSimulator.groovy Chapter2\\SimulatorConfig\\tool.properties

以 JAR 檔案執行 LogSimulator

java -jar LogSimulator.jar Chapter2\\SimulatorConfig\\tool.properties

LogSimulator 的詳細設定

如果想要了解 LogSimulator 的更多細節,可以編輯 tool.properties 檔案,將 verbose 屬性從 false 改為 true。這樣會在控制檯輸出定義在 small-source.txt 檔案中的日誌條目。

2.2.7 安裝 Postman

為了向 Fluentd 傳送單個日誌事件以測試其組態,需要一個易於使用的工具。雖然可以使用像 cURL 這樣的工具,但我們選擇了 Postman,因為它具有友好的 UI,並且支援多個平台。Postman 是一個知名工具,支援大多數環境(Windows、macOS、Linux 等),並且對個人使用是免費的。可以從 www.postman.com/downloads/ 下載。

2.3 將 Fluentd 啟動並執行“Hello World”

既然已經瞭解了 Fluentd 的架構並將其佈署到環境中,接下來讓我們將其啟動並執行起來。

“Hello World”場景

“Hello World”場景非常簡單。我們將利用 Fluentd 可以透過 HTTP 接收日誌事件的事實,並觀察控制檯記錄這些事件。首先,我們將使用 Postman 傳送 HTTP 事件。下一步是擴充套件這個場景,使用 LogSimulator 傳送日誌事件。#### 內容解密: 本文主要介紹如何佈署和設定 LogGenerator 以及安裝 Postman,以配合 Fluentd 的「Hello World」測試。首先,我們瞭解了 LogGenerator 的功能和使用方法,包括如何使用 Groovy 或 JAR 檔案執行它。其次,我們學習瞭如何安裝 Java 和 Groovy,以及如何設定相關的環境變數。最後,我們簡要介紹了 Postman 的安裝和使用,為後續的「Hello World」測試做準備。

Fluentd 測試架構圖示

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title “Hello World”場景

rectangle "傳送日誌事件" as node1
rectangle "傳送 HTTP 請求" as node2
rectangle "記錄日誌事件" as node3

node1 --> node2
node2 --> node3

@enduml

此圖示展示了 LogGenerator 和 Postman 如何與 Fluentd 互動,以及 Fluentd 如何將日誌事件記錄到控制檯。

圖表說明:

  • LogGenerator 和 Postman 分別透過不同的方式向 Fluentd 傳送日誌事件和 HTTP 請求。
  • Fluentd 負責接收這些請求並將日誌事件記錄到控制檯。

本文內容完整呈現了佈署和設定測試工具的過程,為後續的「Hello World」測試奠定了基礎。透過 LogGenerator 和 Postman,我們可以有效地測試和驗證 Fluentd 的組態和功能。

Fluentd “Hello World” 設定與啟動

設定檔解析

在執行範例之前,讓我們快速檢視設定檔(見清單 2.1)。正如我們所見,設定檔中包含了註解。在設定檔中,我們可以在任何地方使用 # 符號進行註解。<system></system> 之間的設定指示 Fluentd 如何運作其內部機制;在這個例子中,使用 Info 級別的日誌記錄。然後,我們使用 source 指令定義日誌事件的來源,使用內建的 HTTP 外掛程式功能,該功能由 @type 識別。接下來的名稱-值對被視為該外掛程式的屬性或引數。例如,在這裡,我們定義了使用 18080 連線埠接收日誌事件。

# Hello World 設定將透過 HTTP 協定在 18080 連線埠接收事件
# 設定 Fluentd 的組態引數
<system>
  log_level info
</system>
# 定義將提供日誌事件的 HTTP 來源
<source>
  @type http
  port 18080
</source>
# 接受所有日誌事件,無論標籤如何,並將它們寫入主控台
<match *>
  @type stdout
</match>

設定檔內容解密:

  1. <system> 區段定義了 Fluentd 的內部運作引數,例如日誌級別。
  2. <source> 區段定義了日誌事件的來源,這裡使用的是 HTTP 外掛程式,監聽在 18080 連線埠。
  3. <match> 區段定義了輸出外掛程式,這裡使用的是 stdout,將所有接收到的日誌事件輸出到主控台。

啟動 Fluentd

由於 Fluentd 服務在我們的 PATH 中,我們可以在任何地方使用 fluentd 命令啟動程式。然而,如果沒有引數定義設定檔的位置,工具將會在不同的地方查詢,具體取決於環境和安裝過程。對於 Windows 和 Linux,Fluentd 將嘗試解析位置 /etc/fluent/fluent.conf。對於 Windows,除非在 Linux 子系統中執行命令,否則會失敗。我們不使用預設值來啟動 Fluentd。需要將 shell 導航到下載設定檔的目錄,或包含設定檔的完整路徑作為引數。然後執行以下命令:

fluentd -c HelloWorld.conf

命令執行解密:

  1. fluentd -c HelloWorld.conf 命令用於啟動 Fluentd,並指定使用 HelloWorld.conf 設定檔。
  2. 如果從下載資源的根目錄執行 Fluentd 命令,則命令應為 fluentd -c ./Chapter2/Fluentd/HelloWorld.conf

使用 Postman 傳送日誌事件

在啟動 Fluentd 後,下一步是使用 Postman 傳送日誌事件。首先需要在 Postman 中設定 JSON 承載,如圖 2.8 所示,在 Header 中設定相關引數,然後在 Body 中選擇 Raw 並輸入 {"Hello" : "World"},如圖 2.9 所示。點選 Send 按鈕後,可以在 Fluentd 的輸出中看到接收到的日誌事件,如圖 2.10 所示。

Postman 設定解密:

  1. 在 Postman 中設定 Header 和 Body,以傳送 JSON 承載到 Fluentd。
  2. 使用 POST 操作將 {"Hello" : "World"} 傳送到 Fluentd 的 HTTP 端點。

Fluentd 與 Fluent Bit 的基礎佈署與運作

在探討 Fluentd 與 Fluent Bit 的技術細節之前,我們先來瞭解這兩個工具的基本概念、架構以及佈署方法。這兩者都是日誌收集和處理的重要工具,在現代化的 DevOps 和可觀測性領域中扮演著關鍵角色。

LogSimulator 的使用

要執行 LogSimulator,需要開啟一個新的 shell 視窗,並導航到組態檔案下載的位置。每個章節的資料夾中都有一個名為 SimulatorConfig 的資料夾,裡麵包含了控制 LogSimulator 行為的屬性檔案。這些屬性檔案中的鍵值對控制了 LogSimulator 的行為,包括參照日誌檔案或測試資料。由於這些參照是相對路徑,因此需要位於正確的資料夾(即章節的父資料夾)才能成功啟動模擬器。

啟動 LogSimulator 的指令如下:

groovy LogSimulator.groovy Chapter2\SimulatorConfig\HelloWorld.properties

或者,如果選擇使用 JAR 檔案:

java -jar LogSimulator.jar Chapter2\SimulatorConfig\HelloWorld.properties

內容解密:

  • 這裡使用了 Groovy 語言來執行 LogSimulator 的指令碼,或是直接使用 Java 來執行 JAR 檔案。
  • Chapter2\SimulatorConfig\HelloWorld.properties 是組態檔案,定義了 LogSimulator 的行為。
  • 在 Linux 環境中,需要修正檔案路徑中的斜線方向。

“Hello World” 與 Fluent Bit

Fluent Bit 是用 C/C++ 編寫的,因此其佔用空間非常小。然而,這也意味著需要花費更多精力來為您的環境構建 Fluent Bit。需要熟悉 Gnu Compiler Collection (GCC) 或跨平台 C 編譯器 Clang。

下載與安裝 Fluent Bit

為了簡化流程,我們建議下載預先構建的二進位制檔案或使用支援的套件管理器,如 apt 和 yum。在 Windows 上,Treasure Data 提供了 Windows 二進位制檔案。建議下載 zip 版本以簡化操作。

下載後,將 zip 檔案解壓到適當的位置(假設為 C:\td-agent)。將 bin 資料夾(例如 C:\td-agent\bin)新增到 PATH 環境變數中,以便於使用。

驗證 Fluent Bit 安裝

fluent-bit --help

內容解密:

  • 這個指令會顯示 Fluent Bit 的幫助資訊,驗證其是否正確安裝。
  • --help 是一個常見的選項,用於顯示命令列工具的使用幫助。

啟動 Fluent Bit

雖然 Fluentd 和 Fluent Bit 的組態檔案相似,但它們並不相同。讓我們使用一個預先準備好的組態檔案來啟動 Fluent Bit:

fluent-bit -c ./Chapter2/FluentBit/HelloWorld.conf

內容解密:

  • -c 選項指定了組態檔案的位置。
  • ./Chapter2/FluentBit/HelloWorld.conf 是組態檔案路徑,用於定義 Fluent Bit 的行為。

使用 LogSimulator 與 Fluent Bit

LogSimulator 可以透過 TCP 或 HTTP 協定傳送日誌事件。對於 Fluent Bit,我們可以使用 Postman 進行 HTTP 請求,或使用 LogSimulator 傳送 TCP 日誌事件。

使用 LogSimulator 傳送 TCP 日誌事件:

groovy LogSimulator.groovy Chapter2\SimulatorConfig\fb-HelloWorld.properties .\TestData\small-source.json

內容解密:

  • 這條指令啟動了 LogSimulator,並指定了組態檔案和日誌事件檔案。
  • Chapter2\SimulatorConfig\fb-HelloWorld.properties 組態了 LogSimulator 的行為。
  • .\TestData\small-source.json 是包含日誌事件的檔案。

結果驗證

在 LogSimulator 的控制檯中,您應該會看到傳送的日誌事件的報告。同時,在另一個控制檯中執行的 Fluent Bit 也會開始報告接收到的 JSON 負載。

此圖示說明瞭 LogSimulator 控制檯輸出的日誌事件傳輸結束時的情況。

@startuml
note
  無法自動轉換的 Plantuml 圖表
  請手動檢查和調整
@enduml

內容解密:

  • 這張圖使用 Plantuml 語法繪製了一個序列圖,展示了 LogSimulator 和 Fluent Bit 之間的互動。
  • LogSimulator 傳送日誌事件給 Fluent Bit。
  • Fluent Bit 將接收到的日誌事件輸出到控制檯。