網頁

2023/8/25

Fluentd Docker 試玩

本篇依照Fluentd官方教學來操作。


範例環境:

  • MacBook Apple M1 Pro
  • macOS Ventura 13.01
  • Docker version 24.0.2


下載fluentd image

在命令列執行docker pull fluent/fluentd:edge-debian下載fluentd的image。

% docker pull fluent/fluentd:edge-debian
edge-debian: Pulling from fluent/fluentd
50eb042e2421: Pull complete
e7f022c5984e: Pull complete
b2bea78520ca: Pull complete
6fd364618e0c: Pull complete
8e520102b3e5: Pull complete
61c0b5514864: Pull complete
d86fed8b0128: Pull complete
080ec58753c4: Pull complete
fda02f40ec29: Pull complete
cc26dcbe8c75: Pull complete
a1b70c6df0bd: Pull complete
e6f8bfd5858d: Pull complete
Digest: sha256:c7bd75c6666fbccf92cfd2f0f3a0ec5236b7e79f2291e83bf336546a19e0cc6b
Status: Downloaded newer image for fluent/fluentd:edge-debian
docker.io/fluent/fluentd:edge-debian


建立fluentd設定檔

在本機建立fluentd的設定檔fluentd.conf,建立在當前工作目錄下的tmp目錄,內容如下。

fluentd.conf

<source>
  @type http
  port 9880
  bind 0.0.0.0
</source>

<match **>
  @type stdout
</match>

設定檔fluentd.conf作用為設定fluentd的輸入輸出行為,簡單說明如下:

  • <source> - 設定fluentd的資料來源,並將來源轉為事件傳送給fluentd的路由引擎。
    • @type - 必填,用來指定input plugin。這邊為http,代表in_http input plugin。
    • port - http的參數,代表要監聽的port。Fluentd預設用9880 port。
    • bind - http的參數,代表要監聽的位址。0.0.0.0代表所有位址。
  • <match> - 找到與pattern匹配的tag事件並轉交給output plugin處理。**即為pattern,表示任意tag。
    • @type - 必填,用來指定output plugin。這邊為stdout,代表out_stdout output plugin。

所以這邊的意思為將來自任何HTTP位址、9880 port的請求轉成fluentd事件並把所有事件透過標準輸出印出。


運行fluentd容器

執行docker run -p 9880:9880 -v $(pwd)/tmp:/fluentd/etc fluent/fluentd:edge-debian -c /fluentd/etc/fluentd.conf雲型fluentd容器(由於沒加-d參數所以非detached模式執行,運行後命令列會卡著)。

參數說明:

  • -p 9880:9880 - 本機9880 port對到fluentd容器的9880 port。
  • -v $(pwd)/tmp:/fluentd/etc - 把本機當前目錄($(pwd))下的tmp作為volume,對應到容器的/fluentd/etc目錄。
  • -c /fluentd/etc/fluentd.conf - 在容器名稱fluent/fluentd:edge-debian後的-c參數實際上是fluentd的參數--config作用為告訴fluentd配置檔fluentd.conf的路徑。(因為在fluentd的Dockerfile最後會執行fluentd命令)
% docker run -p 9880:9880 -v $(pwd)/tmp:/fluentd/etc fluent/fluentd:edge-debian -c /fluentd/etc/fluentd.conf
fluentd -c /fluentd/etc/fluentd.conf
2023-08-25 10:02:07 +0000 [info]: init supervisor logger path=nil rotate_age=nil rotate_size=nil
2023-08-25 10:02:07 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluentd.conf"
2023-08-25 10:02:07 +0000 [info]: gem 'fluentd' version '1.16.2'
2023-08-25 10:02:07 +0000 [warn]: define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
2023-08-25 10:02:07 +0000 [info]: using configuration file: <ROOT>
  <source>
    @type http
    port 9880
    bind "0.0.0.0"
  </source>
  <match **>
    @type stdout
  </match>
</ROOT>
2023-08-25 10:02:07 +0000 [info]: starting fluentd-1.16.2 pid=7 ruby="3.1.4"
2023-08-25 10:02:07 +0000 [info]: spawn command to main:  cmdline=["/usr/local/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/local/bundle/bin/fluentd", "-c", "/fluentd/etc/fluentd.conf", "--plugin", "/fluentd/plugins", "--under-supervisor"]
2023-08-25 10:02:07 +0000 [info]: #0 init worker0 logger path=nil rotate_age=nil rotate_size=nil
2023-08-25 10:02:07 +0000 [info]: adding match pattern="**" type="stdout"
2023-08-25 10:02:07 +0000 [info]: adding source type="http"
2023-08-25 10:02:07 +0000 [warn]: #0 define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
2023-08-25 10:02:07 +0000 [info]: #0 starting fluentd worker pid=16 ppid=7 worker=0
2023-08-25 10:02:07 +0000 [info]: #0 fluentd worker is now running worker=0
2023-08-25 10:02:07.917255429 +0000 fluent.info: {"pid":16,"ppid":7,"worker":0,"message":"starting fluentd worker pid=16 ppid=7 worker=0"}
2023-08-25 10:02:07.918229929 +0000 fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}


測試

執行curl -X POST -d 'json={"json":"message"}' http://127.0.0.1:9880/sample.test發送HTTP POST請求到127.0.0.1:9880/sample.test及payload資料為JSON,內容為{"json":"message"}。URI後面的sample.test即為fluentd事件的tag。

% curl -X POST -d 'json={"json":"message"}' http://127.0.0.1:9880/sample.test

在執行fluentd容器的終端機可看到多了一行訊息,即為剛剛發送POST請求的log記錄。

2023-08-25 10:06:38.879920846 +0000 sample.test: {"json":"message"}

執行docker ps查看fluentd容器的ID。

% docker ps
CONTAINER ID   IMAGE                        COMMAND                   CREATED         STATUS         PORTS                                                                                                         NAMES
2aafb0bbb2f5   fluent/fluentd:edge-debian   "tini -- /bin/entryp…"   6 minutes ago   Up 6 minutes   5140/tcp, 24224/tcp, 0.0.0.0:9880->9880/tcp                                                                   condescending_wiles

執行docker logs 2aafb0bbb2f5 | tail -n 1查看docker的log。

% docker logs 2aafb0bbb2f5 | tail -n 1
2023-08-25 10:06:38.879920846 +0000 sample.test: {"json":"message"}

沒有留言:

張貼留言