使用 Fluentd 和 BigQuery 即時分析記錄檔

本教學課程示範如何記錄瀏覽器流量並即時進行分析。當您有來自各種來源的大量記錄,而且想要對問題進行偵錯或從記錄檔中產生最新統計資料時,這就非常實用。

本教學課程說明如何使用 Fluentd 將 NGINX 網路伺服器產生的記錄檔資訊傳送到 BigQuery,然後使用 BigQuery 來分析記錄檔資訊。本課程假設您對 Google Cloud Platform (GCP)、Linux 指令列、應用程式記錄檔收集和記錄檔分析有基本的瞭解。

簡介

記錄檔是讓您掌握大規模系統和應用程式效能的強大工具,但隨著這些系統的規模和複雜度增加,要管理多個分散在一系列運算資源中的記錄檔也成了一項挑戰。

Fluentd 是一款熱門的開放原始碼記錄檔收集工具,可統一多個資料來源和系統的記錄檔收集作業,將記錄檔收集作業集中到一個統一的記錄層中。由於我們很難事先得知哪些資料之後適合用來分析,因此常見的做法是將所有的資料都記錄下來,之後再整理挑選。不過,收集和儲存所有的資料可能會讓資料難以使用,要從中取得所需資訊也很緩慢困難。

這時 BigQuery 就能派上用場。BigQuery 的優勢,能讓您輕鬆快速地從記錄檔中取得深入分析見解。BigQuery 是 Google 的全代管、高擴充性雲端資料倉儲和分析引擎,可在數十秒之內對幾 TB 的記錄檔執行查詢。這樣的效能可讓您快速獲得所需答案,以修正或改善系統。

根據預設,您每秒可以串流 100,000 個記錄檔資料列到 BigQuery,而且可以申請更多配額來提高這項上限。

Fluentd 具有輸出外掛程式,可將收集到的記錄檔儲存到 BigQuery 中,將 BigQuery 做為儲存記錄檔的目的地。使用這個外掛程式,即能以近乎即時的方式從許多伺服器直接將記錄檔載入到 BigQuery。您接著就可在 Google 試算表或 Google 數據分析內建立資訊主頁,讓它經常更新,輕鬆地視覺化呈現這項資料。

目標

  • 在 Compute Engine 執行個體上執行 NGINX 網路伺服器。
  • 安裝 Fluentd 記錄檔收集代理程式。
  • 設定 Fluentd 以執行下列工作:
    • 收集 NGINX 流量記錄檔。
    • 將記錄檔轉送到 BigQuery。
  • 使用 BigQuery 網頁版 UI 查詢記錄檔訊息。
  • 使用 BigQuery 在記錄檔上執據分析查詢。

費用

本教學課程使用的 Google Cloud Platform 收費元件包括:

  • Compute Engine
  • BigQuery

使用 Pricing Calculator 根據預測使用量計算預估費用。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

完成本教學課程後,您可以刪除建立的資源以避免繼續計費。詳情請參閱清除所用資源一節。

建立 NGINX 網路伺服器 VM

在本教學課程中,您將使用 GCP Marketplace 來建立 Compute Engine 執行個體,並讓該執行個體預先設定為執行 NGINX 網路伺服器。

  1. 在 GCP Console 中,前往 [Nginx (Google Click to Deploy)] (Nginx (Google 點擊即可部署)) 映像檔的 Marketplace 詳細資料頁面:

    前往 NGINX 詳細資料頁面

  2. 按一下 [Launch on Compute Engine] (在 Compute Engine 上啟動)

  3. 若'出現系統提示,請選取要使用的 GCP 專案。

  4. 等待必要的 API 啟用。

  5. 將部署項目命名為 nginx

  6. 選取位於美國地區或歐洲地區的區域。

  7. 在「Firewall」(防火牆) 底下的 [Networking] (網路) 區段中,確認已選取 [Allow HTTP traffic] (允許 HTTP 流量) 選項。

  8. 閱讀「Terms of Service」(服務條款) 底下所列的條款。

  9. 如果您接受條款,請按一下 [Deploy] (部署)

    部署詳細資料畫面會顯示系統正在您指定的區域中建立新的 VM,也正在安裝 NGINX 網路伺服器。

  10. 等待部署作業完成後再繼續進行其他作業。

新增權限

虛擬機器需要其他權限才能寫入至 BigQuery。如要修改 VM 權限,您必須先關閉 VM。

  1. 在 GCP Console 中,前往 Compute Engine「VM Instances」(VM 執行個體) 頁面。

    前往「VM Instances」(VM 執行個體) 頁面

    畫面上會顯示新的 VM 執行個體:nginx-vm

  2. 如要開啟 VM 的詳細資料頁面,請按一下 VM 的名稱。

  3. 按一下頁面頂端的 [Stop] (停止) 按鈕。

    關閉 VM 需要一些時間。

  4. 按一下頁面頂端的 [Edit] (編輯)

  5. 向下捲動並將 BigQuery 存取權變更為 [Enabled] (已啟用)

  6. 按一下頁面底部的 [Save] (儲存)

  7. 按一下頁面頂端的 [Start] (啟動) 以重新啟動具有新權限的 VM。

請暫時不要關閉這個頁面;在下一節中,您將繼續使用這個頁面。

安裝 Fluentd 和 BigQuery 連接器

在本教學課程的這個部分,您將在 VM 上安裝 Fluentd 記錄檔收集工具和 BigQuery 適用的 Fluentd 輸出外掛程式。

  1. 在「VM instance details」(VM 執行個體詳細資料) 頁面中,按一下 [SSH] 按鈕以開啟連至執行個體的連線。
  2. 在 VM 的殼層視窗中,確認 Debian 的版本:

    lsb_release -rdc
    

    結果會顯示 VM 上正在執行的 Debian 版本及其產品代號:

    Description:    Debian GNU/Linux 9.6 (stretch)
    Release:        9.6
    Codename:       stretch
    
  3. 前往 Fluentd 的 Debian 下載頁面,然後找出該 Debian 產品代號版本適用的安裝指令列。

    舉例來說,如為 Debian Stretch,請找出以下指令:

    curl -L
       https://toolbelt.treasuredata.com/sh/install-debian-stretch-td-agent3.sh
       | sh
    
  4. 將指令複製到 VM 上的殼層視窗。

    這個指令會將 td-agent 套件安裝在 VM 上。該套件包含 Fluentd 發布項目。

  5. 安裝「Fluentd 至 BigQuery」外掛程式:

    sudo /usr/sbin/td-agent-gem install fluent-plugin-bigquery
    

建立要做為記錄檔目的地的 BigQuery 資料集與資料表

Fluentd 的運作方式是使用輸入外掛程式來收集其他應用程式和服務產生的記錄檔。Fluentd 會將這類資料剖析為結構化 JSON 記錄,再將這些記錄轉送到任何已設定的輸出外掛程式。

Fluentd NGINX 存取記錄檔剖析器會讀取 NGINX access.log 檔案。下列內容列出具有欄位和範例值的範例記錄。

time: 1362020400
record:
{
  "remote"              : "127.0.0.1",
  "host"                : "192.168.0.1",
  "user"                : "-",
  "method"              : "GET",
  "path"                : "/",
  "code"                : "200",
  "size"                : "777",
  "referer"             : "-",
  "agent"               : "Opera/12.0",
  "http_x_forwarded_for": "-"
}

在 BigQuery 中建立記錄檔目的地資料表時,資料欄名稱必須完全符合記錄檔記錄中的欄位名稱。在下列程序中,請務必使用建議的名稱,以確保之後的資料表資料欄名稱正確無誤。

  1. 開啟 BigQuery 網頁版 UI:

    前往 BigQuery 網頁版 UI

  2. 在導覽面板的「Resources」(資源) 底下,按一下您的專案名稱。

  3. 在「Query Editor」(查詢編輯器) 下方的詳細資料面板中,按一下 [Create Dataset] (建立資料集)

  4. 針對「Dataset ID」(資料集 ID) 輸入 fluentd

  5. 針對「Data Location」(資料位置),選取您建立 NGINX 執行個體的多地區位置 (美國或歐洲)。

  6. 按一下 [Create Dataset] (建立資料集)

  7. 在導覽面板的「Resources」(資源) 底下,按一下 [fluentd] 資料集。

  8. 在「Query Editor」(查詢編輯器) 下方的詳細資料面板中,按一下 [Create Table] (建立資料表)

  9. 輸入 nginx_access 做為資料表名稱。

  10. 選取 [Edit as Text] (以文字形式編輯) 選項。

  11. 將以下 JSON 資料欄定義複製到文字方塊中。

    [  { "type": "TIMESTAMP", "name": "time" },
       { "type": "STRING",    "name": "remote" },
       { "type": "STRING",    "name": "host" },
       { "type": "STRING",    "name": "user" },
       { "type": "STRING",    "name": "method" },
       { "type": "STRING",    "name": "path" },
       { "type": "STRING",    "name": "code" },
       { "type": "INTEGER",   "name": "size" },
       { "type": "STRING",    "name": "referer" },
       { "type": "STRING",    "name": "agent" },
       { "type": "STRING",    "name": "http_x_forwarded_for" } ]
    

    您可以看到資料欄名稱與 Fluentd 記錄檔記錄中的名稱完全相符。系統會將記錄檔記錄中的時間戳記轉換為與 BigQuery 相容的時間戳記字串,藉此將 time 資料欄值新增至記錄。

  12. 在「Partitioning」(分區) 清單中,選取 [Partition by field: time] (依欄位:時間分區)

    分區資料表會將大型資料表分割為多個小區段,以減少查詢讀取的資料量,藉此改善查詢效能並控制成本。詳情請參閱 BigQuery 說明文件中的分區資料表簡介

  13. 按一下底部的 [Create table] (建立資料表)

    名為 fluentd.nginx_access 的 BigQuery 資料表現在已可接收記錄檔記錄。

  14. 如要查看資料表詳細資料,請在 [Resources] (資源) > [Details] (詳細資料) 底下,按一下資料表名稱。

    詳細資料可讓您查看有多少資料列,以及資料表使用了多少儲存空間等資訊。

設定記錄檔收集並將其轉送至 BigQuery

Fluentd 設定檔 /etc/td-agent/td-agent.conf 會定義收集記錄檔資料的來源、已收集之記錄檔的輸出,以及任何篩選器。此外,該檔案也能讓您將對已收集的記錄檔套用標記,藉此定義這些記錄檔的處理方式以及應傳送到哪個輸出外掛程式。

在下列程序中,您將設定 Fluentd 執行下列工作:

如要設定記錄檔收集和轉送:

  1. 使用 SSH 連線至安裝 NGINX 的 VM。
  2. 在殼層視窗中,以超級使用者的身分開啟文字編輯器 (例如開啟 Vim 或 Nano),然後編輯 Fluentd 代理程式設定檔 /etc/td-agent/td-agent.conf。例如,使用下列指令在 Vim 中開啟檔案:

    sudo vim /etc/td-agent/td-agent.conf
    
  3. 在檔案底部,附加以下內容以設定 tail 輸入外掛程式,讓外掛程式讀取 NGINX 記錄檔、使用 NGINX 剖析器剖析記錄檔,並為記錄檔加上 nginx.access 標記:

    <source>
      @type tail
      @id input_tail
      <parse>
        @type nginx
      </parse>
      path /var/log/nginx/access.log
      pos_file /var/log/td-agent/httpd-access.log.pos
      tag nginx.access
    </source>
    
  4. 附加以下內容來設定 BigQuery 輸出外掛程式。請將 [MY_PROJECT_NAME] 替換為您的 GCP 專案名稱。

    <match nginx.access>
      @type bigquery_insert
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    這會設定 Fluentd 執行下列工作:

    • 針對含有 nginx.access 標記的所有記錄檔項目,Fluentd 應使用 bigquery_insert 外掛程式將記錄寫入至 BigQuery 資料表。
    • 驗證是透過 VM 的服務帳戶執行。
    • 原始時間戳記會以字串的形式新增至記錄,該字串會採用能讓 BigQuery 轉換為時間戳記的格式。
  5. 儲存檔案並結束編輯器。

  6. 重新啟動 Fluentd 代理程式以套用新設定。

    sudo systemctl restart td-agent
    

如要進一步瞭解這些設定檔參數 (包括替代驗證方法),請參閱 BigQuery Fluentd 外掛程式網站Fluentd 外掛程式說明文件

在 BigQuery 中查看記錄檔

現在您已完成 Fluentd 設定,就可以產生一些 NGINX 記錄檔資料並使用 BigQuery 來查看資料。

  1. 在 GCP Console 中,前往 Compute Engine「VM Instances」(VM 執行個體) 頁面。

    前往「VM instances」(VM 執行個體) 頁面

  2. 複製 nginx-vm VM 執行個體的外部 IP 位址。

  3. 在另一個瀏覽器分頁中,將 IP 位址貼到位址方塊中。

    畫面上即會出現預設的「Welcome to nginx!」(歡迎使用 nginx!」) 頁面。

  4. 前往 GCP Console 的「BigQuery」頁面

  5. 將以下查詢複製到「Query Editor」(查詢編輯器) 窗格,然後按一下 [Run] (執行)

    SELECT * FROM `fluentd.nginx_access`
    

    「Query Results」(查詢結果) 面板中會出現一個資料列,資料列中會顯示來自您瀏覽器的存取記錄檔記錄。由於 VM 可以透過網際網路存取,因此可能也會顯示來自其他遠端主機的存取記錄檔資料列。

模擬負載及計算來自記錄檔的統計資料

在本節中,您將會執行範例負載,然後使用 BigQuery 查看這些負載的指標。透過執行這些步驟,您會發現 BigQuery 不僅能用來讀取記錄檔,還能在記錄檔上執行分析。

  1. 在 GCP Console 中啟動 Cloud Shell。
  2. 安裝 ApacheBench (ab) 網路伺服器基準化工具和相關工具:

     sudo apt install -y apache2-utils
    
  3. 在 Cloud Shell 中,產生要對 NGINX 伺服器執行的測試負載。請將 [IP_ADDRESS] 替換為 VM 的 IP 位址。

    ab -t 20 -c 1 http://[IP_ADDRESS]/
    

    這個指令會使用 ApacheBench 工具來對 NGINX 伺服器產生 20 秒的負載。

  4. 前往 GCP Console 的「BigQuery」頁面:

    前往「BigQuery」頁面

  5. 在「Query Editor」(查詢編輯器) 窗格中,使用下列查詢取得 ApacheBench 要求清單:

    SELECT * FROM `fluentd.nginx_access` limit 100
    
  6. 執行下列 SQL 指令來計算每秒每個回應碼的要求數量:

    SELECT
      time_sec, code, COUNT(*) as count
    FROM (
      SELECT
        TIMESTAMP_TRUNC(time, SECOND)AS time_sec, code
      FROM
        `fluentd.nginx_access`)
    GROUP BY
      time_sec, code
    ORDER BY
      time_sec DESC
    

    每秒的值應大約等於您之前在 ApacheBench 輸出中看到的「Requests per second」 資料行。

選用:針對量大的記錄作業使用批次載入

如上所述,BigQuery 串流資料插入 (如本教學課程所使用) 讓資料在幾秒內即可供查詢。這個方法需支付少許費用,而且對於資料插入的大小和頻率有所限制

針對量較大的記錄作業,您可能會想要使用 BigQuery 批次載入。顧名思義,這會使用優先順序較低的批次工作來載入資料。相較於串流資料插入,批次載入需要更多時間來載入資料並使其變成可用。不過,使用批次載入不需要付費。

與串流資料插入一樣,批次載入工作的頻率也有限制,其中最重要的限制有:每天每個資料表 1,000 個載入工作,以及每天每個專案 50,000 個載入工作。

如要實作批次載入,請使用 bigquery_load Fluentd 外掛程式。這個外掛程式會根據針對指定的檔案時間或大小限制,使用 Fluentd 緩衝區收集一組記錄檔,然後以批次方式將其傳送至 BigQuery。

如要使用批次載入,請執行下列操作:

  1. 以超級使用者身分編輯 Fluentd 設定檔 /etc/td-agent/td-agent.conf
  2. 將您先前指定的 BigQuery 輸出外掛程式設定替換為以下內容。請將其中的 [MY_PROJECT_NAME] 替換為您的 GCP 專案名稱。

    <match nginx.access>
      @type bigquery_load
    
      <buffer>
        @type file
        path /var/log/bigquery_nginx_access.*.buffer
        flush_at_shutdown true
        timekey_use_utc
        total_limit_size 1g
        flush_interval 3600
      </buffer>
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    這個設定會指定系統使用 bigquery_load 輸出外掛程式,而不使用 bigquery_insert 外掛程式。

    buffer 區段指定在 VM 中對記錄檔資料進行緩衝,直到最多收集到 1 GB 的記錄檔或最多已經過一小時為止。接著,緩衝資料會載入至 BigQuery。如要進一步瞭解設定參數,請參閱外掛程式說明文件

疑難排解

如果您在任何時間點懷疑代理程式並未收集或提供記錄檔,您可以在 Fluentd VM 的殼層視窗中執行下列指令來檢查其狀態:

sudo systemctl status td-agent

輸出會顯示服務處於有效狀態,以及服務記錄檔的最後幾行內容。

Active: active (running) since [DATE]

如果代理程式未啟動,最可能的原因是 Fluentd 設定檔中發生錯誤。這會在 Fluentd 記錄檔中回報,您可以使用下列指令在 VM 殼層視窗中查看記錄檔:

sudo less /var/log/td-agent/td-agent.log

例如,以下輸出顯示外掛程式名稱不正確時所發生的錯誤:

[info]: parsing config file is succeeded path="/etc/td-agent/td-agent.conf"
[error]: config error file="/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error="Unknown output plugin 'bad_plugin'. Run 'gem search -rd fluent-plugin' to find plugins"

清除所用資源

如何避免系統向您的 Google Cloud Platform 帳戶收取您因使用本教學課程中資源所產生的費用:

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往「Projects」(專案) 頁面

  2. 在專案清單中,找到您要刪除的專案並按一下「刪除」圖示 delete
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
解決方案