iT邦幫忙

2025 iThome 鐵人賽

DAY 20
1
Modern Web

Line Bot × NestJS:30 天開發日記系列 第 20

Day 20:Grafana Loki 日誌服務 - 從申請到 API 串接測試

  • 分享至 

  • xImage
  •  

2025 鐵人賽背景圖

前言

目前已經理解了 LINE Messaging API 的核心功能,包括如何接收訊息、串接第三方服務,以及發送多種類型的訊息。接下來,我們將把原本架設在 ngrok 的後端伺服器,透過 GitHub 自動化部署到 Render 平台上線。

在正式部署到生產環境之前,完善的日誌系統至關重要。本文將先完成 Grafana Cloud Loki 的申請與配置,透過 Postman 測試 HTTP API 推送日誌的流程,為後續整合 NestJS 與 Pino 日誌庫做好準備,確保系統上線後具備完整的可觀測性。

Grafana Cloud loki 是什麼?

Grafana Cloud Loki 是基於開源專案的日誌系統,專為雲端原生應用設計。其核心特色在於僅對日誌的元數據標籤(labels)建立索引,並且將日誌數據本身壓縮後儲存在 Object Storage 中,透過小型索引和高度壓縮的資料塊大幅降低營運成本。同時與 Grafana Dashboard 高度整合,可以供統一的日誌查詢和相關模板視覺化介面。

雖然 Loki 主要透過 Agent 進行日誌收集,但為了簡化部署架構,本文將採用 HTTP API 的方式讓應用程式直接傳送日誌數據,使 NestJS 應用結合 Pino 日誌庫能夠快速整合至 Loki 服務中。

【 使用 HTTP API 方式需要完成以下準備工作】:

  • 申請並配置 Grafana Cloud Loki 的 API Token
  • 設定適當的讀寫權限(Access Policy)

【 Grafana Cloud Loki free plan 限制 】

  1. 每月資料攝取量上限:50 GB
  2. 日誌保留期限:14 天

Grafana Loki 的日誌收集架構

申請 Grafana Cloud Loki 並取得 API Token

Step 1:註冊並登入 Grafana 官網後,即可看到此畫面

Grafana 登入後顯示畫面

Step 2:進入 Grafana 帳戶管理頁面

再次前往 Grafana 官網,點選右上角的 My Account 進入帳戶管理。

Grafana 免費方案提供了多種雲端服務工具可供試用,包含 Loki(日誌管理)、k6(效能測試)等實用工具,適合入門學習使用。

Grafana 免費方案雲端服務項目

Step 3:點選 Grafana Cloud Stack 下方的灰色按鈕「Details」

Grafana Details

Step 4:找到 Loki 日誌系統,點選藍色按鈕「Send Logs」

Grafana Loki

Step 5:產生 API Token

點選 Password 欄位旁的 Generate now 按鈕以產生 API Token

  • URL 及 User 的部分會在後續 HTTP 測試中使用!!!(先貼到記事本)
  • Generate 產生的 API Token 也會在後續 HTTP 測試中使用!!!(先貼到記事本)

Grafana_Loki_Generate

Step 6:建立 HTTP 請求 Loki 所需的 API Toke

建立 API Token 時,預設 Scope 僅有讀取權限,我們還需要新增寫入權限才能將日誌推送到 Loki

請留意 Token 的名稱設定,稍後需要用它來調整權限。

Grafana_Create_API_Token

Step 7:調整 API Token 權限

點選左側選單的 Access Policies,找到剛才建立的 Policy(可透過名稱比對),點選進入編輯。

Grafana 查看 Policy

Step 8:設定 Policy 僅保留日誌讀取權限

進入 Access Policies 後,找到剛才建立的 Policy,將權限調整為僅保留日誌讀取權限,其他暫時用不到的權限可以關閉。

調整 Grafana Policy 權限

Step 9:建立日誌寫入權限的 Access Policy

點選 Create access policy 建立第二個 Policy,這次僅設定日誌寫入權限。

  • 讀取 Policy:允許透過 Grafana 介面查詢和檢視 Loki 中的日誌
  • 寫入 Policy:允許應用程式透過 HTTP 請求將日誌推送至 Loki

Grafana Policy Log 讀寫分離

完成以上設定後,Grafana Cloud Loki 透過 HTTP 傳輸的相關配置就完成了。Retry

透過 Postman 測試 Grafana Cloud Loki API

根據 Grafana Loki HTTP 官方文件,我們可以使用 /loki/api/v1/push 端點進行日誌推送測試。

【 Postman 測試設定 】

Step 1:設定當前時間戳至環境變數

若時間戳與當前時間差距過大,會回傳 400 錯誤

透過 Pre-request Script 在發送請求前取得當前時間戳,並設定為環境變數供 body 使用。

Postman 設定 Pre-request

Step 2:設定 Postman 請求參數

  • 完整 URL:步驟 5 的 URL + /loki/api/v1/push
  • Authorization:Type 選擇 Basic Auth
    • Username:步驟 5 的 Name
    • Password:步驟 5 的 API Token
  • Body:選擇 raw 格式,類型為 JSON
{
  "streams": [
    {
      "stream": {
        "app": "nestjs",
        "service": "nestjs-api"
      },
      "values": [
        [ "{{now_ns}}", "Grafana Postman Test Message" ]
      ]
    }
  ]
}
  • stream 中的標籤(如 app、service)可透過 Grafana Loki 的 LogQL 進行查詢
  • values 陣列格式為:[時間戳, 日誌訊息]

Step 3:發送測試請求

將上述 JSON 內容貼至 Postman 的 Body 欄位,點擊 Send 發送請求。

收到狀態碼 204 表示日誌已成功推送至 Grafana Loki

Postman 送出資料至 Grafana Loki

在 Grafana Cloud Loki 查看日誌記錄

Step 1:進入 Grafana 儀表板

登入 Grafana Cloud 官網後,點擊 Launch 按鈕即可進入儀表板。

Grafana Lauch

Step 2:選擇 Loki 資料源

點選左側選單的 Explore,然後選擇對應的 Loki 資料源。

Grafana-Loki 服務

Step 3:使用標籤選擇器篩選日誌

透過標籤選擇器篩選日誌,並確認時間區間內有相應的日誌資料。

Grafana Loki 根據標籤選擇器查詢

完成以上步驟後,我們已成功透過 HTTP 將應用程式日誌推送至 Grafana Loki,並可使用標籤選擇器進行查詢。

本日結語

今天完成了 Grafana Cloud Loki 的申請與配置,包括 API Token 建立、讀寫權限分離設定,並透過 Postman 成功測試日誌推送功能。

Grafana Loki 採用 LogQL 語法查詢日誌,透過標籤篩選資料並以 Pipeline 串接運算符處理,官方文件提供豐富範例可深入學習進階用法,目前我們先用基礎標籤選擇器確認日誌已成功寫入。


上一篇
Day 19:Flex Message Carousel 食譜分享
下一篇
Day 21:Nest Pino 整合 Grafana Loki 日誌
系列文
Line Bot × NestJS:30 天開發日記21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言