可觀測性與 SLO ch07 告警設計:半夜被叫醒,然後發現什麼都不用做
下一章→
CH 07 人的成本

告警設計:半夜被叫醒,然後發現什麼都不用做

唯一的判準是可行動性徵狀告警而非原因告警page 與 ticket 的分流for 與抖動分組抑制靜音值班負荷量化dead man's switch

前面六章都在處理資料。這一章處理的是人——而人是整套可觀測性系統裡最貴、最容易耗損、也最難補充的那個部件。

告警的失敗模式有兩種,而它們互為因果:

太多:一個月 400 條告警,其中 380 條會自己恢復。於是大家開始忽略它們。太少:真正的故障沒有人被通知,因為它混在那 380 條裡沒人看見。

**第二種是第一種造成的。**告警疲勞不是「大家不夠認真」,它是理性反應—— 當一個訊號的偽陽性率高到某個程度,忽略它就是最有效率的策略。所以告警設計的本質不是「怎麼不漏掉問題」,是「怎麼保住人對這個系統的信任」。

這一章要建立的判準只有一條,其餘全部從它推導:

  • 可行動性:這條告警響的時候,有人需要立刻做什麼嗎?沒有的話,它就不該是告警。
  • 徵狀 vs 原因:為什麼「CPU 80%」是壞告警,而 ch06 的 burn rate 是好告警。
  • page 與 ticket 的分流:不是所有問題都值得把人叫醒。
  • for 與抖動:一條沒有持續時間條件的告警規則,幾乎必定會誤報。
  • 分組、抑制、靜音:一次故障應該產生一則通知,不是四十則。
  • dead man’s switch:監控系統自己壞掉的時候,誰來告訴你?
  • 一個真實場景:真正的故障告警混在雜訊裡,40 分鐘沒有人看見。

這一章與 ch06 是連著的:SLO 提供了「什麼時候該在乎」的客觀依據,而 burn rate 告警把它變成一條可以直接掛上去的規則。沒有 SLO 的告警,門檻永遠是拍腦袋訂的。

告警設計有一堆技巧,但它們全部從同一個問題推導出來:

「這條告警響的時候,有一個人需要立刻做某件具體的事嗎?」
——如果答案是「不用,它自己會好」或「知道一下就好」,那它就不該是告警。

三個層級,把東西放對地方

層級判準送到哪
Page(叫人)使用者正在受影響,而且需要人介入才會好電話/推播,會吵醒人
Ticket(工單)需要處理,但可以等上班時間工單系統,隔天看
Dashboard(儀表板)排查時有用,但不需要主動通知圖表,需要時才看

大部分團隊的問題是把後兩類做成了第一類。「磁碟使用率 80%」——它會在三週後才滿,這是 ticket;「單一 pod 重啟了」——K8s 會自己處理,這是 dashboard。

可行動性的三個檢查

1
有具體的動作嗎?如果收到告警後唯一能做的是「觀察看看」,那它不可行動。
2
需要「現在」做嗎?能等到明天早上的,就不該是 page。
3
自動化能不能取代人?如果每次的處理動作都一樣(重啟、擴容、切換),那應該寫成自動化,而不是叫醒一個人來手動執行。——這是 SRE 說的 toil:可重複、可自動化、沒有長期價值的人工操作。

每一條 page 都要有 runbook

annotations:
  summary: "付款 SLO 快速燃燒(2 天內將耗盡預算)"
  description: "目前錯誤率 {{ $value | humanizePercentage }},正常應低於 0.1%"
  runbook_url: "https://wiki/runbooks/payment-slo-burn"
  dashboard_url: "https://grafana/d/payment-overview"
沒有 runbook 的 page 是在賭「被叫醒的那個人剛好知道怎麼辦」。而半夜三點的人,認知能力大約只有平常的一半。

runbook 至少要回答四件事:①這代表什麼 ②影響誰 ③先確認哪三件事 ④已知的處理方式與升級對象。寫不出 runbook 的告警,通常代表你自己也不確定它意味著什麼——那就更不該拿它去叫醒別人。

這是 Google SRE 最常被引用的一條原則,而它的理由非常實際。

兩種告警的差別

❌ 原因告警:CPU > 80%、記憶體 > 90%、單一 pod 重啟、佇列長度 > 1000
✅ 徵狀告警:付款成功率低於 SLO、SLO 錯誤預算正在快速燃燒、關鍵旅程的黑箱探針失敗

為什麼原因告警不好用

  • 它會誤報:CPU 80% 可能完全沒問題(批次任務正常跑滿)。而使用者沒有受影響時把人叫醒,就是純粹的損耗。
  • 它會漏報:使用者受影響的原因有無限多種,你不可能為每一種都設一條告警。而徵狀只有一個——「使用者用不了」。
  • 它的數量會爆炸:一次資料庫變慢會同時觸發 CPU、連線數、佇列、延遲、錯誤率——五條告警,一個問題。
核心邏輯:告警要回答「值不值得叫醒一個人」,而這只取決於使用者有沒有受影響——原因是被叫醒之後才要查的事情。
而 ch06 的 burn rate 告警正是徵狀告警的標準形式:它量的是「使用者的耐心正在以幾倍速度被消耗」,不管根因是什麼。

那原因指標就不用管了嗎

要管,但放對地方:

  • 放儀表板:被叫醒之後,它們是你查根因的材料(ch01 的白箱指標)。
  • 做成 ticket:「磁碟三週後會滿」「憑證 30 天後到期」這類有預測性的飽和度指標——它們的價值是讓你在變成徵狀之前就處理掉。

唯一該對原因 page 的情況

當這個原因「必然」會在你來不及反應的時間內造成使用者影響時。
例如:磁碟將在 30 分鐘內寫滿(滿了就是資料庫直接停止服務)、憑證明天到期(到期就是 ch01 那場全面失敗)。

判準是:「等它變成徵狀時,還來得及救嗎?」來不及的,才值得提前 page。

下面這條規則看起來很合理,但它幾乎必定會誤報:

- alert: HighErrorRate
  expr: rate(errors[5m]) > 0.01      # ← 沒有 for

只要有任何一個評估週期超標(可能只是一次部署造成的瞬間 5xx),它就會響,然後在下一個週期自己恢復。

for:問題要持續多久才算數

- alert: HighErrorRate
  expr: rate(errors[5m]) > 0.01
  for: 10m                           # 連續超標 10 分鐘才觸發
  • 期間規則處於 pending 狀態,不發通知;持續滿 for 才變成 firing。
  • 代價是延遲:for: 10m 意味著真的出事時,你也晚 10 分鐘才知道。
所以 for 的長度是「靈敏度 vs 雜訊」的直接取捨,而它應該由嚴重性決定:
災難級(burn rate 14.4×)  → for: 2m   (寧可偶爾誤報)
嚴重(burn rate 6×)       → for: 15m
一般(burn rate 3×)       → for: 1h   (做成 ticket)
這正好對應 ch06 那張多視窗表——burn rate 的設計已經內建了這個取捨,因為長視窗負責「確定嚴重」,短視窗負責「確定還在持續」。

三個相關的時間參數不要搞混

參數意思設錯的症狀
rate([5m]) 的範圍算速率時看多久的資料太短→空洞與抖動(ch03)
for條件要持續多久才觸發沒設→部署時的瞬間尖峰全都響
group_interval / repeat_interval多久重送一次通知太短→同一問題被反覆騷擾

另一種抖動:門檻邊緣來回震盪

指標剛好在門檻附近徘徊時,告警會反覆 firing / resolved。除了 for,還有兩個做法:

  • 用比例而不是絕對值:「錯誤率 > 1%」比「錯誤數 > 100」穩定得多——後者會隨流量自然波動。
  • 用 max_over_time 之類的平滑(ch03),讓短暫回落不會立刻解除告警。

就算每一條告警規則都設計良好,一次真實故障仍然可能產生幾十則通知——因為它同時影響了很多實例、很多服務。Alertmanager 這一層的工作就是把它們收斂成人類可以處理的形式。

① 分組(grouping):把同類的合成一則

route:
  group_by: ['alertname', 'service']   # 同一個服務的同一種告警合成一則
  group_wait: 30s          # 第一則到達後,等 30 秒收集同組的其他告警
  group_interval: 5m       # 同組有新成員時,最快 5 分鐘再通知一次
  repeat_interval: 4h      # 問題仍未解決時,多久提醒一次

group_wait 是最有價值的一個:30 台機器同時出問題時,它會等 30 秒把它們收成一則「30 個實例受影響」,而不是發 30 則通知。

② 抑制(inhibition):根因告警壓住衍生告警

inhibit_rules:
  - source_matchers: [ severity="critical", alertname="ClusterDown" ]
    target_matchers: [ severity="warning" ]
    equal: ['cluster']     # 同一個叢集裡的 warning 全部壓住
整個叢集掛掉時,你需要的是一則「叢集掛了」,而不是 200 則「某某服務無回應」。抑制規則讓上游的嚴重告警自動壓住下游的衍生告警——這是把「一次故障 = 一則通知」落實的關鍵機制。

③ 靜音(silence):處理中的問題不要再吵

已經在處理、或正在做計畫性維護時,手動靜音一段時間。但靜音有兩個要注意的地方:

  • 一定要設到期時間,而且不要太長。永久靜音等於刪除告警,而且沒有人記得。
  • 定期檢視現有的靜音:一條被靜音三個月的告警,通常代表它該被修掉或刪掉了。

④ dead man's switch:誰來監控監控系統

如果 Prometheus 掛了、Alertmanager 掛了、或通知管道壞了,你會收到什麼?——什麼都不會。而「什麼都沒有」與「一切正常」長得一模一樣。

做法是反過來:設定一條永遠會觸發的告警,送到一個外部系統;那個外部系統在「超過 5 分鐘沒收到它」時通知你。
- alert: Watchdog
  expr: vector(1)          # 永遠為真
  labels: { severity: none }
  annotations: { summary: "這條告警應該永遠在響" }
這是 ch01「看不到沒發生的事」與 ch03 absent() 的同一個思路,用在監控系統自己身上。它是整套告警體系裡最便宜、也最常被遺漏的一條。

徵狀

某次事故的檢討會上,時間軸長這樣:

02:14  支付服務開始大量失敗
02:14  告警觸發,送進值班頻道
02:54  客服接到第 6 通客訴,打電話給值班工程師    ← 40 分鐘後
02:58  開始處理
03:20  恢復
  • 告警在第一分鐘就響了——系統沒有漏報。
  • 但沒有人看見它。
  • 調紀錄發現:那 40 分鐘裡,同一個頻道收到了 73 則告警。

診斷

把過去一個月的告警拉出來統計(這件事本身就該定期做):

指標數字
一個月的告警總數412 則
其中自動恢復、無需處理389 則(94%)
導致實際處理動作的23 則
最吵的一條規則單一 pod 記憶體 > 85%(161 則)

根因(四個設計問題)

1
全部是原因告警:CPU、記憶體、pod 重啟、佇列長度——沒有任何一條是「使用者受影響了」。
2
沒有 for:瞬間尖峰立刻觸發,下一個週期就恢復。那 161 則記憶體告警全部是這樣來的(而 JVM 的記憶體本來就會在 GC 前接近上限,那是正常行為,回扣 backend ch04)。
3
沒有分級:所有告警都送同一個頻道、同一個嚴重性。於是「pod 記憶體 86%」與「支付全面失敗」看起來一模一樣。
4
沒有分組與抑制:一個問題產生幾十則各自獨立的訊息。
而真正的根因是第五個:94% 的偽陽性率,讓「忽略這個頻道」成為理性行為。
值班工程師不是不負責任——在那個訊噪比下,認真看每一則告警才是不可持續的。告警疲勞是設計問題,不是態度問題。

修法

1
先做減法:把 389 則無需處理的告警直接刪掉或降級成儀表板。這一步最重要也最違反直覺——大家會擔心「刪了以後漏掉怎麼辦」,但那些告警本來就沒有人在看。
2
建立徵狀告警:以 ch06 的 SLO burn rate 為主,付款、下單、登入三條旅程各一組多視窗規則。總共 6 條 page 級告警,取代原本的幾十條。
3
分級與分流:burn rate 14.4× 與 6× → page(電話);3× 與 1× → ticket;資源類指標 → 儀表板。
4
加 for、分組、抑制:一次故障收斂成一則通知。
5
補 dead man's switch:這次沒發生,但同樣的訊噪比下,監控系統自己掛掉也不會有人發現。
6
把告警品質變成例行檢視:每個月統計「告警數 / 可行動比例 / 每次值班的中斷次數」,並在事故檢討時固定問一句「有沒有告警是雜訊」。

結果

改造前:412 則/月,可行動 5.6%
改造後: 31 則/月,可行動 74%
而真正的收穫不是數字變小,是「告警響了 = 真的有事」這件事重新變成一個可以信任的假設。那個信任才是告警系統的實際產出。

告警的接收端是人,而人的處理能力是有明確上限的。把這件事量化出來,告警治理才有客觀依據。

三個該量的數字

  • 每次值班的中斷次數:Google SRE 的經驗值是一個 12 小時的班次最多處理 2 個事件。超過這個數字,處理品質會明顯下降——因為每個事件都需要調查、記錄、跟進。
  • 可行動比例:導致實際處理動作的告警 / 全部告警。低於 50% 就該做減法了。
  • 深夜中斷次數:半夜的告警成本遠高於白天——它影響的不只是那一小時,還有隔天一整天。
把「告警數量」當成一個要被管理的資源,跟錯誤預算是同一種思路(ch06)。如果值班負荷持續超標,那不是「大家再撐一下」的問題,而是要嘛修掉造成告警的根因,要嘛承認可靠性目標與投入不匹配。

on-call 的基本盤(與這一章直接相關的部分)

  • 輪值要可預測,而且交接時要有明確的「目前有什麼未結事項」。
  • 每一條 page 都要有 runbook(本章第一節)。
  • 升級路徑要事先寫好:多久沒有人回應就自動升級到下一個人。本章那個案例,如果有升級機制,40 分鐘會變成 5 分鐘。
  • 事後檢討要無咎責:目的是找出系統與流程的缺陷,不是找出「誰沒看告警」。本章的案例如果檢討成「值班的人不夠認真」,那 412 則告警下個月還在。

toil:能自動化的就不要叫人

如果某條告警的處理動作每次都一樣,那它就是 toil 的訊號:

「pod 記憶體高 → 重啟它」        → 設好 liveness probe 與資源限制,讓 K8s 自己做
「磁碟滿 → 清理舊日誌」          → 設定保留策略(ch04)
「流量高 → 手動擴容」            → HPA 自動擴縮
「某個依賴慢 → 手動關掉功能」    → 熔斷與降級(見 /cool/resilience/)
把人放在一個「每次都做同樣動作」的位置上,是最浪費也最容易出錯的設計。而且它會讓真正需要判斷力的那些告警,被淹沒在例行操作裡——這正是本章那場事故的形狀。

建立順序

1
先有 SLO(ch06)。沒有 SLO 的話,所有門檻都是拍腦袋訂的。
2
對每條關鍵旅程設一組 burn rate 告警(多視窗多燃燒率)。3~5 條旅程 × 每條 2 個 page 級規則 = 6~10 條 page 告警,這就是你的核心告警集合。
3
補幾條「來不及變成徵狀」的原因告警:憑證到期、磁碟即將寫滿、複本延遲持續擴大。
4
補 dead man's switch。
5
其餘一律做成 ticket 或儀表板——不要 page。
6
每條 page 寫 runbook 與升級路徑。

每條告警上線前的檢查表

□ 使用者受到影響了嗎?(否 → 不該 page)
□ 有具體的處理動作嗎?(否 → 不該 page)
□ 需要現在做嗎?(否 → ticket)
□ 這個動作能自動化嗎?(能 → 自動化,不要叫人)
□ 有 for 或等效的持續條件嗎?
□ 有 runbook 嗎?
□ 這個問題會不會同時觸發其他告警?(會 → 設抑制規則)

定期健檢(每季一次,30 分鐘)

  • 統計:告警總數、可行動比例、每次值班的中斷次數、深夜中斷次數。
  • 找出最吵的前五條規則,逐一問:修掉根因、加 for、降級成 ticket、還是直接刪除?
  • 檢視所有靜音中的告警:靜音超過一個月的,通常該刪或該修。
  • 檢查有沒有「該響卻沒響」的**:拿上一季的事故清單對照——每一次事故是告警先發現的,還是使用者先發現的?後者的比例是這套系統最誠實的成績單。

什麼時候不要加告警

  • 「以防萬一」:這是告警數量失控的頭號來源。沒有明確可行動性的,放儀表板。
  • 事故之後的反射性動作:出了事就加一條告警,感覺有在改進——但如果根因已經修掉了,那條告警永遠不會再響;如果沒修掉,它只是提醒你問題還在。先問「加這條告警能讓下次更快發現嗎」。
  • 已經被更上層的徵狀告警涵蓋的:SLO burn rate 已經會抓到使用者影響,就不需要再為每個可能的原因各設一條。

四筆帳

  • 人的耗損:這是最貴的一筆,而且不會出現在任何帳單上。長期的高頻值班會直接造成人員流失,而補一個熟悉系統的人,成本遠高於任何基礎設施。
  • 信任的耗損:一旦「告警=可能是雜訊」成為預設,重建信任比建立它困難得多。這是不可逆的成本。
  • 維護成本:告警規則會腐化——服務改名、指標改名、門檻過時。一條指向不存在指標的告警規則永遠不會響,而且沒有人會發現(這正是需要定期健檢與 dead man's switch 的理由)。
  • 過度收斂的風險:分組與抑制設得太激進,可能把真正獨立的問題壓成一則。

三個盲點

  • 告警只涵蓋你想得到的失敗模式。ch01 的「未知的未知」在告警這一層無解——徵狀告警之所以有價值,正是因為它不需要預先知道原因。
  • 它看不到緩慢的劣化。延遲每週增加 5%,任何單一時間點都不會超標,但半年後就是災難。這要靠趨勢檢視與容量規劃,不是告警。
  • 它不知道「這次是計畫性的」。部署、資料遷移、壓力測試都會觸發告警。這要靠靜音與變更管理系統的整合來處理,而「每次部署都手動靜音」本身也是一種 toil。

把這一章收成三句

① 告警的唯一判準是可行動性:沒有人需要立刻做具體事情的,就不該是告警。
② 對徵狀告警而不是對原因告警——使用者有沒有受影響是唯一該叫醒人的理由,原因是被叫醒之後才查的。
③ 告警疲勞是設計問題不是態度問題:94% 偽陽性率下,忽略告警是理性行為,而系統的實際產出是「告警響了=真的有事」這個信任。

最後一章回到 Java 這邊:把前面七章的東西真正接到一個 Spring 專案上,並且算一次完整的帳——因為可觀測性系統很容易變成整個架構裡最貴的一套系統。

三個層級:什麼該叫人、什麼該開單、什麼只放圖
層級判準例子常見錯誤
Page(叫人)使用者正在受影響,且需要人介入SLO burn rate 14.4×、關鍵旅程探針失敗把資源指標放進來(CPU、記憶體)
Ticket(工單)需要處理,但可以等上班時間磁碟三週後會滿、憑證 30 天後到期、burn rate 3×做成 page,半夜叫醒人卻無事可做
Dashboard排查時有用,不需要主動通知CPU、GC、連線池、佇列長度每個指標都配一條告警
自動化處理動作每次都一樣重啟、擴容、清理、熔斷叫人來手動執行固定動作(toil)
Alertmanager 的四個收斂機制
機制解決什麼關鍵設定注意
分組 grouping30 台機器同時出事 → 一則通知group_by、group_wait: 30sgroup_wait 是最有價值的一個
抑制 inhibition叢集掛了 → 不要再送 200 則衍生告警source/target matchers + equal設太激進會壓掉真正獨立的問題
靜音 silence處理中或計畫維護時不要再吵一定要設到期時間靜音超過一個月的通常該修或該刪
dead man's switch監控系統自己壞掉時誰通知你永遠為真的 Watchdog + 外部檢查最便宜也最常被遺漏的一條
告警健檢:該量的四個數字
指標健康值異常代表怎麼修
可行動比例> 70%低於 50% 就會產生告警疲勞先做減法:刪掉或降級不可行動的
每次值班中斷次數12 小時班次 ≤ 2 次超過就會影響處理品質修根因或承認目標與投入不匹配
深夜中斷次數越低越好成本遠高於白天——影響隔天一整天把可以等的降級成 ticket
事故由誰先發現告警先於使用者使用者先發現=有漏報檢查徵狀告警是否涵蓋該旅程

練習題 點選選項查看解析

0 / 10
01 / 10
判斷一件事該不該做成告警,唯一的判準是什麼?
A 這個指標重不重要
B 「這條告警響的時候,有一個人需要立刻做某件具體的事嗎」——答案是否,就不該是告警
C 這個問題會不會影響系統穩定
D 有沒有辦法設定合理的門檻
解析
三個檢查:有具體動作嗎、需要現在做嗎、自動化能不能取代人。第三個特別重要——如果每次處理動作都一樣(重啟、擴容),那應該寫成自動化而不是叫醒一個人手動執行,那是 SRE 說的 toil。
02 / 10
為什麼「CPU > 80%」是壞告警,而「SLO burn rate 14.4×」是好告警?
A 因為 CPU 指標不準確
B 前者是原因告警(會誤報也會漏報,而且一個問題會觸發五條),後者是徵狀告警——它量的是使用者受到的影響,不管根因是什麼
C 因為 burn rate 的計算比較精確
D 因為 CPU 應該用不同的門檻
解析
使用者受影響的原因有無限多種,不可能為每一種都設告警;而徵狀只有一個——「使用者用不了」。告警要回答「值不值得叫醒一個人」,這只取決於使用者有沒有受影響,原因是被叫醒之後才查的。
03 / 10
什麼情況下才該對「原因」發 page?
A 任何資源使用率超過 80% 時
B 當這個原因「必然」會在你來不及反應的時間內造成使用者影響時——判準是「等它變成徵狀時還來得及救嗎」
C 當這個指標歷史上曾經造成故障時
D 永遠不該
解析
例如「磁碟將在 30 分鐘內寫滿」(滿了資料庫直接停止服務)、「憑證明天到期」(到期就是 ch01 那場全面失敗)。而「磁碟三週後會滿」則是 ticket——來得及處理。
04 / 10
告警規則沒有設 for 會發生什麼?
A 規則不會生效
B 只要任何一個評估週期超標(例如部署造成的瞬間 5xx)就會響,然後自己恢復——這是誤報的主要來源之一
C 告警會延遲觸發
D 無法設定嚴重性
解析
for 期間規則處於 pending 不發通知,持續滿了才 firing。代價是延遲:for: 10m 意味著真出事時也晚 10 分鐘知道。所以 for 的長度應該由嚴重性決定——災難級用 2m(寧可偶爾誤報),一般的用 1h 並做成 ticket。
05 / 10
「錯誤數 > 100」與「錯誤率 > 1%」哪個是比較穩定的告警條件?為什麼?
A 錯誤數,因為它是絕對值比較直觀
B 錯誤率,因為絕對值會隨流量自然波動——尖峰時段正常運作也可能超過 100
C 兩者相同
D 取決於服務的規模
解析
用比例而不是絕對值是減少門檻邊緣抖動的基本做法。另一個做法是用 max_over_time 之類的平滑,讓短暫回落不會立刻解除告警。
06 / 10
Alertmanager 的 group_wait 設定 30 秒有什麼實際價值?
A 延遲通知以避免誤報
B 第一則告警到達後等 30 秒收集同組的其他告警,讓 30 台機器同時出事變成一則「30 個實例受影響」而不是 30 則通知
C 讓 Prometheus 有時間重新評估
D 避免通知管道被限流
解析
分組、抑制、靜音三者合起來把「一次故障 = 一則通知」落實。其中抑制規則負責讓上游的嚴重告警(叢集掛了)自動壓住下游的衍生告警(200 則服務無回應)。
07 / 10
dead man's switch(Watchdog)解決什麼問題?它的原理是什麼?
A 偵測服務當機
B 偵測監控系統自己壞掉——設一條永遠會觸發的告警送到外部系統,由外部系統在「超過 5 分鐘沒收到」時通知你
C 避免告警重複發送
D 在值班人員無回應時升級
解析
如果 Prometheus 或 Alertmanager 掛了,你什麼都不會收到——而「什麼都沒有」與「一切正常」長得一模一樣。這是 ch01「看不到沒發生的事」與 ch03 absent() 的同一思路,用在監控系統自己身上,是最便宜也最常被遺漏的一條。
08 / 10
一個月 412 則告警、其中 94% 自動恢復無需處理,導致真故障 40 分鐘沒人看見。最根本的問題是什麼?
A 值班工程師不夠負責任
B 94% 的偽陽性率讓「忽略這個頻道」成為理性行為——告警疲勞是設計問題,不是態度問題
C 通知管道不夠即時
D 告警規則的門檻設得太低
解析
在那個訊噪比下,認真看每一則告警才是不可持續的。所以修法的第一步是「做減法」——把 389 則無需處理的直接刪掉或降級成儀表板,即使大家會擔心「刪了以後漏掉怎麼辦」(但那些告警本來就沒人在看)。
09 / 10
值班負荷的經驗上限是多少?超過會怎樣?
A 每天 10 個事件,超過要加人
B 一個 12 小時班次最多處理 2 個事件——超過後處理品質會明顯下降,因為每個事件都需要調查、記錄、跟進
C 沒有上限,取決於個人能力
D 每小時 1 個事件
解析
把「告警數量」當成要被管理的資源,與錯誤預算是同一種思路。若持續超標,那不是「大家再撐一下」的問題,而是要嘛修掉根因、要嘛承認可靠性目標與投入不匹配。
10 / 10
定期告警健檢時,最誠實的一項成績單是什麼?
A 告警總數有沒有下降
B 拿上一季的事故清單對照:每次事故是告警先發現的,還是使用者先發現的
C 平均回應時間
D 靜音中的告警數量
解析
使用者先發現的比例直接反映了漏報。另外三個該量的是:可行動比例(低於 50% 就要做減法)、每次值班中斷次數、深夜中斷次數。而告警規則也會腐化——指向不存在指標的規則永遠不會響,而且沒有人會發現。

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

QUESTION
告警設計唯一的判準是什麼?三個檢查是什麼?
點擊翻面
ANSWER
可行動性:「有人需要立刻做某件具體的事嗎」。三個檢查:①有具體動作嗎 ②需要現在做嗎 ③自動化能不能取代人(每次動作都一樣就是 toil,該自動化而不是叫人)。
點擊翻回
QUESTION
Page、Ticket、Dashboard 各自的判準?
點擊翻面
ANSWER
Page=使用者正在受影響且需要人介入;Ticket=需要處理但可以等上班時間(磁碟三週後滿、憑證 30 天後到期);Dashboard=排查時有用但不需主動通知(CPU、GC、連線池)。
點擊翻回
QUESTION
為什麼要對徵狀告警而不是對原因告警?
點擊翻面
ANSWER
原因告警會誤報(CPU 80% 可能沒事)、會漏報(原因有無限多種)、數量會爆炸(一次 DB 變慢同時觸發五條)。而徵狀只有一個——使用者用不了。原因是被叫醒之後才查的事。
點擊翻回
QUESTION
什麼情況下才該對原因發 page?
點擊翻面
ANSWER
當這個原因必然會在你來不及反應的時間內造成使用者影響時。判準:「等它變成徵狀時還來得及救嗎?」磁碟 30 分鐘內寫滿、憑證明天到期=該 page;磁碟三週後滿=ticket。
點擊翻回
QUESTION
for 的作用與代價是什麼?長度該怎麼定?
點擊翻面
ANSWER
條件要持續多久才觸發(期間為 pending 不發通知),代價是延遲知道。長度由嚴重性決定:災難級 2m(寧可偶爾誤報)、嚴重 15m、一般 1h 並降為 ticket。
點擊翻回
QUESTION
每條 page 都要有 runbook,它至少要回答哪四件事?
點擊翻面
ANSWER
①這代表什麼 ②影響誰 ③先確認哪三件事 ④已知處理方式與升級對象。因為半夜三點的人認知能力大約只有平常一半;而寫不出 runbook 通常代表你自己也不確定它意味著什麼。
點擊翻回
QUESTION
Alertmanager 的分組與抑制各解決什麼?
點擊翻面
ANSWER
分組(group_wait 30s):30 台機器同時出事收成一則通知。抑制:上游嚴重告警壓住下游衍生告警——叢集掛了要一則「叢集掛了」,不是 200 則「某服務無回應」。
點擊翻回
QUESTION
dead man's switch 是什麼?為什麼需要它?
點擊翻面
ANSWER
設一條永遠為真的 Watchdog 告警送到外部系統,由外部系統在「超過 5 分鐘沒收到」時通知你。因為監控系統自己掛掉時你什麼都不會收到,而「什麼都沒有」與「一切正常」長得一模一樣。
點擊翻回
QUESTION
告警疲勞的本質是什麼?
點擊翻面
ANSWER
設計問題,不是態度問題。當偽陽性率高到 94%,忽略告警就是理性且唯一可持續的策略。所以修法第一步是做減法——刪掉或降級不可行動的告警,即使大家會擔心漏掉。
點擊翻回
QUESTION
值班負荷該量哪三個數字?健康值是多少?
點擊翻面
ANSWER
①可行動比例(> 70%,低於 50% 就會產生疲勞)②每次值班中斷次數(12 小時班次 ≤ 2 次)③深夜中斷次數(成本遠高於白天,影響隔天一整天)。
點擊翻回
QUESTION
哪些告警其實該被自動化取代?
點擊翻面
ANSWER
處理動作每次都一樣的:pod 記憶體高→設好探針與資源限制讓 K8s 處理、磁碟滿→保留策略、流量高→HPA、依賴慢→熔斷降級。把人放在「每次做同樣動作」的位置是最浪費也最容易出錯的設計。
點擊翻回
QUESTION
告警定期健檢該看什麼?最誠實的成績單是哪一項?
點擊翻面
ANSWER
告警總數、可行動比例、值班中斷次數、深夜中斷次數;找出最吵的前五條逐一處理;檢視靜音超過一個月的。最誠實的是:拿上季事故對照——每次事故是告警先發現,還是使用者先發現。
點擊翻回
QUESTION
告警系統最貴的兩筆帳是什麼?
點擊翻面
ANSWER
①人的耗損——長期高頻值班造成人員流失,而補一個熟悉系統的人成本遠高於任何基礎設施 ②信任的耗損——一旦「告警=可能是雜訊」成為預設,重建比建立困難得多,這是不可逆的成本。
點擊翻回