iT邦幫忙

2025 iThome 鐵人賽

0
Build on AWS

AWS架構師的自我修養:30天雲端系統思維實戰指南系列 第 41

# Day 23 | 可觀測性三大支柱(end):從監控到回答未知問題 - Logs, Metrics, Traces 的實踐

  • 分享至 

  • xImage
  •  

三大支柱的整合運用

讓我們先來看一個典型的場景:

問題: 客戶回報「結帳頁面有時會卡很久」。

  1. 從「指標」開始 (發現異常):
    • 我們的監控儀表板(基於 Metrics)觸發了警報:「checkout-service 的 P99 請求延遲,在過去 15 分鐘內,從 200ms 飆升至 5000ms」。
    • 我們現在知道了: 「什麼」 出了問題(延遲飆升),以及問題的宏觀 「位置」(在結帳服務)。
  2. 轉向「追蹤」 (定位瓶頸):
    • 我們篩選出警報時間段內,一筆耗時特別長的請求 Trace。
    • 在追蹤的瀑布圖中,我們一目了然地看到,整個請求耗時 5 秒,其中有 4.8 秒都消耗在 checkout-service 對 payment-service 的一次 gRPC 呼叫上。
    • 我們現在知道了: 問題的 「具體瓶頸」 在於支付服務的調用。
  3. 深入「日誌」 (探尋根源):
    • 我們從那筆緩慢的追蹤 Span 中,複製出 trace_id。
    • 我們拿著這個 trace_id,去我們的集中式日誌系統中進行搜索。
    • 系統立刻返回了與這筆請求相關的所有日誌,我們發現 payment-service 中有這樣一條錯誤日誌:「[ERROR] Failed to connect to third-party payment gateway 'PayEagle'. Timeout after 3 retries. trace_id: t-xyz789」。
    • 我們現在知道了: 問題的 「根本原因」 是我們依賴的第三方支付網關出了問題。

這個 「指標 -> 追蹤 -> 日誌」 的偵錯流程,就是可觀測性在實踐中的核心價值。也是我們從可觀測性一路從了解走到整合最佳化實現。

現在,我們要聊聊如何將它們徹底融合為一個協同作戰的、強大的洞察力系統。一個真正的架構師,其價值不僅在於構建系統,更在於理解系統,而這種理解力,正來源於三大支柱的整合運用。

關聯性分析 (Correlation)

真正的可觀測性來自於將日誌、指標和追蹤關聯起來的能力:

三大支柱的整合魔法,源於一個核心概念: 關聯性。如果數據之間是孤立的,它們的價值將大打折扣,我們必須用一根「金線」,將散落在各處的指標、追蹤和日誌串聯起來,形成一個完整的證據鏈。

想像一個偵探的證據板,指標 是牆上標示出的「案發時間」和「地點」, 追蹤 是中間用紅線繪製出的「受害者行動路線圖」,而 日誌 ,則是釘在路線圖上每個節點的「詳細證物照片」和「證人筆錄」。只有當這一切都被 案件編號(Trace ID)這根線串起來時,整個案件才能被完整還原。

  • 串聯一切的黃金線:共享的上下文 ID (Shared Context ID)
    • Trace ID 是黃金標準: 在一次請求的生命週期中,從前端到後端,跨越所有微服務,都必須傳遞同一個 Trace ID。
    • 其他業務 ID 也至關重要: 例如 User ID, Order ID, Session ID。
  • 如何實現關聯?
    1. Trace ID 注入日誌: 我們的結構化日誌中,必須包含 Trace ID 欄位。當我們的追蹤工具(如 X-Ray SDK)和日誌函式庫(如 python-json-logger)正確配置後,這一步通常可以自動完成。
    2. 從指標跳轉到追蹤: 現代的可觀測性平台,允許我們在儀表板的指標圖表上,直接點擊一個異常的時間點,平台會自動篩選出該時間段內,與該指標(例如 service:checkout-service)相關的 Trace 列表。
    3. 從追蹤跳轉到日誌: 在查看一個緩慢的 Trace 時,我們可以直接點擊某個 Span,平台會利用該 Span 帶有的 Trace ID,自動為我們查詢出與該操作完全對應的詳細日誌。

可觀測性驅動的偵錯工作流程

當警報響起時,一個擁有可觀測性系統的團隊,會遵循一個清晰、高效、可重複的工作流程,我們稱之為 「M-T-L 偵錯漏斗」 (Metrics -> Traces -> Logs Funnel)。

這個流程的目標,是將一個模糊、影響範圍巨大的問題,層層下鑽,最終定位到一行具體的程式碼或一個明確的外部依賴。

場景:使用者報告「結帳很慢」

Step 1: 偵測 (Detect) with METRICS

  • 起點: 一個宏觀的、基於症狀的警報被觸發。
  • 例子: CloudWatch 告警:「電商網站 checkout-service 的 P99 延遲在過去 5 分鐘超過了 2 秒。」
  • 我們知道了: 什麼 出了問題(延遲),問題的宏觀 位置 在哪(結帳服務)。
  • 問題範圍: 非常廣泛(整個服務)。
  • 範例:
-- CloudWatch Insights 查詢
fields @timestamp, ResponseTime
| filter operation = "create_order"
| stats avg(ResponseTime), max(ResponseTime), p95(ResponseTime) by bin(5m)
| sort @timestamp desc

Step 2: 隔離 (Isolate) with TRACES

  • 行動: 我們立即前往追蹤系統(如 X-Ray),篩選出在告警時間段內,checkout-service 的緩慢請求 Trace。
  • 例子: 我們打開一筆耗時 5 秒的 Trace,在瀑布圖中,我們發現 95% 的時間(4.8 秒)都消耗在對 payment-service 的一次 API 調用上。
  • 我們知道了: 問題的 具體瓶頸 在哪裡(對支付服務的調用)。
  • 問題範圍: 急遽縮小(單一的服務間調用)。
  • 範例:
在 X-Ray 控制台中:
- 篩選 ResponseTime > 5000ms 的追蹤
- 按照服務分析延遲分佈
- 識別瓶頸服務

Step 3: 調查 (Investigate) with LOGS

  • 行動: 我們從那個緩慢的 payment-service Span 中,複製出 Trace ID。
  • 例子: 我們將 Trace ID 貼到日誌查詢系統(如 CloudWatch Logs Insights)中,立刻篩選出了與這次支付請求相關的所有日誌。我們發現了數條錯誤日誌,內容是:「第三方支付網關 API 回應超時,正在進行第 3 次重試...」。
  • 我們知道了: 問題的 根本原因 是什麼(外部依賴項出了問題)。
  • 問題範圍: 精準定位到單一事件。
  • 範例:
-- 查詢相關日誌
fields @timestamp, event_type, error_message, duration_ms
| filter correlation_id = "abcd-1234-efgh-5678"
| sort @timestamp asc

流程圖

          廣泛問題 (整個服務)
      +-------------------------+
      |      METRICS (偵測)     |  <-- 延遲警報
      +-------------------------+
                  |
                  ▼ (範圍縮小)
      +-------------------------+
      |       TRACES (隔離)     |  <-- 找到瓶頸 Span
      +-------------------------+
                  |
                  ▼ (範圍縮小)
      +-------------------------+
      |        LOGS (調查)      |  <-- 找到根本原因日誌
      +-------------------------+
          精準的根本原因

可觀測性的成本效益分析

導入可觀測性,是一項需要投資的工程。作為架構師,我們需要清晰地闡述其 ROI(投資回報率)。

實施成本 (Cost):

  • 工具成本: SaaS 平台(如 Datadog, New Relic)的訂閱費用,或自建開源方案(如 OpenSearch, Prometheus)的基礎設施與維護成本。
  • 數據成本: 雲端供應商收取的遙測數據傳輸、攝取(Ingestion)與儲存費用。日誌和追蹤的數據量通常很大。
  • 人力成本: 工程師進行程式碼埋點、維護儀表板和告警規則所需的時間。
# 月度成本估算 (以 1000 RPS 的服務為例)
CloudWatch_Logs:
  ingestion: "$50/GB" # 約 10GB/月
  storage: "$0.03/GB/月"

CloudWatch_Metrics:
  custom_metrics: "$0.30 per metric per month"
  api_calls: "$0.01 per 1000 requests"

AWS_X_Ray:
  traces_recorded: "$5.00 per 1 million traces"
  traces_retrieved: "$0.50 per 1 million traces"

total_monthly_cost: "約 $200-400"

投資回報

  1. 大幅降低平均解決時間 (MTTR): 這是最直接、最核心的價值。我們在 <開發者體驗(DX)優化:內部工具與排錯設計>< 為「排錯」而設計的系統思維> 就有說過 可操作的錯誤訊息 (Actionable Error Messages)最終目標就是 「每一次錯誤處理,都必須成為一次立即的、高效的、自導向的除錯成功手術。」,清楚的 錯誤訊息 (Error Messages) 能夠大幅度減少修復時間成本,進而省下更多業務成本 。
  2. 提升開發者生產力: 就像我們在<開發者體驗(DX)優化:內部工具與排錯設計>所強調的 系統性地消除所有「摩擦力 (Friction)」與「認知負擔 (Cognitive Load)」,讓開發者能將最多的時間與心力,投入在解決真實的商業問題上 。 工程師花在「救火」和「猜測問題根源」上的時間越少,就能投入越多的時間去開發能創造價值的新功能。

    $ 心流時間 \over (認知負擔 × 摩擦力)$ = 商業價值產出

  3. 改善客戶體驗與降低流失率: 更快地解決問題、甚至在影響擴大前就主動發現問題,能顯著提升用戶滿意度,降低客戶流失。
  4. 數據驅動的決策能力: 可觀測性數據不僅能用於偵錯,還能為產品和業務決策提供依據。

業務的可觀測性

這是可觀測性思維的終極延伸。它主張:我們可以,也應該用監控技術系統的方式,來監控我們的業務流程。 我們將業務事件(例如:用戶註冊、商品加入購物車、訂單支付),視為系統中的一等公民,並對它們進行埋點和觀測。

業務情境一:購物車放棄率的根源分析

問題: 「為什麼本週的購物車放棄率,比上週高了 15%?」

  • 傳統方法: 等待數據分析師在幾天後,從數據倉儲中撈取數據,製作報表,提出可能的猜測。
  • 可觀測性方法:
    • Metrics: 我們有一個即時儀表板,顯示「購物車放棄率」,並可按「設備類型」、「用戶地區」、「商品類別」等維度進行切分。我們立刻發現,放棄率的飆升,主要集中在「使用 iOS App 的美國用戶」。
    • Traces: 每一個用戶的「結帳流程」,都是一筆 Trace。這個 Trace 包含 view_cart -> enter_shipping -> apply_promo_code -> select_payment -> confirm_purchase 等 Span。我們篩選出那些失敗的 Trace,發現大量的請求,都在 apply_promo_code 這個 Span 之後就終止了。
    • Logs: 我們帶著這些失敗的 Trace ID 去查日誌,發現了大量內容為「Promo code 'SUMMER25' is invalid for region 'US'」的警告日誌。
  • 結論: 我們在幾分鐘內就得出了精準結論:「市場部針對歐洲區的『SUMMER25』優惠碼,被錯誤地推送給了美國的 iOS 用戶,導致他們在結帳的最後一步,因優惠碼無效而放棄訂單。」 這是一個極其具體的、可立即採取行動的業務洞察。

業務情境二:A/B 測試的深度效果評估

問題: 「我們新上線的『一鍵下單』按鈕(B 版本),相較於舊的流程(A 版本),效果真的更好嗎?」

  • 傳統方法: 只比較兩個版本的最終轉換率。
  • 可觀測性方法:
    • Instrumentation: 當用戶被分配到 B 版本時,所有與他相關的 Metrics, Traces, Logs 都會被自動打上一個標籤或註釋:ab_test_group: 'B'。
    • 整合分析:
      • Metrics: 我們可以在同一個儀表板上,並排比較 conversion_rate{group:A} 和 conversion_rate{group:B} 的即時變化。
      • Traces: 我們可以篩選出 B 組用戶的 Trace,分析他們的平均請求延遲是否比 A 組更低。也許 B 版本的轉換率更高,但它的後端服務壓力也更大,導致延遲增加。
        -Logs: 我們可以篩選 B 組用戶的錯誤日誌,看看新功能是否引入了新的、意想不到的 Bug。
  • 結論: 我們得到的不再是一個單一的「B 版本更好」的結論,而是一個立體的、包含業務成效、技術性能和系統穩定性的完整評估報告,從而做出更明智的產品決策。

總結:建立可觀測性文化

可觀測性遠不止是一套技術實踐,它更是一種深刻的工程文化、一種組織看待和應對複雜性的集體心智模型。它標誌著一個團隊,從被動的「救火隊」文化,演進為主動的「學習型組織」文化。

關鍵原則:可觀測性文化的五大信條

  1. 觀測性優先設計:將可觀測性視為產品的核心基因,而非事後補救

    • 這意味著「可觀測性」必須被納入功能的**「完成的定義」(Definition of Done)**中。一個新功能,如果沒有對應的指標、日誌和追蹤來描述其健康狀況,那它就根本沒有完成。我們問的問題,從「這個功能能用嗎?」,變成了「當這個功能在凌晨三點、面對超出預期十倍的流量而失敗時,我們能否在五分鐘內知道是為什麼嗎?」
  2. 高基數數據:擁抱細節,因為魔鬼藏在細節裡

    • 這意味著我們要抵制過早聚合數據的誘惑。低基數的指標告訴我們「有 100 個用戶結帳失敗」,而高基數的日誌和追蹤註釋,則能告訴我們「這 100 個用戶中,有 95 個都是因為使用了『VIP2025』這張過期的優惠券」。前者讓我們陷入恐慌,後者則直接給了我們解決方案。
  3. 即時性:追求數據的「新鮮度」,因為洞察力的價值隨時間衰減

    • 在數位世界,幾分鐘的延遲,可能就意味著數百萬的營收損失或品牌聲譽的崩塌。建立即時的數據管道與分析能力,是為了讓團隊能夠在問題剛發生時就介入,而不是在災難已經造成後,才開始閱讀「歷史報告」。
  4. 關聯性:數據的價值不在於其本身,而在於其連結

    • 這是將三大支柱從三個孤島,變為一個協同大陸的關鍵。如果說指標、日誌和追蹤是珍珠,那麼 Trace ID 和其他共享上下文的 ID,就是串起它們的項鍊。沒有這條線,我們擁有的只是一堆散亂的數據;有了它,我們才擁有了一個關於系統行為的完整故事。
  5. 可操作性:讓每一次告警,都成為一次有意義的對話

    • 這意味著我們要向「告警疲勞」宣戰。每一條自動觸發的告警,都必須是高信噪比的、能直接指向一個潛在問題的信號,並且最好能附帶一份「行動手冊」(Runbook)的連結。告警的目標不是製造噪音,而是觸發一次精準、有效的應對行動。

實施建議:團隊走向可觀測性成熟度的三步演進

  • 階段一 (奠定基石 - Foundation Building):
    • 目標: 停止流血,結束「盲飛」狀態。
    • 核心任務: 建立統一的工具鏈,將散落在各處的日誌、指標和追蹤數據,匯集到一個單一的、可查詢的平台。在這個階段,我們追求的是數據的「可用性」,確保當問題發生時,我們至少有原始的數據可以用來調查。
  • 階段二 (整合優化 - Insight Connection):
    • 目標: 從數據中提煉洞察,化被動為主動。
    • 核心任務: 建立數據間的關聯(例如 Trace ID 注入日誌),創建面向角色的儀表板,並設定基於症狀(而非底層原因)的智慧告警。在這個階段,我們追求的是數據的「可操作性」,讓數據能主動地告訴我們問題在哪裡。
  • 階段三 (文化轉型 - Cultural Internalization):
    • 目標: 將可觀測性內化為團隊的本能。
    • 核心任務: 此階段的重點不再是工具,而是人與流程。將可觀測性的實踐,納入程式碼審查(Code Review)、架構設計和事後檢討(Post-mortem)等所有核心流程中。賦予開發者探索數據的權限與能力,並建立一個鼓勵提問、數據驅動、無懼失敗的「無咎文化」(Blameless Culture)。在這個階段,我們追求的是將「可觀測性」變成整個工程團隊的共同語言和肌肉記憶。
階段一 (基礎建設):
  - 建立集中化日誌系統
  - 實施基礎指標收集
  - 部署分散式追蹤

階段二 (整合優化):
  - 建立關聯性查詢能力
  - 實施異常檢測和告警
  - 建立可觀測性儀表板

階段三 (文化轉型):
  - 培訓團隊使用可觀測性工具
  - 建立基於數據的偵錯流程
  - 持續優化和自動化

關鍵要點

  • 思維轉變:從「我知道可能出什麼問題」到「我有能力發現未知問題」
  • 三大支柱:日誌記錄事件,指標衡量表現,追蹤展現旅程
  • 整合關聯:透過 correlation_id 和 trace_id 建立數據關聯性
  • AWS 實踐:善用 CloudWatch, X-Ray 和 CloudWatch Insights
  • 文化建設:將可觀測性融入開發和運維流程

可觀測性的終極目標,是在系統最混沌、壓力最大的時刻,賦予團隊,快速恢復「清晰視野」與「掌控感」的能力。


上一篇
Day 23 | 可觀測性三大支柱(1):從監控到回答未知問題 - Logs, Metrics, Traces 的整合
下一篇
Day 24 | 定義與衡量可靠性:SRE 方法與錯誤預算的實踐(上) - SLI、SLO 與錯誤預算的核心概念,平衡創新速度與系統穩定性的數據驅動決策
系列文
AWS架構師的自我修養:30天雲端系統思維實戰指南44
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言