監控最佳實踐 - 為什麼可觀測性勝過猜測

  1. 盲目飛行的代價
  2. 監控的真正含義
  3. 四個黃金訊號
  4. 指標 vs 日誌 vs 追蹤
  5. 監控中的日誌
  6. 告警:訊號 vs 雜訊
  7. 真正有用的儀表板
  8. 向正確的方交付
  9. RED 方法
  10. 不同架構中的監控
  11. 監控技術堆疊
  12. 監控最佳實踐
  13. 常見的監控錯誤
  14. 建立監控文化
  15. 監控的投資報酬率
  16. 做出選擇

在軟體維運領域,存在一個危險的假設:如果使用者沒有抱怨,一切就一定沒問題。多年來,團隊一直在黑暗中運作,只有在客戶回報問題時才發現問題——或者更糟的是,當收入下降時才發現。但如果你能在問題變成災難之前就看到它們呢?

監控是知道系統健康與希望系統健康之間的區別。是在幾分鐘內修復問題與幾小時內修復問題的區別。是主動工程與被動救火的區別。然而,許多團隊將監控視為事後考慮,認為是「有時間時」才添加的東西。

這不僅僅是收集指標——而是從第一天起就將可觀測性建構到系統中。是將資料轉化為洞察,將洞察轉化為行動。

盲目飛行的代價

在沒有適當監控的情況下運作就像閉著眼睛開車。你可能會幸運一段時間,但最終會撞車。後果是真實的:

延遲的事件偵測:問題在任何人注意到之前已經惡化了幾個小時。記憶體洩漏緩慢降低效能。故障磁碟在無人注意的情況下被填滿。當使用者抱怨時,損害已經造成。

延長的停機時間:沒有監控,你不知道什麼壞了。是資料庫?應用伺服器?網路?你浪費寶貴的時間調查而不是修復。

收入損失:每一分鐘的停機都會損失金錢。對於電子商務網站,即使是短暫的中斷也會直接轉化為銷售損失。對於 SaaS 平台,它會侵蝕客戶信任。

使用者體驗下降:緩慢的回應時間會趕走使用者。但沒有監控,你不知道哪些頁面慢,哪些 API 逾時,或者哪些使用者受到影響。

被動文化:團隊花時間救火而不是建構。每天都有新的意外。倦怠不可避免地隨之而來。

錯過最佳化機會:你無法改進你無法衡量的東西。沒有資料,你只能猜測哪些最佳化會有幫助。

⚠️ 隱藏成本

對於中型電子商務網站,一小時的停機可能會造成 10 萬美元或更多的損失。在幾秒鐘而不是幾小時內偵測到問題的適當監控不是開支——而是保險。

監控的真正含義

監控不僅僅是收集資料——而是建立對系統健康狀況的全面理解。現代監控涵蓋多個層面:

基礎設施監控:CPU 使用率、記憶體消耗、磁碟 I/O、網路吞吐量。系統健康的基礎。

應用監控:請求速率、回應時間、錯誤率、吞吐量。你的程式碼在生產環境中的實際表現。

日誌聚合:集中式日誌記錄,讓你可以跨所有服務搜尋。當出現問題時,日誌告訴你原因。

分散式追蹤:追蹤跨微服務的請求。了解在複雜架構中時間花在哪裡。

合成監控:主動測試關鍵使用者旅程。在真實使用者遇到問題之前捕獲問題。

業務指標:轉換率、交易量、使用者註冊。將技術健康與業務結果聯繫起來。

目標不是收集每一個可能的指標——而是收集正確的指標,告訴你何時出現問題並幫助你診斷原因。

四個黃金訊號

Google 的網站可靠性工程團隊確定了監控面向使用者系統最重要的四個指標:

延遲:服務一個請求需要多長時間?分別追蹤成功請求和失敗請求——快速失敗仍然是失敗。

流量:你的系統處理多少需求?每秒請求數、每分鐘交易數、並行使用者數。

錯誤:你的錯誤率是多少?追蹤顯式失敗(500 錯誤)和隱式失敗(錯誤內容、緩慢回應)。

飽和度:你的系統有多滿?CPU 達到 90%、記憶體達到 95%、磁碟達到 80%——這些是即將失敗的警告訊號。

💡 從黃金訊號開始

如果你從頭開始建構監控,從這裡開始。這四個指標以 20% 的努力提供 80% 的價值。隨著需求的出現,添加更複雜的監控。

這些訊號有效是因為它們以使用者為中心。它們回答了這個問題:「我的服務現在對使用者運作良好嗎?」

指標 vs 日誌 vs 追蹤

理解可觀測性這三大支柱之間的區別至關重要:

指標是隨時間變化的數值測量。它們收集和儲存成本低,非常適合儀表板和告警。「CPU 使用率為 85%」或「回應時間為 250ms」。

日誌是帶有上下文的離散事件。它們儲存成本高,但對除錯非常寶貴。「使用者 12345 認證失敗,因為密碼不正確」。

追蹤顯示請求通過系統的路徑。它們對於理解分散式系統至關重要。「此結帳請求在支付服務中花費了 2 秒」。

每個都有不同的目的:

  • 指標告訴你出了什麼問題
  • 日誌告訴你為什麼出問題
  • 追蹤告訴你在哪裡出問題
graph TD A["🔔 觸發告警"] --> B["📊 指標"] B --> C{"出了什麼問題?"} C --> D["📝 日誌"] D --> E{"為什麼失敗?"} E --> F["🔍 追蹤"] F --> G["✅ 找到根本原因"] style A fill:#ff6b6b,stroke:#c92a2a,color:#fff style B fill:#4dabf7,stroke:#1971c2,color:#fff style D fill:#51cf66,stroke:#2f9e44,color:#fff style F fill:#ffd43b,stroke:#f59f00,color:#000 style G fill:#69db7c,stroke:#2f9e44,color:#fff

ℹ️ 可觀測性三角

指標、日誌和追蹤協同工作。指標提醒你問題,日誌幫助診斷根本原因,追蹤顯示請求流。你需要全部三個才能實現完整的可觀測性。

監控中的日誌

日誌通過在出現問題時提供詳細上下文來補充指標。雖然指標告訴你有問題,但日誌告訴你原因。

日誌對監控重要的時候

除錯上下文:指標顯示錯誤率激增。日誌顯示「資料庫連線池耗盡」或「支付閘道逾時」——具體的失敗。

安全事件:失敗的登入嘗試、未經授權的存取嘗試、SQL 注入偵測——需要立即告警的關鍵事件。

業務異常:高價值交易失敗、庫存不匹配、異常退款模式——影響收入的事件。

📝 深入探討:應用日誌

應用日誌策略、結構化日誌、日誌保留和日誌監控模式值得單獨討論。請參閱應用日誌最佳實踐,全面了解日誌標準、設計時策略和日誌管理。

日誌聚合工具:CloudWatch Logs、ELK Stack、Splunk、Loki + Grafana 提供跨所有服務的集中式日誌收集和搜尋。

對日誌模式告警:監控特定錯誤訊息、安全事件或業務異常。將基於日誌的告警與基於指標的告警結合起來,實現全面覆蓋。

告警:訊號 vs 雜訊

如果沒有人對指標採取行動,收集指標就毫無用處。告警將資料轉化為行動——但前提是做得正確。

告警疲勞問題:太多告警,團隊就會開始忽略它們。每個告警都應該是可操作的。如果你無法對它做任何事情,就不要對它告警。

對症狀告警,而不是原因:當使用者受到影響時告警,而不是當單個伺服器的 CPU 很高時。如果你有十台伺服器,一台伺服器的 CPU 達到 100% 可能沒問題。使用者體驗到緩慢的回應時間總是一個問題。

複合條件告警

單指標告警會產生雜訊。單獨的 CPU 峰值並不意味著麻煩——但 CPU 峰值加上高錯誤率加上緩慢的回應時間確實意味著麻煩。複合條件可以大幅減少誤報。

為什麼複合條件重要

糟糕的告警CPU > 80%

  • 在正常流量峰值期間觸發
  • 在批次處理作業期間觸發
  • 當一個程序行為異常但使用者未受影響時觸發

更好的告警CPU > 80% AND error_rate > 1% AND response_time > 500ms

  • 僅在使用者實際受到影響時觸發
  • 結合基礎設施和應用訊號
  • 將誤報減少 90%

實際範例

# 資料庫過載
告警:database_connections > 90% AND query_time_p95 > 1s AND error_rate > 0.5%
含義:資料庫飽和 AND 查詢緩慢 AND 使用者看到錯誤
# 記憶體洩漏偵測
告警:memory_usage > 85% AND memory_growth_rate > 5%/hour AND uptime > 6h
含義:記憶體高 AND 正在增加 AND 不僅僅是啟動行為
# 級聯故障
告警:error_rate > 5% AND downstream_service_errors > 10% AND response_time_p99 > 2s
含義:錯誤率高 AND 由相依項引起 AND 使用者受到影響

結合時間視窗

# 持續問題,而不是瞬時峰值
告警:avg(error_rate, 5m) > 2% AND avg(error_rate, 15m) > 1%
含義:問題是最近的但正在持續

💡 複合條件策略

從單個指標開始了解正常行為。一旦你知道「壞」是什麼樣子,就結合條件,僅在多個訊號表明真正問題時告警。目標是 95% 以上可操作的告警。

嚴重性級別很重要

  • 嚴重:叫醒某人。現在正在損失收入。
  • 警告:在工作時間調查。某些事情很快需要關注。
  • 資訊:僅供了解。不需要立即採取行動。

執行手冊節省時間:每個告警都應該連結到一個執行手冊,解釋它的含義以及如何修復它。在凌晨 3 點,清晰度很重要。

對趨勢告警,而不是峰值:短暫的 CPU 峰值可能是正常的。CPU 持續 10 分鐘以上超過 80% 是一個問題。

⚠️ 告警疲勞會扼殺監控

如果你的團隊每週收到超過 5-10 個告警,你的告警太多了。調整閾值,減少雜訊,專注於重要的事情。被忽略的告警比沒有告警更糟——它會產生虛假的信心。

真正有用的儀表板

儀表板應該回答問題,而不僅僅是顯示資料。一牆的圖表令人印象深刻,但如果你無法快速了解系統健康狀況,它就毫無用處。

儀表板的層次結構

高階主管儀表板:高層業務指標。網站是否正常運作?使用者是否滿意?我們是否在賺錢?

服務儀表板:每個服務的健康狀況。請求速率、錯誤率、延遲百分位數、資源使用情況。

除錯儀表板:用於故障排除的詳細指標。當出現問題時,這是你深入挖掘的地方。

設計原則

  • 最重要的指標在頂部:不要讓人們捲動才能看到網站是否當機。
  • 有意義地使用顏色:綠色 = 良好,黃色 = 警告,紅色 = 嚴重。不僅僅是裝飾。
  • 顯示趨勢,而不僅僅是當前值:CPU 使用率是在增加還是穩定?上下文很重要。
  • 包括 SLO 指標:你是否達到服務級別目標?這才是真正重要的。

向正確的方交付

如果資訊沒有到達能夠採取行動的人手中,最好的監控系統也毫無用處。不同的利益相關者需要不同的視圖和不同的告警管道。

按角色劃分的儀表板存取

高階主管和產品經理

  • 他們需要什麼:業務指標、正常運作時間百分比、使用者影響
  • 儀表板重點:高層 KPI、SLO 合規性、事件摘要
  • 存取方式:Web 儀表板、週報、行動應用程式
  • 範例指標:本月 99.9% 正常運作時間、5 萬活躍使用者、處理了 200 萬美元交易

工程團隊

  • 他們需要什麼:技術指標、服務健康、資源利用率
  • 儀表板重點:服務級別儀表板、錯誤率、延遲百分位數
  • 存取方式:Grafana、團隊特定儀表板、Slack 整合
  • 範例指標:API 回應時間 p95、資料庫連線池使用情況、部署成功率

值班工程師

  • 他們需要什麼:可操作的告警、除錯上下文、執行手冊連結
  • 儀表板重點:即時服務狀態、最近部署、活動事件
  • 存取方式:PagerDuty、行動告警、事件回應儀表板
  • 範例指標:當前錯誤峰值、受影響的服務、類似的過去事件

DevOps/SRE 團隊

  • 他們需要什麼:基礎設施指標、容量規劃資料、成本分析
  • 儀表板重點:資源利用率趨勢、擴展指標、基礎設施成本
  • 存取方式:CloudWatch、Datadog、自訂儀表板
  • 範例指標:30 天 CPU 趨勢、儲存增長率、每月 AWS 帳單明細

告警路由策略

graph LR A["🚨 產生告警"] --> B{"嚴重性?"} B -->|嚴重| C["📟 PagerDuty"] B -->|警告| D["💬 Slack"] B -->|資訊| E["📧 郵件摘要"] C --> F{"時間?"} F -->|工作時間| G["👨💻 值班 + 團隊"] F -->|下班後| H["👨💻 僅值班"] F -->|週末| I["👨💻 僅嚴重"] D --> J{"服務?"} J -->|支付| K["💳 支付團隊"] J -->|認證| L["🔐 安全團隊"] J -->|前端| M["🎨 前端團隊"] style A fill:#ff6b6b,stroke:#c92a2a,color:#fff style C fill:#fa5252,stroke:#c92a2a,color:#fff style D fill:#4dabf7,stroke:#1971c2,color:#fff style E fill:#51cf66,stroke:#2f9e44,color:#fff

按嚴重性路由

嚴重告警 → PagerDuty → 電話 + 簡訊
警告告警 → Slack #alerts 頻道
資訊告警 → 郵件摘要(每日彙總)

按服務所有權路由

支付服務錯誤 → payments-team Slack 頻道
認證服務錯誤 → security-team PagerDuty
前端錯誤 → frontend-team 郵件

按時間路由

工作時間(上午 9 點 - 下午 6 點)→ Slack + 郵件
下班後 → PagerDuty(僅值班)
週末 → PagerDuty(僅嚴重)

按影響路由

面向使用者的問題 → 立即 PagerDuty
內部工具 → Slack 通知
批次作業失敗 → 郵件給團隊負責人

📱 多管道策略

使用多個管道進行升級:Slack 通知 → 5 分鐘後郵件 → 10 分鐘後 PagerDuty → 15 分鐘後電話。這確保關鍵告警不會被錯過,同時減少非緊急問題的雜訊。

通知最佳實踐

在告警中包含上下文

糟糕:「伺服器 123 上的 CPU 高」

良好:「[嚴重] 200 個使用者受影響 - 支付 API:CPU >90% 持續 10 分鐘,錯誤率 5%。執行手冊:https://wiki/payment-cpu」

可操作的資訊

  • 影響級別優先:[嚴重]、[警告]、[資訊] - 一眼就能告訴接收者緊急程度
  • 使用者影響:有多少使用者受到影響(最重要的指標)
  • 什麼壞了:服務名稱和具體問題
  • 上下文:持續時間、錯誤率、相關指標
  • 執行手冊連結:如何修復它
  • 相關儀表板連結:在哪裡調查
  • 最近的變更:可能導致它的部署、設定更新

避免告警風暴

  • 分組相關告警(「5 台伺服器當機」而不是 5 個單獨的告警)
  • 在時間視窗內抑制重複告警
  • 在維護視窗期間暫停告警

升級策略

1. 告警主要值班工程師
2. 如果 15 分鐘內沒有回應,告警次要值班工程師
3. 如果 30 分鐘內沒有回應,告警團隊負責人
4. 如果 45 分鐘內沒有回應,告警工程經理

儀表板共享

公開狀態頁面:向客戶展示他們需要知道的內容——正常運作時間、正在進行的事件、計劃維護。不要暴露內部指標。

團隊儀表板:每個團隊擁有他們的服務儀表板。在中央儀表板目錄中使它們可被發現。

事件作戰室:在事件期間,建立一個臨時儀表板,在一個地方顯示所有相關指標。在事件 Slack 頻道中共享連結。

高階主管摘要:自動化的週報,包含關鍵指標、趨勢和事件。每週一早上透過郵件發送。

ℹ️ 存取控制很重要

不是每個人都應該看到所有內容。日誌中的生產資料庫憑證?限制存取。追蹤中的客戶 PII?遮罩它。安全指標?限制給安全團隊。在透明度和安全性之間取得平衡。

RED 方法

對於每個服務,追蹤三個指標:

速率(Rate):每秒請求數。這個服務有多忙?

錯誤(Errors):每秒失敗請求數。什麼在出錯?

持續時間(Duration):請求需要多長時間。使用者在等待嗎?

這個簡單的框架適用於任何請求驅動的服務——Web 伺服器、API、訊息佇列、資料庫。它是專注於服務健康的黃金訊號的實際實作。

不同架構中的監控

監控策略因架構而異:

單體應用

更簡單的監控:一個應用、一個資料庫、更少的移動部件。專注於應用指標、資料庫效能和伺服器資源。

挑戰:對內部元件的可見性較低。一個緩慢的端點可能是由程式碼庫的任何部分引起的。

微服務

複雜的監控:許多服務、許多資料庫、許多故障模式。分散式追蹤變得至關重要。

挑戰:理解級聯故障。服務 A 呼叫 B 呼叫 C——請求在哪裡變慢了?

解決方案:實作分散式追蹤(OpenTelemetry、Jaeger、Zipkin)以追蹤跨服務邊界的請求。

無伺服器

不同的指標:冷啟動時間、函式持續時間、並行執行、限流率。

挑戰:對基礎設施的控制較少。你監控的是函式行為,而不是伺服器健康。

解決方案:專注於函式級別的指標和業務結果,而不是基礎設施指標。

監控技術堆疊

建構監控系統需要為每一層選擇工具:

指標收集和儲存

  • Prometheus:開源、基於拉取、非常適合 Kubernetes
  • InfluxDB:時間序列資料庫,適合高基數資料
  • CloudWatch:AWS 原生,與 AWS 服務無縫整合
  • Datadog:商業 SaaS,全面但昂貴

日誌聚合

  • ELK Stack(Elasticsearch、Logstash、Kibana):強大但資源密集
  • Loki:Elasticsearch 的輕量級替代品,專為 Kubernetes 設計
  • CloudWatch Logs:AWS 原生,簡單但搜尋能力有限
  • Splunk:企業級,昂貴,強大的分析

分散式追蹤

  • Jaeger:開源,CNCF 專案,良好的 Kubernetes 整合
  • Zipkin:成熟的開源選項
  • AWS X-Ray:AWS 原生,AWS 服務的簡單設定
  • Datadog APM:商業,全面但昂貴

視覺化

  • Grafana:開源,支援多個資料來源,高度可自訂
  • Kibana:ELK 堆疊的一部分,適合日誌視覺化
  • CloudWatch Dashboards:AWS 原生,基本但功能齊全

告警

  • Prometheus Alertmanager:靈活的路由、分組、靜默
  • PagerDuty:值班管理、升級策略
  • Opsgenie:類似於 PagerDuty,良好的 Slack 整合

💡 從簡單開始,逐步擴展

不要在第一天就建構完美的監控堆疊。從 CloudWatch 或 Prometheus + Grafana 開始。在需要時添加日誌聚合。當微服務使除錯變得困難時添加分散式追蹤。讓複雜性隨著需求增長。

監控最佳實踐

儘早檢測:在編寫程式碼時添加監控,而不是在生產環境中出現問題後。使其成為完成定義的一部分。

監控使用者體驗:內部指標很重要,但面向使用者的指標更重要。從使用者角度看的回應時間才是最重要的。

設定有意義的閾值:不要對任意數字告警。基於 SLO 和實際使用者影響設定閾值。

測試你的監控:定期驗證告警是否在應該觸發時觸發。混沌工程有助於驗證監控覆蓋範圍。

記錄一切:每個指標都應該有描述。每個告警都應該有執行手冊。未來的你會感謝現在的你。

審查和改進:監控不是一勞永逸的。定期審查告警頻率、儀表板有用性和指標相關性。

監控監控器:如果你的監控系統失敗了會發生什麼?有外部合成檢查來驗證你的應用和監控。

將指標與部署關聯:在儀表板上疊加部署標記。當指標變化時,你會知道是否是部署導致的。

常見的監控錯誤

監控一切:更多指標並不意味著更好的監控。專注於重要的事情。高基數指標(唯一使用者 ID、請求 ID)可能會壓垮你的系統。

忽略百分位數:平均值會撒謊。100ms 的平均回應時間可能隱藏了 5% 的請求需要 10 秒的事實。監控 p95、p99 和 p99.9。

對一切告警:如果一切都是嚴重的,那麼什麼都不是嚴重的。為需要立即關注的可操作問題保留告警。

告警中沒有上下文:「CPU 高」沒有幫助。「Web 伺服器 CPU >90% 持續 10 分鐘,使用者體驗到頁面載入緩慢」是可操作的。

忘記成本:監控可能會變得昂貴。Datadog 帳單很容易達到每月數千美元。在可觀測性需求和預算約束之間取得平衡。

不監控業務指標:技術指標很重要,但業務指標更重要。使用者在轉換嗎?交易在完成嗎?收入在流動嗎?

建立監控文化

僅靠技術無法創造良好的監控——文化才能:

使指標可見:在公共區域顯示儀表板。讓系統健康對每個人都透明。

慶祝改進:當有人添加有用的監控或改進告警時,認可它。使可觀測性成為一項有價值的技能。

從事件中學習:每個事件都是一個監控缺口。什麼指標可以更早地捕獲這個?添加它。

共同責任:監控不僅僅是維運團隊的事。開發人員應該檢測他們的程式碼。產品經理應該關心業務指標。

無責備的事後分析:當監控未能捕獲問題時,專注於改進系統,而不是責備人。

監控的投資報酬率

監控在你需要它之前感覺像是開銷。但投資報酬率是明確的:

減少停機時間:在幾秒鐘而不是幾小時內捕獲問題意味著更少的收入損失和更快樂的使用者。

更快的除錯:當出現問題時,良好的監控會準確告訴你在哪裡查找。幾小時的調查變成幾分鐘。

主動最佳化:在瓶頸成為問題之前識別它們。在資源耗盡之前擴展資源。

更好的容量規劃:歷史指標顯示增長趨勢。基於資料而不是猜測來規劃基礎設施需求。

改善睡眠:值班工程師睡得更好,因為他們知道如果出現問題會收到告警——並且有工具可以快速修復它。

做出選擇

問題不是是否實作監控——而是多少和何時。對於任何為真實使用者提供服務的生產系統,監控都是不可協商的。唯一的問題是它需要多複雜。

從基礎開始:四個黃金訊號、基本告警、簡單儀表板。隨著系統的增長和變得更加關鍵,添加日誌聚合、分散式追蹤和進階分析。

記住:你無法修復你看不見的東西。你無法改進你無法衡量的東西。如果你不知道系統是否健康,你就無法睡個好覺。

監控不是開銷——它是保險。它是對災難做出反應和預防災難之間的區別。它是可靠系統和可持續維運的基礎。

從第一天起就將可觀測性建構到你的系統中。你未來的自己——以及你的使用者——會感謝你。

分享到