iT邦幫忙

2025 iThome 鐵人賽

0
Build on AWS

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

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

  • 分享至 

  • xImage
  •  

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

在我們為系統建立了堅實的零信任安全基礎之後,下一步,就是賦予這個系統「自我表達」的能力。一個無法被理解的系統,無論多麼安全、多麼強大,終究是一個黑盒子。

「可觀測性」(Observability) 正是打開這個黑盒子的鑰匙,它讓我們從被動地 「監控」 已知的問題,進化到主動地 「探索」 未知的根源。只有當我們建立起一套能夠整合宏觀指標、微觀日誌、和路徑追蹤的系統時,我們才真正擁有了 理解駕馭 複雜性的能力。

在成為工程師之前,我曾經是服務於奧美集團中的一個品牌形象助理, 奧美(Ogilvy) 是將「品牌」這個抽象、感性的概念,透過系統化、結構化的方法進行管理的殿堂。品牌經營,尤其是危機處理,是闡述 「可觀測性」 重要性最生動、最貼切的案例之一。

在這個工作經驗中我經歷過很多很有意思的事,也在短短的服務時間中協助了一些品牌的形象經營。在這個過程中作為品牌形象經營必須無時無刻關注客戶是否有重大議題產生與突然產生的風潮。就像安迪沃荷曾說過的:"在未來,人人都可成名 15 分鐘。",一個品牌 - 不論是自然人或是法人 - 可能在他的生命週期中就在等那個浪潮來登峰造極,錯過了這次魚汛也不知道下次要再有無機會發光發熱,這時候就凸顯可觀測性的重要性 - 它是與我們目標世界的交互介質,就像我們的眼耳鼻舌身有眾多的受器來感知世界一樣。

接下來就來聽聽前奧美助理,來聊聊一場缺乏「受眾可觀測性」會引發的災難。

一場災難的誕生

我們手邊有一個知名快時尚服飾品牌(我們稱之為 "StylePulse"),它的目標是透過新一季的行銷活動,提升品牌在年輕族群中的好感度與購買意願。

在這一季的行銷企劃中,StylePulse 斥巨資邀請了一位當紅韓國偶像擔任最新一季的品牌代言人,並在週一上午 10 點,全渠道(電視、網路、戶外看板)同步上線了全新的形象廣告。

Case A: 只有「監控」思維的品牌團隊(缺乏可觀測性)

這個團隊的做事方法比較傳統,他們只關心預先設定好的、宏觀的「監控指標」。

  • 週一: 廣告上線。團隊查看 指標:電視廣告觸及率達標、YouTube 影片觀看次數穩定上升、公關稿被多家媒體轉發。他們在會議上報告:「初步數據良好,活動開局順利。」

  • 週一晚上: 代言偶像被爆出嚴重的負面醜聞(例如:家暴、霸凌、感情不忠)。社群媒體瞬間引爆。

  • 週二至週四: 品牌團隊按照舊習慣,並未即時、全面地爬取並分析社群上的原始留言(日誌)。他們的工作儀表板上,只有「總觀看數」、「總觸及率」等延遲的、聚合的指標,這些數字因為事件的熱度甚至還在上升,給了他們一切正常的假象。

  • 週五: 團隊進行每週一次的「社群輿情匯報」。他們打開 FB、IG、Tiktok、Dcard 和 PTT,才驚恐地發現成千上萬的留言,內容是:「StylePulse 還在用這種失德藝人,一生黑!」、「噁心,昨天剛買的衣服,現在就想退貨」、「品牌價值觀有問題,再也不買了」。

  • 下週一: 銷售數據報告出爐,上週的線上銷售額斷崖式下跌 70%。追蹤數據顯示,大量的用戶在把商品加入購物車後,最後一步放棄了結帳。

由於缺乏即時的可觀測性,品牌團隊延遲了整整四天才意識到災難的發生,他們錯過了應對危機的黃金 72 小時。品牌的聲譽已經嚴重受損,代言合約和行銷費用付諸東流,後續需要花費數倍的精力來進行危機公關和彌補銷售損失。他們只看到了 「監控」 的儀表,卻對系統內部的 「真實狀態」 一無所知。

Case A: 只有「監控」思維的品牌團隊(缺乏可觀測性)

這個團隊(也是在奧美中的普世價值團隊)深知,宏觀指標遠遠不夠,必須深入數據的紋理。

  • 週一上午 10 點: 廣告上線。

  • 週一晚上 11 點: 醜聞爆發。團隊設置的 社群監聽系統(Metrics 的一部分) 立刻觸發警報:指標顯示,「StylePulse + 代言人」的關鍵字組合,在過去一小時內「負面聲量」飆升 3000%。

  • 週二凌晨 1 點: 值班的社群經理被警報喚醒。他立刻深入 原始輿情(日誌) ,在 FB、IG、Tiktok、Dcard 和 PTT 上看到了海嘯般的第一手負面評論。他明白了 「為什麼」 指標會異常。

  • 週二凌晨 2 點: 他同時調閱了 即時轉換漏斗(追蹤) ,發現從晚間 11 點後,網站的「完成結帳率」從 5% 驟降至 0.5% 。他確認了問題的 「具體影響環節」

  • 週二早上 7 點: 在高層主管上班前,一份包含 「發生了什麼(指標)、為什麼發生(日誌)、以及對業務的具體影響在哪(追蹤)」 的完整情勢分析報告,已經送到了他們的郵箱。

  • 週二早上 9 點: 危機處理小組召開會議, 基於充分的數據,果斷決策 :立即 暫停所有相關廣告投放法務團隊介入合約處理公關團隊擬定聲明

這個案例清晰地表明,在一個資訊高速流動、消費者心聲可以即時影響品牌生死的時代,缺乏可觀測性的品牌管理,無異於在雷區中閉眼狂奔。因為擁有完整的可觀測性,品牌在危機發生後的幾小時內,就掌握了全貌並採取了行動。雖然醜聞的發生無法避免,但他們成功地在品牌聲譽和銷售額遭受毀滅性打擊前,設立了 「停損點」

假如一個虛擬案例不夠過癮的話,來讓我們聊聊 始祖鳥 x 蔡國強 這個堪稱是品牌可觀測性失敗的教科書級別教材案例吧。它比單純的代言人醜聞更複雜、更深刻,因為它觸及了一個品牌最核心的靈魂 - 商業價值。

始祖鳥 (Arc'teryx),原本是一個在戶外運動愛好者心中,與「專業性能」、「極致工藝」、以及「尊重自然」等價值觀深度綁定的頂級品牌。在近期(09,2025)與國際知名藝術家蔡國強合作,在白雪皚皚的群山上,以火藥爆破的方式進行藝術創作,並將過程拍攝成極具視覺震撼力的影片進行傳播。然而這樣子的行為立即在核心客群(登山者、環保主義者、戶外社群)爆發巨大反彈,指責品牌偽善,為了「藝術」之名破壞原始環境,違背了「無痕山林」(Leave No Trace)的核心精神,母公司 Amer Sports 股價當日應聲下跌 5%。

讓我們用三大支柱來解剖,始祖鳥的品牌團隊在這場風暴中,可能看到了什麼,又錯過了什麼。

可觀測性框架下的失敗診斷

  1. 指標 (Metrics) - 華麗但誤導的儀表板

在活動初期,如果團隊只看傳統的「行銷監控」指標,他們看到的可能是一片大好:

  • 影片總觀看數:極高,因為畫面確實震撼。
  • 媒體曝光量 (Media Impressions):極高,大量藝術、時尚類媒體會報導這次跨界合作。
  • 社群分享數:極高,視覺衝擊力強的內容易於傳播。
  • 關鍵字搜尋量:飆升,品牌知名度在短時間內迅速擴大。

災難的根源:他們在監控一個 「藝術事件」 的成功,而非一個 「品牌溝通」 的成功。他們的儀表板上,很可能缺少了最關鍵的指標: 「核心客群的情感共鳴度」「品牌價值一致性感知」 ,當所有 vanity metrics(虛榮指標) 都呈現一片綠燈時,真正的系統崩潰正在悄然發生。

  1. 日誌 (Logs) - 被忽略或誤讀的「核心社群」心聲

真正的災難,潛藏在最原始、最真實的「日誌」裡。這些日誌,並不在光鮮的時尚媒體評論區,而在那些硬核的戶外論壇、登山 KOL 的留言區、以及品牌忠實粉絲的 Instagram 評論中。

真實的日誌內容:

  • 「一件 GORE-TEX 夾克最重要的價值,是讓我們在山裡時,不留下一點痕跡。我們們現在卻用火藥在山上留下最大的痕跡。」
  • 「偽善。用『探索自然』來賣高價裝備,卻用破壞自然來搞行銷。」
  • 「我衣櫃裡五件始祖鳥的衣服,今天看起來格外諷刺。」
  • 「始祖鳥竟然會同意,這是對「無痕山林」( 核心價值 )最徹底的背叛。」

災難的根源:品牌團隊可能犯了兩個錯誤:一是 監聽的頻道(Channel)錯誤 ,過於關注大眾媒體而忽略了核心社群的垂直媒體;二是更致命的 解讀(Parsing)錯誤 ,他們可能預期到會有少量環保爭議,但完全低估了這在他們核心用戶心中的 嚴重性(Severity Level) 。他們沒能理解,對於這群用戶來說,「無痕山林」不是一句行銷口號,而是信仰。

  1. 追蹤 (Traces) - 一條從「仰慕」到「背叛」的用戶旅程

品牌團隊心中設想的用戶旅程(Trace)可能是線性的、正向的。

預期的 Trace:

看到震撼影片 -> 感受到品牌的藝術品味與高端定位 -> 品牌好感度提升 -> 產生購買慾望 -> 完成購買

但對於核心客群,實際發生的 Trace 卻是一條災難性的「錯誤處理」路徑:

實際的 Trace:

看到震撼影片 -> 產生認知失調(「我熱愛的品牌在做我反對的事」) -> 檢查社群評論(尋找共鳴) -> 確認品牌行為引發眾怒 -> 情感從困惑轉為失望與憤怒 -> 交易失敗(取消購買/退貨) -> 關係降級(公開批評品牌/轉向競品)

災難的根源:品牌的「Trace 設計」基於一個錯誤的假設:藝術的價值可以凌駕於一切。他們沒有在系統中埋下一個關鍵的「檢查點」:這次溝通,是否會與我們最忠實客戶的核心價值觀產生衝突?

接下來我們回想一下,在整個系統設計的過程中,我們一直不斷地強調

系統是商業邏輯的實現

可觀測性就是協助我們觀察我們的 商業邏輯的實現 是否成功運行的唯一方針,一個可觀測的系統,是即使在發生我們從未預想過的故障模式時,我們依然能透過其輸出的數據( Logs, Metrics, Traces )來推斷出問題的根本原因,這三大支柱共同提供了一個系統健康狀況的完整視圖。 監控 是針對已知問題提問,而 可觀測性 則是讓我們有能力在系統出現未知問題時進行偵錯。

始祖鳥的案例告訴我們,最高級的 可觀測性 ,不是監控螢幕上的數字,而是 將自己變成系統的一部分, 用系統的內在邏輯(核心商業邏輯) 去思考

首先,我們必須釐清一個最核心的觀念: 「監控」(Monitoring)「可觀測性」(Observability) 有何不同?它們並非同義詞,而是一個重要的思維演進。

監控 (Monitoring) 是我們設定已知問題的儀表板。我們事先知道需要關心什麼,於是我們設定好儀表和警報,去盯著這些指標。它回答的是 「是不是」 的問題。

可觀測性 (Observability) 則是賦予我們探索未知問題的能力。我們必須承認在複雜的現代系統中,無法預知所有可能的失敗模式。(除非是某些印度人口中的"系統")。因此,我們需要建立一套系統,讓我們能透過豐富的數據,提出並回答我們從未想過的問題。它回答的是 「為什麼」和「是什麼」 的問題。

讓我們用一個比喻來加深理解:

維度 監控 (Monitoring) 可觀測性 (Observability)
核心問題 「我的系統 CPU 使用率是否超過 80%?」(一個已知的問題) 「為什麼過去一小時,只有來自安卓用戶的訂單成功率下降了 30%?」(一個未知的問題)
目標 透過預先設定的儀表板和警報,監視系統的健康狀態。 透過豐富的遙測數據(telemetry data),偵錯和理解系統的內部行為。
方法 收集指標 (Metrics),製作儀表板(Dashboard)。 收集並關聯日誌 (Logs)、指標 (Metrics)、追蹤 (Traces) 這三大支柱。
抽象比喻 汽車的儀表板我們可以看到時速、油量、引擎溫度——這些都是預先設計好的、已知的關鍵指標。 一位經驗豐富的賽車工程師,帶著全套診斷工具他不僅能看到儀表板,還能隨時調取引擎 ECU 的詳細日誌、分析輪胎的磨損數據、追蹤燃油從油箱到噴油嘴的完整路徑,從而解答「為何賽車在第三彎道會損失 0.1 秒」這種儀表板無法回答的問題。

在微服務、Serverless 和容器化的時代,系統的複雜性呈指數級增長,失敗不再是簡單的 「服務器宕機」 ,而是由一系列微小、連鎖的事件導致的 「系統性異常」

這就是為什麼我們必須從「監控」思維,進化到「可觀測性」思維。

  從監控到可觀測性的思維演進

傳統監控的局限性

傳統監控,就像汽車的儀表板,它非常有用,但它的設計理念,是基於一個前提 - 我們預先知道哪些重要的指標需要被監測: 我們知道引擎溫度過高是危險的,所以我們裝了溫度計、我們知道車速過快會被罰款,所以我們裝了時速表。

這個模型在過去的 單體式(Monolithic) 系統中運作得或許很好,但在今天由數百個微服務、Serverless 函數和雲端託管服務組成的複雜分佈式系統中,傳統監控暴露了其深刻的局限性:

  1. 為「已知未知」而設計 (Designed for "Known Unknowns")
  • 監控系統只能回答我們預先設定好的問題。例如:「CPU 使用率是多少?」、「磁碟空間是否低於 10%?」、「QPS 有沒有超過 1000?」。這些是我們知道我們不知道答案,所以才去測量的問題。
  • 局限: 它完全無法應對**「未知未知」(Unknown Unknowns)**——那些我們根本沒預料到會發生的、從未見過的失敗模式。
  1. 無法診斷系統性的「湧現」行為 (Cannot Diagnose Emergent Behaviors)
  • 在分佈式系統中,故障往往不是單點的,而是**湧現(Emergent)**的。例如,一個身份驗證服務的延遲增加了 50 毫秒,導致下游的購物車服務超時率增加,進而觸發了訂單服務的熔斷機制。
  • 局限: 一個單獨的 CPU 監控圖或錯誤率儀表板,無法呈現這種跨越多個服務的、複雜的因果鏈。我們只能看到各處都在冒煙,卻找不到火源。
  1. 數據孤島效應 (Data Silos)
  • 傳統的工具鏈中,伺服器的指標、應用程式的日誌、網路的流量數據,往往被存放在三個互相獨立、無法關聯的系統裡。
  • 局限: 我們無法輕易地回答一個關鍵問題:「這次錯誤率的飆升,是否和日誌中出現的某個特定錯誤,以及網路延遲的增加,發生在同一次用戶請求中?」數據之間缺乏關聯,使得根本原因分析變得極其困難。
  1. 缺乏業務與用戶上下文 (Lack of Business & User Context)
  • 監控指標通常是技術性的(CPU、內存、QPS)。
  • 局限: 「資料庫 CPU 100%」這個警報,本身沒有告訴我們任何業務影響。是影響了我們最重要的 VIP 客戶的支付流程,還是一個無關緊要的後台批次任務?沒有用戶層面的上下文,我們很難判斷問題的優先級。

傳統監控 vs 現代系統複雜性對比

維度 傳統監控方法 現代系統複雜性挑戰 可觀測性解決方案
問題預測 預設問題類型:針對已知故障模式設定告警 ✗ 微服務之間的複雜交互難以預測 透過高基數數據探索未知問題模式
閾值管理 閾值導向:當 CPU > 80% 時發送通知 ✗ 雲端基礎設施的動態性和短暫性 基於異常檢測和趨勢分析的智能告警
響應模式 反應式:問題發生後才知道 ✗ 新的故障模式持續出現 主動式:透過三大支柱即時洞察系統狀態
系統整合 孤島式:各系統獨立監控 ✗ 級聯故障的非線性特性 關聯性分析:追蹤跨服務的完整請求路徑

可觀測性的核心理念

如果說監控是「透過儀表板看已知的數據」,那麼可觀測性就是 「賦予我們提問未知問題的能力」

可觀測性源自 控制理論(Control Theory) ,其嚴謹的定義是: 一個系統的可觀測性,衡量的是我們在多大程度上,可以僅憑其外部輸出(Outputs),來推斷其內部狀態(Internal States) 。 在軟體系統中,可觀測性是針對未知問題進行偵錯的能力

監控 vs 可觀測性的關鍵差異

監控 (Monitoring) 可觀測性 (Observability)
預設已知問題 為未知問題做準備
「我的 API 延遲是多少?」 「為什麼這個使用者的請求這麼慢?」
儀表板和告警 即時查詢和探索
聚合數據 高解析度原始數據
被動偵測 主動調查

一個高度可觀測的系統,就像一個誠實而健談的病人,他不僅能告訴我們他發燒了 (指標),還能鉅細靡遺地描述他過去一週的飲食作息 (日誌) ,並能配合醫生做各種檢查來追蹤病灶 (追蹤)

其核心理念包括:

  1. 擁抱「未知未知」 : 我們承認無法預測所有故障,因此我們不再專注於預先設定儀表板,而是專注於收集豐富、高基數、可供事後探索的遙測數據(Telemetry Data)。目標不是看圖,而是偵錯。
  2. 數據的豐富度與關聯性是關鍵 : 可觀測性的魔法,來自於將不同來源的數據(日誌、指標、追蹤)關聯起來的能力。理想狀態下,我們應該能夠從一個異常的指標,無縫下鑽到導致該異常的追蹤,再從這個追蹤,精準定位到觸發問題的那幾行日誌。
  3. 開發者是系統的第一公民: 程式碼的作者,最了解系統的內部狀態。就像我們在<開發者體驗(DX)優化:內部工具與排錯設計>所強調的 系統性地消除所有「摩擦力 (Friction)」與「認知負擔 (Cognitive Load)」,讓開發者能將最多的時間與心力,投入在解決真實的商業問題上 。 因此,可觀測性強調開發者應該為自己程式碼的可觀測性負責,在編寫業務邏輯的同時,就應該思考:「當這段程式碼出錯時,我需要什麼樣的數據才能快速定位問題?」這是一種「我們構建,我們負責(You build it, you run it)」的文化延伸。

可觀測性的三大支柱

為了實現上述理念,業界公認需要三種類型(或稱「三大支柱」)的遙測數據來共同支撐,它們各自扮演不同的角色,互為補充。

支柱 核心作用 數據特性 回答的問題 犯罪現場調查比喻
指標 (Metrics) 系統的體檢報告 數字化、可聚合、低基數、適合長期儲存和告警 是什麼? (What?)「系統的哪個部分出問題了?」 法醫的初步報告:「死者體溫異常,失血過多。」
日誌 (Logs) 系統的自傳/記憶 帶時間戳的事件記錄、非結構化、高基數、包含豐富的上下文 為什麼? (Why?)「系統為什麼會出現這個問題?」 證人供詞與監控錄影:詳細記錄了案發前後的每一句對話、每一個動作。
追蹤 (Traces) 請求的旅行地圖 記錄單次請求的完整路徑、服務間的因果關係和耗時 在哪裡? (Where?)「問題發生在調用鏈的哪個環節?」 偵探繪製的受害者行動軌跡圖:清晰呈現了受害者當晚去過的所有地方、見過的所有人。

數學表示

一個系統的可觀測性程度可以表示為其三大支柱的函數:

Observability = f(Logs, Metrics, Traces) × Context

日誌 (Logs): 記錄了 「發生了什麼離散事件」 。它是最詳細的,是最終的事實根據。

指標 (Metrics): 記錄了 「在一段時間內發生了多少事」 。它是聚合的,是宏觀的健康信號。

追蹤 (Traces): 記錄了 「一次請求的完整旅程」 。它是關聯的,是診斷分佈式系統瓶頸的利器。

其中 Context 包含:

  • 高基數 (High Cardinality) 資料:能夠精確定位特定使用者、交易或服務
  • 即時性 (Real-time) 資料:接近零延遲的數據收集和查詢
  • 關聯性 (Correlation) 資料:能夠跨越不同信號類型建立關聯

只有將這三大支柱結合起來,我們才能獲得真正意義上的可觀測性,從而在複雜系統的迷霧中,擁有清晰的視野和提出正確問題的能力。

第一支柱:日誌 (Logs) - 系統的記憶

日誌,是記錄了系統中發生過的、每一個離散事件的、帶有時間戳的文本記錄,它是系統最詳細、最忠實的記憶。

如果說指標( Metrics )是系統的「心跳」,追蹤( Traces )是系統的「神經脈絡」,那麼日誌,就是系統忠實不二、鉅細靡遺的 「長期記憶」 。在系統發生故障的「案發現場」,日誌就是唯一的目擊證人就像是飛行記錄儀的 「黑盒子」,飛機失事後,只有它能還原墜毀前駕駛艙內發生的每一件事、每一句對話。以下是它的特性:

  • 高基數(High Cardinality): 包含極其豐富的細節,例如使用者 ID、訂單號、錯誤訊息、IP 地址等。
  • 提供「為什麼」的上下文: 當問題發生時,日誌是唯一能告訴我們「根本原因」的數據源。
  • 昂貴: 儲存和索引海量的日誌數據,成本高昂。
  • 結構化日誌 (Structured Logging): 絕對不要打印純粹的字串日誌,所有的日誌都應該是 JSON 格式,這讓日誌變得機器可讀,極大地提升了查詢和分析的效率。
  • 日誌集中化 (Centralized Logging): 將所有服務的日誌,都發送到一個統一的日誌管理平台(例如:Amazon OpenSearch Service, Splunk, Datadog),而不是讓它們散落在成百上千個服務實例中。
// 非結構化日誌 - 難以查詢和分析
console.log(
  `User john.doe@example.com logged in at 2025-01-15 10:30:45 from IP 192.168.1.100`
);

// 結構化日誌 - 可搜尋、可查詢
logger.info({
  event: "user_login",
  user_id: "user_12345",
  email: "john.doe@example.com",
  ip_address: "192.168.1.100",
  timestamp: "2025-01-15T10:30:45.123Z",
  session_id: "sess_abcd1234",
  user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
});

日誌的核心價值

日誌回答的是 「發生了什麼?」 這個問題。它們是系統產生的不可變紀錄,記錄了離散的、帶有時間戳的事件。

就像我們在 <資料庫設計哲學:需求解析、技術選型與 Schema 設計策略> 中所說的 所有的資料背後都代表著某一個「行為」執行後,所造成的影響,日誌的重要性正是
透過在系統平穩運行時默默地消耗著儲存成本,記錄看似「無用」的 紀錄 。像是我們長期追蹤健康報告一樣,只有長期累積下來的 正常行為影響紀錄常態性指標大數據 做為資料池,才可以在最緊急、最混亂的故障排查時刻,如黃金般閃耀 指出問題偵結點 。我們可以將其核心價值,歸納為以下四點:

  1. 事實的最終記錄 (The Ultimate Record of Fact)
  • 核心概念: 日誌提供了關於「系統在特定時間點,究竟發生了什麼」的、最原始的、不可辯駁的證據。它是事實的真相(Ground Truth)。一個指標告訴我們「錯誤率上升了」,但只有日誌能告訴我們,那個錯誤的具體內容是 NullPointerException 還是 Database Connection Timeout。
  • 抽象比喻: 正如我們之前提到的 「黑盒子飛行記錄儀」 。在萬米高空的飛行過程中,它看似只是個沉沒成本。但在飛機失事的調查中,它記錄的每一條參數、每一句對話,都成為了還原真相、避免未來悲劇的無價之寶。
  1. 提供無可取代的上下文 (Providing Irreplaceable Context)
  • 核心概念: 日誌擁有三大支柱中最高的 「基數」(Cardinality) 。這意味著它可以包含無限豐富、多樣化的細節。指標和追蹤為了性能和成本,必須捨棄大量細節,但日誌可以全部保留。
  • 實踐價值: 我們的日誌可以包含導致錯誤的具體 user_id、有問題的 order_id、完整的錯誤堆疊追蹤(Stack Trace)、請求的 Header、甚至是當時的業務邏輯變數值。這些細節,對於重現(reproduce)和修復一個複雜的 Bug,是至關重要的。
  1. 行為與安全審計的基石 (The Foundation of Behavior & Security Auditing)
  • 核心概念: 日誌不僅僅用於偵錯。它更是安全與合規性的核心。我們需要回答「誰在什麼時候,從哪個 IP 地址,存取了這筆敏感資料?」這樣的問題,答案只能在日誌中找到。
  • 實踐價值: AWS CloudTrail 本身就是一種極其重要的日誌。在零信任架構中,所有對權限、網路規則的變更,都必須被日誌記錄下來,以便進行審計和追蹤。
  1. 洞察用戶行為的原始數據 (Raw Data for User Behavior Insights)
  • 核心概念: 經過適當的清洗和分析,應用程式日誌可以轉化為寶貴的商業洞察。
  • 實踐價值: 我們可以透過分析日誌,來了解哪個功能最受用戶歡迎、用戶在註冊流程的哪一步最容易放棄、A/B 測試中哪個版本的點擊率更高等等。

總而言之,日誌是可觀測性的基礎。沒有日誌,指標和追蹤就像是失去了記憶的偵探,它們能看到眼前的現象,卻無法還原故事的全貌。

AWS CloudWatch Logs 實作

Amazon CloudWatch Logs 是 AWS 生態系中,用於日誌集中化管理的核心服務。作為架構師,我們需要掌握的不僅是如何「使用」它,更是如何圍繞它,設計一套高效、可擴展且成本可控的日誌管理策略。

核心組件:

  1. 日誌群組 (Log Group): 一個日誌的容器,如同一個檔案櫃。通常,一個應用程式、一個服務或一個 Lambda 函數,會對應一個 Log Group。例如:/aws/lambda/checkout-service-prod。
  2. 日誌串流 (Log Stream): 日誌群組內的具體日誌來源,如同檔案櫃裡的一個個文件夾。例如,對於 EC2,一個 Log Stream 可能對應一個實例;對於 Lambda,則對應一個函數的容器實例。
  3. 日誌事件 (Log Event): 一條具體的日誌記錄,帶有時間戳和內容。
  4. 指標篩選器 (Metric Filter): 一種強大的機制,可以根據我們設定的模式(例如:日誌中出現 "ERROR" 字樣),從日誌中自動提取數據並轉化為 CloudWatch 指標,進而觸發告警。
  5. CloudWatch Logs Insights: 一個功能強大的互動式查詢引擎,讓我們能夠用類似 SQL 的語法,對海量的日誌進行複雜的查詢和分析。

一套專業的 CloudWatch Logs 實作流程,應包含以下四個步驟:

Step 1: 結構化日誌的產生與傳送 (Structured Generation & Shipping)

這是最重要的一步,垃圾進,垃圾出,如果我們的應用程式從源頭產生的就是混亂的純文字日誌,後續的一切都將事倍功半。

  • 最佳實踐: 在應用程式中,使用函式庫將日誌格式化為 JSON。
  • 範例 (Python):
import logging
import json
from pythonjsonlogger import jsonlogger

logger = logging.getLogger()
logHandler = logging.StreamHandler()
# 使用 jsonlogger 來自動產生 JSON 格式的日誌
formatter = jsonlogger.JsonFormatter('%(asctime)s %(name)s %(levelname)s %(message)s')
logHandler.setFormatter(formatter)
logger.addHandler(logHandler)
logger.setLevel(logging.INFO)

# 業務邏輯中的日誌記錄
try:
    # ... some logic ...
    logger.info("Payment processed successfully", extra={
        'trace_id': 't-123xyz',
        'order_id': 'o-abcde',
        'user_id': 'u-45678',
        'payment_gateway': 'Stripe'
    })
except Exception as e:
    logger.error("Payment processing failed", extra={
        'trace_id': 't-123xyz',
        'order_id': 'o-abcde',
        'error_message': str(e)
    })
  • 傳送: 對於 AWS 的主流服務(Lambda, ECS, EKS),日誌可以被原生整合,自動傳送到 CloudWatch Logs。對於 EC2 或本地伺服器,則需要安裝並設定 CloudWatch Agent

Step 2: 有效的儲存與管理 (Effective Storage & Management)

  • 最佳實踐:
    1. 制定清晰的 Log Group 命名規範: 例如 /{environment}/{application_name}/{component} ,便於查找和權限管理。
    2. 設定日誌保留策略 ( Retention Policy ): 這是成本控制的關鍵。 CloudWatch Logs 預設是永久保留,會產生高昂的費用。我們必須根據業務和合規需求,設定一個合理的保留期限(例如: 開發環境 7 天,生產環境 90 天,安全審計日誌 1 年 )。

Step 3: 深入的查詢與分析 (In-depth Query & Analysis)

當故障發生時,我們需要快速從億萬條日誌中找到線索。

  • 最佳實踐: 使用 CloudWatch Logs Insights
  • 範例場景: 假設我們想找出過去一小時內,所有支付失敗的日誌,並統計每個 user_id 的失敗次數。
  • 查詢語句:
-- 假設我們的日誌是結構化的 JSON
fields @timestamp, @message, user_id, order_id
| filter level = "ERROR" and message = "Payment processing failed"
| stats count(*) as failure_count by user_id
| sort failure_count desc
| limit 20

Step 4: 智慧的告警與整合 (Intelligent Alerting & Integration)

這是將被動的日誌,轉化為主動的可觀測性信號的關鍵。

  • 最佳實踐: 使用指標篩選器 (Metric Filters) 將日誌事件轉化為可告警的指標。
  • 範例場景: 我們希望在應用程式出現任何「嚴重錯誤」(FATAL)時,立即收到通知。
    1. 建立指標篩選器:
      • 篩選模式 (Filter Pattern): { $.level = "FATAL" } (這就是為什麼結構化日誌如此重要)
      • 指標名稱 (Metric Name): FatalErrorCount
      • 指標值 (Metric Value): 1 (每匹配一條日誌,指標值加 1)
    2. 建立 CloudWatch 告警:
      • 監控指標: FatalErrorCount
      • 告警條件: 當 FatalErrorCount 在 1 分鐘內的總和 (Sum) 大於或等於 1 時。
      • 告警動作: 發送通知到一個 SNS 主題,該主題可以觸發 PagerDuty、Slack 通知或自動化的 Lambda 修復腳本。

第二支柱:指標 (Metrics) - 系統的健康檢查

指標回答的是 「系統表現如何?」 這個問題。它們是可匯總的數值數據,通常以時間序列的形式呈現,在一段時間內,對系統某個維度進行測量和聚合後的數值數據。它是系統宏觀健康狀態的「心電圖」。

如果說日誌是為了事後的深度偵錯,那麼指標就是 為了即時的狀態感知與告警。它是我們掛在作戰指揮室牆上的巨大儀表板,讓我們在系統出現偏差的第一時間,就迅速察覺並採取行動。我們現在是醫生,指標 就是我們的病人的生命體徵監護儀,它顯示我們的心率、血壓、血氧飽和度,當心率異常時,它會發出警報,但它不會告訴我們心率異常的原因。以下是它的特性:

  • 低基數(Low Cardinality): 只包含數字、標籤等有限的訊息,不包含具體事件的細節。
  • 提供「是什麼」的信號: 指標能快速告訴我們「系統出問題了」,例如「延遲升高」、「錯誤率飆升」。
  • 廉價: 儲存和查詢指標數據,成本相對低廉,非常適合長期趨勢分析和告警。

根據 Google SRE 提出的經典模型,我們需要關注 4 個關鍵指標信號,又稱 黃金四信號 (The Four Golden Signals)

  1. 延遲 (Latency): 處理請求所需的時間。
  2. 流量 (Traffic): 系統收到的請求數量。
  3. 錯誤 (Errors): 失敗請求的數量或比例。
  4. 飽和度 (Saturation): 系統資源(CPU、內存、磁盤)的負載程度。

同時,為我們的指標打上豐富的標籤,例如 service:checkout-service , region:us-west-2 , api_version:v2 。這讓我們能夠對數據進行任意維度的切分和下鑽。

指標的核心價值

指標是可觀測性的「哨兵」和「戰略地圖」。它負責在問題發生的萌芽階段就拉響警報,並為我們提供宏觀的、長週期的系統洞察。

我們可以將其核心價值歸納為以下四點:

  1. 系統健康狀況的「心跳」 (The "Heartbeat" of System Health)
    • 核心概念: 指標是定量的、數字化的,非常適合用來定義系統的「正常」與「異常」。透過設定閾值,我們可以輕鬆地建立起自動化監控與告警系統。
    • 抽象比喻: 正如我們之前提到的**「生命體徵監護儀」**。當病人的心率(指標)超出正常範圍(閾值)時,機器會立刻發出警報,通知護士前來處理。它不需要理解病人為何心率異常,它的任務就是發出信號。
  2. 長期趨勢分析與容量規劃 (Long-Term Trend Analysis & Capacity Planning)
    • 核心概念: 由於指標數據緊湊且儲存成本低,它非常適合進行長週期的儲存和分析(通常會儲存數年)。這使得我們能夠分析系統的季節性變化、使用者增長趨勢,並據此進行科學的容量規劃。
    • 實踐價值: 我們可以透過分析過去兩年網站流量的指標,預測今年黑色星期五的流量高峰會達到多少 QPS,從而提前進行伺服器擴容,避免系統崩潰。這是日誌難以高效完成的任務。
  3. 服務等級目標 (SLO) 的量化基礎 (The Quantitative Basis for SLOs)
    • 核心概念: 現代站點可靠性工程(SRE)的核心,是建立並遵守服務等級目標(SLO),例如「99.9% 的首頁請求,必須在 200ms 內回應」。
    • 實踐價值: 只有指標,才能為 SLO 提供可衡量的數據。我們可以創建一個指標來追蹤請求延遲的百分位數(p99, p99.9),並基於這個指標來計算我們的「錯誤預算(Error Budget)」還剩多少,從而在「追求創新速度」與「保證系統穩定性」之間,做出數據驅動的決策。
  4. 數據驅動的因果關聯 (Data-Driven Correlation)
    • 核心概念: 當多個指標被繪製在同一個時間軸上時,我們可以非常直觀地發現它們之間的關聯性。
    • 實踐價值: 在儀表板上,我們可能會發現:「每次程式碼部署(一個指標事件)之後,資料庫的 CPU 使用率(另一個指標)都會出現一個尖峰,同時使用者支付成功率(第三個指標)會下跌 5%。」這種視覺上的關聯,能極快地為我們指出問題的潛在方向。

AWS CloudWatch Metrics 實作

Amazon CloudWatch Metrics 是 AWS 生態系中指標的中央儲存庫。它不僅收集來自 AWS 服務的指標,也允許我們發送自訂的業務指標。要精通它,關鍵在於理解其數據模型和如何利用它來創建有意義的告警。

核心組件:

  1. 命名空間 (Namespace): 指標的容器,用於將不同來源的指標分組。所有 AWS 服務的指標都有一個預設的命名空間,例如 AWS/EC2, AWS/Lambda。自訂指標則需要我們指定一個自己的命名空間,例如 WebApp/Production。
  2. 指標名稱 (Metric Name): 在命名空間下,具體的指標名稱。例如 CPUUtilization, Latency, OrderCount。
  3. 維度 (Dimensions): 一組鍵值對,用於唯一標識一個指標。這是 CloudWatch Metrics 最強大也最關鍵的概念,兩個指標如果命名空間和指標名稱相同,但維度不同,它們就是兩個獨立的指標。
    • 範例:
      • {Namespace: AWS/EC2, MetricName: CPUUtilization, Dimensions: {InstanceId: i-12345}}
      • {Namespace: AWS/EC2, MetricName: CPUUtilization, Dimensions: {InstanceId: i-67890}}
      • 這是兩個獨立的指標,分別追蹤兩台不同 EC2 實例的 CPU。
  4. 時間戳 (Timestamp): 數據點發生的時間。
  5. 值 (Value): 指標的數值。

一套專業的 CloudWatch Metrics 實施流程,應涵蓋以下四個步驟:

Step 1: 關鍵指標的定義與收集 (Defining & Collecting Key Metrics)

  • 最佳實踐:
    1. 充分利用 AWS 原生指標: 幾乎所有的 AWS 服務都會自動地、免費地(標準解析度)向 CloudWatch 發送關鍵指標。這是我們的第一數據源。例如 EC2 的 CPU、網路 I/O;RDS 的資料庫連接數;ALB 的請求計數和 HTTP 錯誤碼。
    2. 發送自訂業務/應用指標: 對於 AWS 原生指標無法覆蓋的場景,我們必須在應用程式中發送自訂指標。
      • 什麼是值得發送的指標? 任何對我們業務重要的數字。例如:UserSignUpCount, PaymentSuccessRate, ShoppingCartSize。
  • 範例 (Python with Boto3):
import boto3

cloudwatch = boto3.client('cloudwatch')

def publish_order_metric(total_amount, currency, payment_method):
    # 發送自訂指標到 CloudWatch
    cloudwatch.put_metric_data(
        Namespace='ECommerce/Orders',
        MetricData=[
            {
                'MetricName': 'OrderTotalAmount',
                'Dimensions': [
                    {'Name': 'Currency', 'Value': currency},
                    {'Name': 'PaymentMethod', 'Value': payment_method}
                ],
                'Value': total_amount,
                'Unit': 'None' # 或 'Count', 'Seconds', 'Bytes' 等
            },
        ]
    )

# 在業務邏輯中調用
publish_order_metric(99.99, 'USD', 'CreditCard')
# 這個自訂指標,讓我們能夠從「幣種」和「支付方式」這兩個維度,去分析我們的訂單總額。

Step 2: 創建有意義的儀表板 (Creating Meaningful Dashboards)

  • 最佳實踐:
    1. 面向受眾設計: 為不同的團隊(SRE、開發、業務)創建不同的儀表板。SRE 關心系統飽和度,而業務團隊關心訂單數量。
    2. 黃金四信號優先: 確保每個核心服務的儀表板,都清晰地展示了延遲、流量、錯誤、飽和度這四個黃金信號。
    3. 關聯性佈局: 將可能有關聯的指標放在一起。例如,將 ALB 的請求數、Target Group 的健康主機數、以及 EC2 的 CPU 使用率放在同一個圖表中。

Step 3: 設定精準且可行動的告警 (Setting Accurate & Actionable Alarms)

一個壞的告警系統比沒有告警系統只會 更糟糕 ,因為它會製造「告警疲勞」。

  • 最佳實踐:
    1. 告警於症狀,而非原因: 優先為那些直接影響使用者的症狀告警(例如:P99 延遲超過 500ms、5xx 錯誤率超過 1%),而不是為底層的原因告警(例如:某個節點的 CPU 達到 80%)。一個節點的 CPU 高,不一定代表使用者體驗受損。
    2. 使用統計函數: 不要對原始值告警,而要對統計值告警。例如,告警於「過去 5 分鐘的 CPU 平均值」而不是「CPU 瞬時值」。這可以有效避免毛刺(glitch)導致的誤報。
    3. 動態閾值(異常檢測): 對於有明顯週期性規律(例如:白天流量高,夜晚流量低)的指標,使用 CloudWatch 的**異常檢測(Anomaly Detection)**模型來設定告警,而不是固定的靜態閾值。
  • 範例 (Terraform):
resource "aws_cloudwatch_metric_alarm" "high_latency" {
  alarm_name          = "p99-latency-too-high-prod"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "3"
  metric_name         = "TargetResponseTime"
  namespace           = "AWS/ApplicationELB"
  period              = "60"
  statistic           = "p99" # 使用百分位數統計
  threshold           = "0.5" # 閾值為 500ms
  alarm_description   = "P99 延遲在連續 3 分鐘內超過 500ms。"
  alarm_actions       = [aws_sns_topic.alarms_topic.arn]
  ok_actions          = [aws_sns_topic.alarms_topic.arn]

  dimensions = {
    LoadBalancer = "arn:aws:elasticloadbalancing:..."
    TargetGroup  = "arn:aws:elasticloadbalancing:..."
  }
}

Step 4: 與其他支柱的整合 (Integration with Other Pillars)

  • 最佳實踐:
    1. 從日誌創建指標: 正如上節課提到的,使用 CloudWatch Logs 的指標篩選器(Metric Filters),可以從日誌中提取關鍵事件(例如:使用者認證失敗次數)並將其轉化為指標,從而實現告警。
    2. 在儀表板中嵌入日誌查詢: 在 CloudWatch Dashboard 中,我們可以在指標圖表的旁邊,直接嵌入一個 CloudWatch Logs Insights 的查詢組件。這樣,當工程師看到指標異常時,可以立刻在同一個頁面,執行相關查詢,查看對應的詳細日誌,極大地縮短了排錯的上下文切換時間。

第三支柱:追蹤 (Traces) - 請求的旅程

如果說指標告訴我們 「什麼」出錯了,日誌告訴我們「為什麼」出錯,那麼追蹤的核心任務,就是精準地告訴我們「在哪裡」 出錯。它將一個請求在複雜的分散式系統中所經歷的漫長旅程,繪製成一張清晰的、一目了然的地圖。

追蹤回答的是 「瓶頸或錯誤在哪裡?」 這個問題。在微服務架構中,單一使用者請求可能會經過十幾個不同的服務的獨立操作,分散式追蹤能夠重構整個請求的完整旅程,並串聯成一個有因果關係的旅程故事。就像是物流包裹的追蹤系統,我們可以清楚地看到我們的包裹,從賣家倉庫發出,經過了哪個分揀中心,登上了哪架飛機,最終到達我們手中,以及在每個節點停留了多久。

它是單次請求在分佈式系統中,從開始到結束所經過的 完整路徑圖 。以下是它的特性:

  1. 關聯上下文: 它是唯一能夠清晰展現服務之間依賴關係和調用延遲的工具。
  2. 提供「在哪裡」出錯的線索: 在複雜的微服務調用鏈中,追蹤能快速定位到是哪個服務、哪個環節成為了瓶頸。
  3. 實現需要代碼埋點(Instrumentation): 需要在應用程式中引入追蹤庫(例如 OpenTelemetry),並確保 trace_id 能夠在服務調用間正確傳遞。

分散式追蹤的核心價值

在單體應用時代,我們不太需要追蹤,因為一個請求的所有處理過程,都發生在同一個進程(Process)中,我們可以透過分析日誌和火焰圖(Flame Graph)來定位性能瓶頸。

但在微服務架構中,一個用戶請求(例如「提交訂單」)可能會依序或並行地觸發 5-10 個,甚至數十個後端服務的調用。在這種情況下,傳統的日誌和指標會遇到極大的挑戰:

  • 日誌的挑戰: 我們會在 10 個不同服務的日誌系統裡,看到 10 份看似獨立的日誌記錄。我們很難將它們串聯起來,還原出「單一請求」的完整故事。
  • 指標的挑戰: 我們可能看到 訂單服務 的延遲指標正常,支付服務 的也正常,但用戶感受到的總體延遲卻很高。我們無法知道是哪個環節,或是它們之間的網路調用消耗了時間。

分散式追蹤的核心價值,正是為了解決這個 「上下文丟失」和「因果關係斷裂」 的問題。

  1. 性能瓶頸的精準定位器 (Performance Bottleneck Locator)

    • 核心概念: 追蹤透過一個瀑布流(Waterfall)圖,將一個請求中每個環節(服務處理、資料庫查詢、外部 API 調用)的耗時,進行毫米級的視覺化呈現。哪一個環節的「橫條」最長,它就是瓶頸所在。
    • 抽象比喻: 正如我們之前提到的 「物流包裹追蹤系統」 。如果我們的包裹延誤了,指標只會告訴我們「延誤率上升」。日誌會給我們零散的狀態更新(「離開 A 倉」、「抵達 B 機場」)。只有追蹤系統,能給我們一條完整的時間線,讓我們一眼就看出:「包裹在 B 機場的海關卡了 8 個小時」。
  2. 系統行為的視覺化故事書 (A Visual Storybook of System Behavior)

    • 核心概念: 靜態的架構圖是死的,但追蹤數據是活的。它能將我們的系統架構,以真實數據驅動的方式,動態地、視覺化地呈現出來。這對於理解一個複雜系統的真實行為,以及幫助新進工程師快速上手,具有無可取代的價值。
  3. 錯誤傳播路徑的還原器 (Error Propagation Path Reconstructor)

    • 核心概念: 當鏈路末端的服務向用戶返回一個 500 錯誤時,追蹤可以清晰地展示出,這個錯誤最初是由鏈路中哪個上游服務產生的,以及它是如何一步步向後傳播,最終導致了用戶端的失敗。
  4. 服務依賴關係的動態地圖 (A Dynamic Map of Service Dependencies)

    • 核心概念: 當大量的追蹤數據被聚合起來時,可以自動生成一張即時的「服務地圖」(Service Map)。這張地圖清晰地展示了哪些服務之間存在調用關係,以及它們之間的健康狀況(流量、延遲、錯誤率)。這對於評估任何變更(例如:下線一個舊服務)的影響半徑至關重要。

最後, OpenTelemetry (OTel) 已經成為雲原生時代可觀測性的事實標準,它提供了一套統一的 API 和 SDK,讓我們無需被任何單一的供應商綁定。同時我們可以利用服務網格 (Service Mesh, 如 Istio, App Mesh) APM 工具提供的自動埋點能力,可以極大地減少手動編寫追蹤代碼的工作量。

追蹤的關鍵概念

Trace (追蹤): 代表一個完整的請求旅程
└── Span (區段): 代表請求中的一個操作或服務呼叫
    ├── Operation Name: 操作名稱 (e.g., "database_query")
    ├── Start Time: 開始時間
    ├── Duration: 持續時間
    ├── Tags: 標籤 (e.g., http.method=GET)
    ├── Logs: 相關的日誌事件
    └── Parent/Child: 父子關係

AWS X-Ray 分散式追蹤實作

Amazon X-Ray 是 AWS 提供的全託管分散式追蹤服務。它與眾多 AWS 服務(如 Lambda, API Gateway, EC2, ECS)深度整合,可以幫助我們輕鬆地建立追蹤能力。

核心組件:

  1. Trace (追蹤): 代表一次完整的端到端請求,由一個全域唯一的 Trace ID 標識。
  2. Segment (區段): 一個 Trace 由多個 Segment 組成。一個 Segment 代表由單一服務或運算資源所完成的工作。例如,API Gateway 處理請求是一個 Segment,下游的 Lambda 函數執行是一個 Segment,Lambda 函數調用 DynamoDB 也是一個 Segment。
  3. Subsegment (子區段): 用於在一個 Segment 內部,更細粒度地記錄耗時。例如,在我們的 Lambda 函數 Segment 內部,我們可以為「調用外部支付 API」、「寫入資料庫」等操作,分別創建 Subsegment。
  4. Annotations (註釋): 可被索引的鍵值對。我們可以用它來記錄我們希望用來搜索和篩選 Trace 的業務數據。例如 userId: 'u-12345', orderId: 'o-abcde'。
  5. Metadata (中繼資料): 不可被索引的鍵值對。用於記錄我們希望在查看 Trace 時,能看到的額外上下文資訊,但不能用來搜索。
  6. Service Map (服務地圖): X-Ray 根據收集到的 Trace 數據,自動繪製出的服務依賴與健康狀況拓撲圖。

一套專業的 X-Ray 實作流程,應包含以下四個步驟:

Step 1: 啟用追蹤 (Enabling Tracing)

這是最簡單的一步。AWS 的目標是讓追蹤的啟用盡可能地無痛。

  • 對於 Lambda, API Gateway: 我們只需在主控台或 IaC 配置中,勾選一個「啟用主動追蹤 (Enable Active Tracing)」的選項即可。
  • 對於 EC2, ECS, EKS: 我們需要在我們的主機或 Pod 中,以 Sidecar 或 DaemonSet 的形式,運行 X-Ray Daemon。我們的應用程式會將追蹤數據發送到本機的 Daemon,再由 Daemon 負責將數據批量、非同步地發送到 X-Ray 服務。

Step 2: 程式碼埋點 (Code Instrumentation)

為了讓 X-Ray 能夠理解我們應用程式的內部行為,並將 Trace 的上下文傳遞下去,我們需要使用 X-Ray SDK。

  • 最佳實踐: - 自動埋點中間件: 針對主流的 Web 框架(如 Flask, Express),X-Ray SDK 提供了中間件(Middleware)。它能自動為所有傳入的請求創建 Segment,並自動抓取 HTTP 方法、URL、狀態碼等資訊。 - 自動捕獲下游 AWS 調用: SDK 可以自動捕獲所有透過 AWS SDK 進行的下游調用(例如 boto3),並為其創建 Subsegment。 - 手動添加業務上下文: 這是讓追蹤數據從「有用」變為「無價」的關鍵。我們需要手動添加註釋(Annotations)。
  • 範例 (Python with Flask):
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.ext.flask.middleware import XRayMiddleware
from flask import Flask

app = Flask(__name__)

# 1. 設定 X-Ray Recorder
xray_recorder.configure(service='checkout-service')

# 2. 啟用自動埋點中間件
XRayMiddleware(app, xray_recorder)

@app.route('/checkout', methods=['POST'])
def checkout():
    # ... 業務邏輯 ...
    user_id = get_user_id_from_request()
    order_id = process_order()

    # 3. 手動添加可供搜索的業務註釋
    xray_recorder.put_annotation('user_id', user_id)
    xray_recorder.put_annotation('order_id', order_id)

    # 4. 手動創建子區段來測量特定代碼塊
    with xray_recorder.in_subsegment('call_payment_gateway') as subsegment:
        # ... 調用第三方支付 API 的代碼 ...
        subsegment.put_metadata('gateway_response', response)

    return "Checkout successful", 200

Step 3: 分析與洞察 (Analysis & Insight)

當問題發生時(例如:用戶投訴訂單 o-abcde 處理緩慢),我們可以:

  1. 前往 X-Ray 主控台。
  2. 使用篩選表達式,基於註釋進行搜索:annotation.orderId = "o-abcde"。
  3. 找到對應的 Trace。點開後,查看服務地圖和耗時瀑布流。
  4. 定位瓶頸: 我們可能會立刻發現,call_payment_gateway 這個 Subsegment 的耗時長達 5 秒,這就是延遲的根源。

Step 4: 與其他支柱的整合 (Integration with Other Pillars)

這是實現完整可觀測性的最後一哩路。

  • 最佳實踐: 將 Trace ID 自動注入到我們的結構化日誌中。

  • 如何實現: 許多日誌函式庫(例如 python-json-logger)可以與 X-Ray SDK 整合。SDK 會自動將當前的 Trace ID 注入到每一條日誌記錄中。

  • 完整的偵錯流程:

    1. CloudWatch Metrics 告警: 「結帳服務 P99 延遲過高」。
    2. AWS X-Ray 分析: 我們找到一筆緩慢的 Trace,發現是 payment-service 出了問題。我們從 Trace 中複製出 Trace ID: t-xyz789。
    3. CloudWatch Logs Insights 查詢: 我們用這個 Trace ID 進行查詢:
      fields @timestamp, @message, error_code
      | filter @logStream = "payment-service-logs" and trace_id = "t-xyz789"
      | sort @timestamp desc
      
    4. 找到根源: 查詢結果立刻返回了與這次請求完全相關的所有日誌,讓我們看到了導致延遲的具體錯誤訊息。

    至此,三大支柱完美地協同工作,讓我們能夠像經驗豐富的偵探一樣,從宏觀的異常信號,一步步深入,最終找到問題的根本原因。


上一篇
Day 22 | 現代安全基石「零信任架構」: 從邊界防禦到身份驗證的思維轉變 - IAM 最小權限與 VPC 微隔離
下一篇
# Day 23 | 可觀測性三大支柱(end):從監控到回答未知問題 - Logs, Metrics, Traces 的實踐
系列文
AWS架構師的自我修養:30天雲端系統思維實戰指南44
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言