可觀測性與 SLO ch01 監控不等於可觀測性:儀表板全綠,使用者正在客訴
下一章→
CH 01 先建立觀點

監控不等於可觀測性:儀表板全綠,使用者正在客訴

已知的未知 vs 未知的未知三本柱各自的成本模型黑箱與白箱四個黃金訊號/RED/USE平均值是最常見的謊言從使用者旅程往回推

你的服務有監控。CPU、記憶體、磁碟、QPS、錯誤率,Grafana 上二十幾張圖,全部是綠的。然後客服轉來一則訊息:「我從剛剛就一直付款失敗。」

這一幕幾乎每個做過線上系統的人都遇過。而它揭露的問題不是「監控做得不夠多」—— 是監控這件事本身,只能回答你事先想得到的問題。

  • 你監控了 CPU,因為你知道 CPU 會滿。
  • 你監控了錯誤率,因為你知道服務會噴 500。
  • 但你沒有監控「使用某張特定銀行卡、金額超過三萬、又剛好走到新版風控的那條路徑」—— 因為在昨天之前,沒有人想得到要問這個問題。

可觀測性要處理的正是這一類問題:那些你事前沒想到、事後又必須立刻回答的問題。

這一章不談工具,先把觀點建立起來:

  • 監控與可觀測性的分界:已知的未知 vs 未知的未知,以及為什麼這不只是文字遊戲。
  • 三本柱(metrics/logs/traces)各自回答什麼——重點是它們的成本模型完全不同,這決定了什麼東西該放哪裡(這條規則會一路管到 ch05)。
  • 黑箱與白箱:為什麼 SLO 一定要用黑箱視角來訂。
  • 三套指標框架:四個黃金訊號、RED、USE,什麼時候用哪一套。
  • 平均值是最常見的謊言:為什麼「平均回應時間 120 毫秒」可以完全掩蓋一場故障。
  • 一個真實場景:儀表板全綠、告警沒響,但 3% 的使用者兩小時內完全無法付款。

這一軌的工具主線是 Prometheus + Grafana + OpenTelemetry。如果你熟悉的是 CloudWatch(AWS ch11 講過它的考點),概念大多是相通的——這裡談的是方法論,不是某一家的操作介面。

另外,資料庫效能與維運 ch07 講過資料庫層的排查流程。這一軌是系統與服務層的版本,而且要處理一個 ch07 迴避掉的問題:當你連「該查哪個服務」都不知道的時候,從哪裡開始。

「監控」和「可觀測性」常被當成同義詞換著用,但它們回答的是兩種形狀完全不同的問題。分清楚這件事,才知道為什麼多加二十張儀表板救不了你。

監控:預先定義好的問題集合

監控的運作方式是:你先想到一個可能出錯的地方,然後為它做一個指標和一條告警。

「CPU 會不會滿?」        → 收 CPU 使用率 + 告警 > 80%
「服務會不會噴 500?」    → 收錯誤率 + 告警 > 1%
「磁碟會不會滿?」        → 收使用率 + 告警 > 90%

這些都是已知的未知(known unknowns):你知道這件事可能發生,只是不知道何時發生。監控在這一類問題上非常有效,而且應該做好。

可觀測性:能不能回答一個你昨天沒想到的問題

可觀測性的定義可以濃縮成一句操作性的檢驗:
「當一個你從沒預期過的問題發生時,你能不能在不重新部署程式的前提下把它查出來?」

這是未知的未知(unknown unknowns)。它的形狀長這樣:

「為什麼只有使用某張特定銀行卡、金額超過三萬、
  又剛好被導到新版風控的那批請求會失敗?」

沒有任何一張事先做好的儀表板會有這個維度組合。而如果你的回答是「我加個 log 再上線一次看看」,那就代表你的系統在這個問題上是不可觀測的——因為你必須改程式才能提問。

為什麼這個分界很實際

  • 監控的產出是「告警」:它告訴你「有事發生了」。做得好可以把 MTTD(發現時間)壓低。
  • 可觀測性的產出是「回答問題的能力」:它讓你在事發之後能一路追下去。它影響的是 MTTR(修復時間)。
  • 兩者都要,而且順序是先監控再可觀測性——連「有事」都不知道的時候,能問任意問題也沒用。

一個容易誤解的地方

可觀測性不是「收集更多資料」。無差別地把所有東西都收起來,只會得到一堆昂貴又查不動的資料(這一章最後會算這筆帳)。它的關鍵是「維度」與「可關聯性」:資料裡有沒有足夠的維度讓你切分,以及不同來源的資料能不能串成一條線索(這是這一軌的第三條主線,本章倒數第二節會展開)。

三本柱人人會背,但真正該記的不是「它們各是什麼」,而是它們的成本隨著什麼東西成長——因為這決定了什麼資訊該放哪一邊。

回答什麼成本隨什麼成長
Metrics「有沒有問題、多嚴重、趨勢如何」時序條數(維度組合的乘積),與請求量幾乎無關
Logs「當時到底發生了什麼細節」事件筆數 × 每筆大小,與請求量成正比
Traces「這一次請求的時間花在哪一段」span 數 × 取樣率,與請求量成正比

Metrics:便宜,但維度是乘法

一個指標記錄的是「數值隨時間的變化」。它已經被聚合過了:一億次請求和一千次請求,只要維度組合一樣,儲存成本幾乎相同。

但它的成本會在另一個方向爆炸:每多一個維度(label),時序數量是相乘而不是相加。這與 db ch03 的 JOIN 是同一種乘法思維——而它正是下一章那場事故的成因。

Logs:什麼都能記,但每一筆都要付錢

日誌保留了完整的上下文,是最靈活的一種。代價是它與流量成正比:QPS 翻倍,日誌帳單就翻倍。所以日誌的核心問題永遠是「記什麼、記多久、怎麼取樣」(ch04 專講)。

Traces:唯一能回答「時間花在哪」的東西

在單體服務裡,一句慢 SQL 用 db ch01 的方法就能查。但在五個服務串起來的鏈路裡,「這個請求花了 3 秒」這件事,metrics 只會告訴你每個服務各自的延遲分佈——它沒辦法告訴你這一次的 3 秒是在哪一跳被吃掉的。那是 trace 存在的唯一理由(ch05 專講)。

由成本模型推出的一條實用規則

高基數的資訊(user_id、order_id、request_id、SQL 語句)要放進 log 或 trace,絕對不要放進 metrics 的 label。
因為在 log/trace 裡它只是「一筆資料多一個欄位」,成本是加法;在 metrics 裡它是「多出幾百萬條時序」,成本是乘法。

這條規則會在下一章以一場事故的形式再出現一次。

同一套系統,可以從兩個位置觀察,而它們會給出不同的答案——當兩者矛盾時,永遠相信外面那個。

白箱:從系統內部看

  • 應用程式自己吐出的指標(QPS、錯誤率、GC 時間、連線池使用率)。
  • 優點:資訊豐富,能直接指向原因,是排查根因的主力。
  • 盲點:它只涵蓋「請求有進到你的程式」的那部分。如果請求根本沒進來(DNS 解析失敗、負載平衡器把流量丟到已死的節點、TLS 憑證過期、CDN 設定錯誤),你的白箱指標會顯示「一切正常,甚至流量還變少了,負載更輕鬆了」。

黑箱:從使用者的位置看

  • 從外部真的發一個請求進去,量它成不成功、花多久(合成監控/探針)。
  • 它是唯一能證明「使用者現在能不能用」的東西。
  • 缺點是頻率有限、成本較高,而且只覆蓋你寫的那幾條路徑。
本章那個失敗場景的根因就藏在這個縫隙裡:所有白箱指標都健康,因為出事的請求從來沒有到達應用程式。白箱看到的是「錯誤率 0%」——它說的是實話,只是那不是使用者經歷的事實。

推論:SLO 要用黑箱視角定義

這是這一軌後面(ch06)會反覆用到的一條原則:

❌ 「應用程式回傳 5xx 的比例 < 0.1%」
     —— 請求沒進來的時候,這個數字永遠漂亮

✅ 「從使用者的位置量,付款請求在 2 秒內成功完成的比例 > 99.9%」
     —— 不管卡在哪一層,只要使用者做不到,它就算失敗

這也是這一軌的第二條主線:症狀優先於原因。SLI 與告警都要從「使用者感受到什麼」出發,而不是從「機器上有哪些數字可以收」出發。機器指標是拿來找原因的,不是拿來定義「好不好」的。

兩者的分工

黑箱回答「壞了沒」,白箱回答「為什麼壞」。只有黑箱=知道出事但查不出原因;只有白箱=出了事還以為自己很健康。而如果只能先做一個,做黑箱——因為「不知道自己壞了」比「不知道為什麼壞」嚴重得多。

「我該收哪些指標?」這個問題有三套現成答案,它們不是競爭關係,而是分別對應不同的觀測對象。

四個黃金訊號(Google SRE)—— 面向服務

  • 延遲(Latency):請求花多久。成功與失敗的延遲一定要分開量——失敗通常很快(例如立刻回 400),混在一起會把平均值拉低,讓你看不出真正的問題。
  • 流量(Traffic):多少請求。它是其他指標的分母,也是判斷「是不是量變了」的依據。
  • 錯誤(Errors):失敗比例。注意「回了 200 但內容是錯的」也算錯誤——這種最難抓。
  • 飽和度(Saturation):離滿還有多遠。最容易被忽略也最有預測價值——它是唯一能讓你在爆炸之前知道的訊號。

RED —— 面向請求驅動的服務

Rate(每秒請求)、Errors(錯誤率)、Duration(延遲分佈)。等於黃金訊號拿掉飽和度,最適合微服務與 API:每個服務都用同一組三個指標,儀表板長得一模一樣,換服務不用重新學怎麼看。

USE —— 面向資源

Utilization(使用率)、Saturation(飽和/排隊)、Errors(錯誤)。適用於 CPU、記憶體、磁碟、網路卡、還有連線池與執行緒池。

USE 最有價值的一點是它把「使用率」與「飽和度」拆開。CPU 使用率 100% 不一定是問題(批次跑滿是正常的);但run queue 一直有人在排隊就是問題。同樣地,連線池「用滿」不可怕,「有人在等連線」才可怕——這正是 backend ch03 講的那件事,而 db ch07 用的 Threads_running 也是同一個概念的資料庫版本。

怎麼組合

對外的 API/每個微服務  → RED(+飽和度)
機器、連線池、執行緒池、佇列 → USE
面向使用者的關鍵旅程    → 黑箱探針 + 之後的 SLI(ch06)

先把 RED 舖滿所有服務,再對關鍵資源補 USE。這兩層蓋完,大部分「有沒有事」的問題就答得出來了——剩下的「為什麼」交給 trace 與 log。

如果要選一個「害最多人誤判」的東西,那就是平均值。而它幾乎是所有預設儀表板的預設選項。

一組數字

1000 次請求:
  970 次  →  50 毫秒
   30 次  →  30 秒(逾時)

平均回應時間 = (970×0.05 + 30×30) / 1000 ≈ 0.95 秒

儀表板上顯示「平均 950 毫秒」,看起來只是有點慢。但真實情況是每 33 個使用者就有一個完全用不了。

平均值會把「一小群人的災難」稀釋成「所有人的輕微不適」。而使用者不是平均值——每一個人經歷的都是自己那一次請求的延遲。

該看的是分位數

  • p50(中位數):典型使用者的體驗。
  • p95 / p99:倒楣的那群人的體驗。SLO 通常訂在這裡(ch06)。
  • p999:在高流量系統才有意義;QPS 100 的服務看 p999 是在看雜訊。
  • max:對抓「有沒有極端案例」有用,但它極易被單一異常值主導,不適合當告警依據。

比分位數更根本的一件事:分佈可能是多峰的

就算你看了 p99,仍然可能被騙。當系統有兩種以上的行為模式時,分位數會混在一起:

快取命中的請求:  5 毫秒(佔 90%)
快取沒中的請求:800 毫秒(佔 10%)

p50 = 5ms、p95 ≈ 800ms —— 中間那段其實不存在任何請求

看到 p50 和 p99 差距極大時,不要想「怎麼把 p99 壓下來」,要先想「是不是有兩群不同的請求被混在一起量了」。正確的做法是拆維度(依端點、依快取命中與否、依客戶類型分開量)——這正是第一節說的「維度」為什麼是可觀測性的關鍵。

還有一個要早點知道的坑

分位數不能平均,也不能相加。把十台機器的 p99 取平均,得到的數字沒有任何意義;「服務 A 的 p99 + 服務 B 的 p99」也不等於整條鏈路的 p99。要正確聚合分位數,必須從原始的 histogram bucket 重新計算——這是 ch03 的主題,也是很多團隊儀表板上的數字其實是錯的原因。

徵狀

週五晚上八點,客服累積了十幾則「付款一直失敗」的訊息。而工程團隊看到的是:

  • 所有服務的錯誤率 0.02%(正常水位)。
  • 延遲 p99 正常,甚至比平常低一點。
  • CPU、記憶體、資料庫、佇列全部正常。
  • 沒有任何一條告警觸發。
  • 總交易量比上週同時段少了 3%——但週五晚上本來就會波動,沒人覺得奇怪。

診斷

先做唯一能繞過所有內部指標的事:用使用者的身分,從外面走一次那條路徑。

1
工程師自己下單——成功。再用客訴名單裡的一個帳號測試環境重現——也成功。
2
回頭撈客訴清單的共同點:全部是 Android 版 App、且都在晚上七點後。
3
查 App 端的錯誤回報(不是後端日誌):全是 SSL handshake failed。
4
根因浮現:當天下午更換的憑證鏈少了一張中繼憑證。多數瀏覽器與 iOS 會自動補抓(AIA fetching),部分 Android 版本不會——於是那批使用者的 TLS 握手直接失敗。
關鍵在於:TLS 握手失敗發生在請求到達應用程式之前。所以後端從頭到尾沒有收到那 3% 的請求——錯誤率當然是 0%,因為失敗的請求根本不存在於後端的世界裡。而流量少 3% 這個唯一的訊號,被淹沒在正常的流量波動裡。

為什麼所有監控都沒響

  • 全部是白箱指標:沒有任何一個觀測點站在使用者的位置。
  • 告警都是「比率型」:錯誤數 / 總請求數。分子分母同時消失時,比率不會動。
  • 健康檢查只驗證 process 活著:/health 回 200,而它走的是內網、不經過那張憑證。
  • 流量下降沒有告警:大家只告警「太多」,很少告警「太少」。

修法

1
止血:補上中繼憑證,重新部署 TLS 設定。
2
補黑箱:從外部(不同地區、不同 TLS 客戶端設定)定期跑一次完整付款流程的合成監控——不是 ping /health,而是真的走一遍關鍵旅程。
3
對「流量異常下降」告警:與上週同時段比較,跌超過一定比例就通知。這條告警能抓到一整類「請求根本沒進來」的故障。
4
把客戶端錯誤收進來:App/前端的失敗(網路層、TLS、DNS)要有回報管道。後端日誌永遠看不到「連不上後端」這件事。
5
憑證到期與鏈完整性監控:這類故障可以在發生前就被擋下來。

教訓

「所有指標都正常」有兩種可能:真的沒事,或者你的觀測點全部站在故障的同一側。
而這兩者在儀表板上長得一模一樣。唯一能分辨的方法,是有一個觀測點站在使用者的位置。

很多團隊三樣都有了,卻還是查不動問題。原因通常不是資料不夠,而是三份資料之間沒有橋——每次排查都要在三個系統之間靠人腦與複製貼上接力。

正確的使用順序

1
Metrics 發現異常:p99 從 200ms 跳到 3s。它便宜、可以長期保留、適合告警——但它只能告訴你「有事」,永遠無法告訴你「是哪一次請求、為什麼」。
2
Trace 定位到哪一段:從那個時間點、那個端點的慢請求裡挑一條 trace,看到 3 秒裡有 2.8 秒花在「呼叫風控服務」。範圍從整個系統縮到一個服務、一段呼叫。
3
Log 確認細節:用那條 trace 的 trace_id 去撈風控服務的日誌,看到「重試三次、每次逾時 900ms」。到這裡根因就明確了。
這條路徑就是這一軌的第三條主線:metrics 發現 → trace 定位 → log 確認。三本柱不是三個要各自建置的系統,是同一次排查的三個階段——而它們之間的橋,比每一樣本身做得多好都重要。

橋要怎麼搭(三個具體的做法)

  • trace_id 貫穿全部:每一筆日誌都要帶上當前的 trace_id 與 span_id。這是最重要的一條,而在 Spring 專案裡它幾乎是免費的(ch05/ch08 會做)。
  • Exemplar:讓 metrics 的資料點掛上一個「代表性 trace 的 id」。這樣在 Grafana 上看到 p99 的那個突起,可以直接點進去看那一次的 trace——它就是第 1 步到第 2 步之間的那座橋(ch03 會設定它)。
  • 統一的標籤語彙:三邊的 service.name、env、version 要用同一套命名(OpenTelemetry 的 semantic conventions 就是在做這件事,ch05 講)。否則你會在 metrics 裡叫 payment-svc、在 log 裡叫 payment,然後無法自動關聯。

從哪裡開始建:從使用者旅程往回推

不要從「有哪些指標可以收」開始——那會得到一堆沒人看的儀表板。從使用者做的事情往回推:

① 列出關鍵旅程:登入、瀏覽商品、下單、付款、查訂單
② 每條旅程定義「成功」是什麼(含時間上限)  → 未來的 SLI(ch06)
③ 為每條旅程做黑箱探針                    → 「壞了沒」
④ 沿著旅程經過的每個服務舖 RED             → 「壞在哪一段」
⑤ 對關鍵資源補 USE                        → 「為什麼壞」
⑥ 把 trace_id 串起來                      → 讓上面四層可以互相導航

這個順序的好處是:每一步都對應一個真實的問題,而不是對應一個工具的功能清單。

這一章講了很多「應該要有」的東西。這一節講它們的帳單——因為可觀測性系統很容易變成整個架構裡最貴的一套系統(ch08 會把這筆帳完整算一次)。

五筆帳

  • 儲存與查詢:日誌與 trace 的量與流量成正比。高流量服務的可觀測性帳單超過運算本身的成本,是常見的事,不是異常。
  • 維度爆炸:metrics 的成本是乘法。一個看似無害的 label 可以讓時序數翻幾百倍——下一章整章都在講這件事。
  • 效能開銷:儀器化不是免費的。同步寫日誌會阻塞請求執行緒;trace 的 span 建立與匯出要 CPU 與記憶體;細到每個方法都插樁的 profiling 可能吃掉個位數百分比的效能。
  • 人的成本:儀表板會腐化。改了服務、改了指標名稱,卻沒人維護那張圖——而一張顯示錯誤資料的儀表板,比沒有儀表板更危險,因為它會讓人做出有信心的錯誤判斷。
  • 告警疲勞:這是最隱形的成本。當一半的告警不需要行動,人就會開始忽略全部的告警——包括真的那一次(ch07 專講)。

這一章的方法看不到的東西

  • 它不會告訴你「多少算好」。p99 是 300 毫秒——好還是不好?沒有 SLO 就沒有答案,只有感覺(ch06)。
  • 它不會告訴你什麼時候該被叫醒。有異常不等於要處理,這是告警設計的問題(ch07)。
  • 它看不到「沒發生的事」。排程沒有跑、訊息沒有被消費、對帳檔沒有產生——這些故障沒有任何一筆資料會出現,只能靠「預期它應該出現」的反向告警來抓。
最後這一點值得單獨記住:可觀測性天生偏向「觀測發生過的事」。而有一整類故障的本質是什麼都沒發生——本章那個案例(請求根本沒進來)就是其中之一。對「應該出現卻沒出現」設告警,是這類故障唯一的抓法。

把這一章收成三句

① 監控回答你事先想到的問題,可觀測性回答你昨天沒想到的問題——判準是「要不要重新部署才能提問」。
② 高基數的東西放 log 與 trace,不要放 metrics 的 label:一邊是加法,一邊是乘法。
③ 白箱說一切正常時,要有一個站在使用者位置的觀測點來反駁它。

下一章進入實作:Prometheus 的資料模型只有一句話,但那句話決定了它會不會在某天早上把你的記憶體吃光。

監控 vs 可觀測性
監控可觀測性
回答哪種問題已知的未知——你想得到會出錯的地方未知的未知——你昨天沒想到的問題
運作方式事先定義指標與告警門檻保留足夠維度,事後任意切分查詢
判準「這個情況會不會通知我」「要不要重新部署才能提問」
產出告警——影響 MTTD(多快發現)回答問題的能力——影響 MTTR(多快修好)
先做哪個先做這個:連有事都不知道時,能問任意問題也沒用有了告警之後才顯出價值
三本柱:成本模型決定什麼該放哪裡
MetricsLogsTraces
回答有沒有問題、多嚴重、趨勢當時的細節這一次請求時間花在哪一段
成本隨什麼長時序條數=維度組合的乘積事件筆數 × 每筆大小span 數 × 取樣率
與流量的關係幾乎無關(已聚合)成正比成正比
適合放高基數資訊嗎絕對不要(乘法)適合(加法)適合(加法)
適合告警嗎適合——便宜、可長期保留少數情況(特定錯誤字串)不適合,是排查工具
排查順序① 發現異常③ 確認細節② 定位到哪一段
三套指標框架:對應不同的觀測對象
框架內容用在什麼上重點
四個黃金訊號延遲、流量、錯誤、飽和度面向服務的綜合檢查飽和度最常被忽略,卻是唯一有預測性的
REDRate、Errors、Duration請求驅動的服務、微服務、API每個服務同一組指標,儀表板可複用
USEUtilization、Saturation、ErrorsCPU/記憶體/磁碟/連線池/執行緒池使用率滿不一定有事,有人排隊才是問題
黑箱探針從外部走完整旅程關鍵使用者旅程唯一能證明「使用者現在能用」的東西

練習題 點選選項查看解析

0 / 10
01 / 10
判斷一個系統「有沒有可觀測性」,最具操作性的檢驗是什麼?
A 有沒有同時部署 metrics、logs、traces 三套系統
B 當一個沒預期過的問題發生時,能不能在「不重新部署程式」的前提下把它查出來
C 儀表板的數量是否足夠
D 資料保留時間是否超過 30 天
解析
監控處理的是已知的未知(你想得到會出錯的地方),可觀測性處理的是未知的未知。如果回答問題的方式是「我加個 log 再上線一次看看」,那就代表系統在那個問題上是不可觀測的——因為你必須改程式才能提問。
02 / 10
為什麼高基數的資訊(user_id、order_id、SQL 語句)不能放進 metrics 的 label?
A 因為 Prometheus 不支援字串型別的 label
B 因為 metrics 的成本是維度組合的乘積(乘法),而在 log/trace 裡它只是多一個欄位(加法)
C 因為那些資訊屬於個資
D 因為 label 有長度限制
解析
這是三本柱成本模型推出的最實用的一條規則。metrics 已經被聚合過,與流量幾乎無關,但每多一個維度時序數量就相乘;log 與 trace 的成本與流量成正比,多一個欄位只是加法。放錯地方的代價會在下一章以事故的形式出現。
03 / 10
白箱監控最根本的盲點是什麼?
A 它的資料量太大
B 它只涵蓋「請求有進到程式」的那部分——請求根本沒進來時(DNS、TLS、LB 設定錯誤),它會顯示一切正常
C 它無法測量延遲
D 它只能在容器環境使用
解析
本章的失敗場景正是這個縫隙:TLS 握手失敗發生在請求到達應用程式之前,所以後端的錯誤率是真的 0%——失敗的請求根本不存在於後端的世界裡。這也是 SLO 必須用黑箱視角定義的原因。
04 / 10
如果只能先做黑箱與白箱其中一種,該先做哪個?為什麼?
A 白箱,因為它資訊豐富,能直接指出根因
B 黑箱,因為「不知道自己壞了」比「不知道為什麼壞」嚴重得多
C 兩者一樣重要,可以隨意選
D 都不用做,先建立日誌系統
解析
黑箱回答「壞了沒」,白箱回答「為什麼壞」。只有白箱的系統會在出事時仍然覺得自己健康——而那正是最危險的狀態。理想是兩者都有,但順序上黑箱優先。
05 / 10
USE 方法把「使用率」與「飽和度」拆開,這個區分為什麼重要?
A 因為兩者的單位不同
B 因為使用率 100% 不一定有問題(批次跑滿是正常的),但「有人在排隊等待」才是真的問題
C 因為飽和度比較容易測量
D 因為使用率只適用於 CPU
解析
連線池用滿不可怕,有人在等連線才可怕(backend ch03);資料庫的 Threads_running 也是同一個概念(db ch07)。飽和度同時也是四個黃金訊號裡唯一有預測性的——它讓你在爆炸之前就知道。
06 / 10
1000 次請求中,970 次是 50 毫秒、30 次是 30 秒逾時。平均值約 950 毫秒。這個數字的問題是什麼?
A 計算方式錯誤
B 平均值把「一小群人的災難」稀釋成「所有人的輕微不適」——實際上每 33 個使用者就有一個完全用不了
C 應該改用最大值
D 樣本數太少
解析
使用者不是平均值,每個人經歷的都是自己那一次請求的延遲。該看的是分位數:p50 是典型體驗,p95/p99 是倒楣那群人的體驗,SLO 通常訂在後者。
07 / 10
某服務的 p50 是 5 毫秒、p95 是 800 毫秒,差距極大。第一步該做什麼?
A 想辦法把 p95 壓下來
B 先懷疑是兩群不同行為的請求被混在一起量了(例如快取命中與否),把維度拆開分別量
C 調整 SLO 讓 p95 達標
D 增加機器數量
解析
分佈是多峰的時候,分位數會把不同群體混在一起,中間那段其實不存在任何請求。正確做法是拆維度(依端點、依快取命中、依客戶類型),這也是「維度」為什麼是可觀測性關鍵的具體例子。
08 / 10
為什麼「把十台機器的 p99 取平均」是錯的?
A 因為機器規格不同
B 因為分位數不能平均也不能相加,要正確聚合必須從原始的 histogram bucket 重新計算
C 因為應該取最大值
D 因為 p99 本來就不準確
解析
同理,「服務 A 的 p99 + 服務 B 的 p99」也不等於整條鏈路的 p99。這是很多團隊儀表板上的數字其實是錯的原因,正確做法在 ch03(histogram_quantile 與 bucket 設計)。
09 / 10
本章的失敗場景中(TLS 中繼憑證缺失導致 3% 使用者付款失敗),為什麼所有告警都沒響?
A 告警門檻設得太高
B 所有觀測點都是白箱、告警都是「比率型」(分子分母同時消失時比率不動)、健康檢查走內網不經過那張憑證、而且沒有人對「流量異常下降」告警
C 監控系統當時故障了
D 錯誤日誌被取樣掉了
解析
四個原因疊在一起。其中「對流量異常下降告警」這一條特別值得補——它能抓到一整類「請求根本沒進來」的故障。另外客戶端(App/前端)的網路層失敗要有回報管道,因為後端日誌永遠看不到「連不上後端」。
10 / 10
三本柱正確的使用順序與各自的角色是什麼?
A 先看日誌找錯誤訊息,再看 metrics 確認範圍,最後看 trace
B metrics 發現異常 → trace 定位到哪一段 → log 確認細節;而它們之間的橋(trace_id、exemplar、統一標籤)比每一樣本身做得多好都重要
C 三者獨立使用,各自查各自的
D 先看 trace,因為它資訊最完整
解析
很多團隊三樣都有卻查不動問題,原因是三份資料之間沒有橋,每次排查都要靠人腦在三個系統間接力。三本柱不是三個要各自建置的系統,是同一次排查的三個階段。

點擊卡片翻面查看答案,共 13 張。

QUESTION
監控與可觀測性的分界是什麼?
點擊翻面
ANSWER
監控回答「已知的未知」——你事先想得到會出錯的地方;可觀測性回答「未知的未知」——你昨天沒想到的問題。操作性判準:能不能在不重新部署程式的前提下提出新問題。
點擊翻回
QUESTION
監控與可觀測性各自影響哪個指標?誰先做?
點擊翻面
ANSWER
監控的產出是告警,影響 MTTD(多快發現);可觀測性的產出是回答問題的能力,影響 MTTR(多快修好)。順序是先監控再可觀測性——連「有事」都不知道時,能問任意問題也沒用。
點擊翻回
QUESTION
三本柱的成本各自隨什麼成長?
點擊翻面
ANSWER
Metrics:時序條數=維度組合的乘積,與流量幾乎無關(已聚合)。Logs:事件筆數 × 每筆大小,與流量成正比。Traces:span 數 × 取樣率,與流量成正比。
點擊翻回
QUESTION
從成本模型推出的那條實用規則是什麼?
點擊翻面
ANSWER
高基數資訊(user_id、order_id、request_id、SQL 語句)要放 log 或 trace,絕不放 metrics 的 label——在 log/trace 裡是多一個欄位(加法),在 metrics 裡是多幾百萬條時序(乘法)。
點擊翻回
QUESTION
為什麼在多服務鏈路裡 metrics 取代不了 trace?
點擊翻面
ANSWER
metrics 只能告訴你每個服務各自的延遲分佈,無法告訴你「這一次」的 3 秒是在哪一跳被吃掉的。回答「這一次請求時間花在哪一段」是 trace 存在的唯一理由。
點擊翻回
QUESTION
白箱監控的根本盲點是什麼?
點擊翻面
ANSWER
它只涵蓋「請求有進到程式」的部分。DNS 失敗、TLS 握手失敗、LB 把流量丟到死節點時,白箱會顯示錯誤率 0%、甚至流量變少負載更輕——它說的是實話,只是那不是使用者經歷的事實。
點擊翻回
QUESTION
為什麼 SLO 一定要用黑箱視角定義?
點擊翻面
ANSWER
「應用程式回傳 5xx 的比例 < 0.1%」在請求沒進來時永遠漂亮。要改成「從使用者的位置量,付款在 2 秒內成功的比例 > 99.9%」——不管卡在哪一層,使用者做不到就算失敗。這是「症狀優先於原因」這條主線。
點擊翻回
QUESTION
四個黃金訊號是什麼?哪一個最常被忽略?
點擊翻面
ANSWER
延遲、流量、錯誤、飽和度。飽和度最常被忽略,但它是唯一有預測性的訊號——讓你在爆炸之前就知道。另外延遲要把成功與失敗分開量,否則快速失敗會把平均拉低。
點擊翻回
QUESTION
RED 與 USE 各自用在什麼上?
點擊翻面
ANSWER
RED(Rate/Errors/Duration)用於請求驅動的服務與 API,每個服務同一組指標所以儀表板可複用;USE(Utilization/Saturation/Errors)用於資源——CPU、記憶體、磁碟、連線池、執行緒池。
點擊翻回
QUESTION
為什麼平均回應時間是危險的指標?
點擊翻面
ANSWER
它把「一小群人的災難」稀釋成「所有人的輕微不適」。970 次 50ms + 30 次 30 秒逾時,平均是 950ms 看起來只是有點慢,實際上每 33 個使用者就有一個完全用不了。
點擊翻回
QUESTION
p50 與 p99 差距極大時,第一步該做什麼?
點擊翻面
ANSWER
先懷疑分佈是多峰的——兩群不同行為的請求(例如快取命中與否)被混在一起量了,中間那段其實沒有任何請求。要拆維度分別量,而不是想辦法把 p99 壓下來。
點擊翻回
QUESTION
為什麼分位數不能平均、也不能相加?
點擊翻面
ANSWER
十台機器的 p99 取平均沒有任何意義;服務 A 的 p99 + 服務 B 的 p99 也不等於鏈路的 p99。要正確聚合必須從原始 histogram bucket 重新計算——這是很多儀表板數字其實是錯的原因。
點擊翻回
QUESTION
三本柱的使用路徑是什麼?三座橋是什麼?
點擊翻面
ANSWER
metrics 發現異常 → trace 定位到哪一段 → log 確認細節。橋:①每筆日誌帶 trace_id/span_id ②exemplar 讓 metrics 的資料點能直接跳到代表性 trace ③三邊使用統一的標籤語彙(service.name、env、version)。
點擊翻回