走到這裡,你已經理解了可觀測性的三大支柱、學會了 OpenTelemetry 的架構、也知道了各種後端工具的定位。但在真正把可觀測性帶進生產環境之前,有幾個現實問題必須先面對——成本、網路複雜性、以及告警疲勞。這些不是技術債,而是從第一天就必須納入設計的考量。
成本與效益#
可觀測性的成本模型#
可觀測性的成本,本質上是資料量的函數。你送出越多資料,儲存、傳輸、查詢的成本就越高:
- Metrics:每個時間序列(Time Series)都是一筆持續成本。如果你有 100 個服務、每個服務暴露 200 個 Metrics、再乘上 Label 的排列組合,時間序列數量可以輕易突破百萬
- Logs:每一行日誌都需要索引和儲存。一個繁忙的服務每秒可以產生數千行日誌,一天下來就是 GB 等級
- Traces:每個 Span 都帶有上下文資訊。在微服務架構中,一個使用者請求可能產生數十到數百個 Span
成本不只是儲存費用。查詢時的計算資源、跨區域傳輸的網路費用、以及維運可觀測性系統本身的人力成本,往往比儲存費用更高。
不是所有東西都需要監控#
很多團隊在導入可觀測性時,會陷入「全面覆蓋」的陷阱——為每個 API、每個資料庫查詢、每行程式碼都加上觀測。這不僅浪費成本,更會讓真正重要的信號淹沒在噪音中。
正確的做法是根據業務價值決定觀測粒度:
- 核心業務流程(登入、付款、下單):高精度觀測,完整 Trace,詳細 Metrics
- 輔助功能(偏好設定、通知):基本 Metrics 加上錯誤日誌即可
- 內部批次處理:可能只需要開始/結束時間和成功/失敗狀態
一個實用的判斷標準:如果這個功能半夜壞了,你會不會被叫起來修?如果會,就值得深度觀測;如果不會,基本觀測就夠了。
網路的複雜性#
在分散式環境中,可觀測性資料本身也是網路流量。這件事聽起來理所當然,但很多團隊在規劃時完全忽略了它。
頻寬與延遲#
當你的 OpenTelemetry Collector 部署在每個節點上,每個 Collector 都在持續向後端傳送資料。在一個擁有數百個節點的叢集中,這些流量加總起來是很可觀的:
- 頻寬佔用:Metrics 的定期回報、Trace 的即時傳送、Log 的串流推送,三者的流量可能佔據叢集內部網路的顯著比例
- 延遲影響:如果可觀測性資料的傳送路徑和業務流量共享網路,在流量尖峰時可能互相干擾
- 可靠性問題:網路分區(Network Partition)時,你最需要觀測資料的時刻,恰恰是最可能丟失觀測資料的時刻
設計考量#
- 批次傳送(Batching):累積一定量的資料後再傳送,減少網路往返次數
- 壓縮(Compression):在傳輸前壓縮資料,用 CPU 換頻寬
- 本地緩衝(Local Buffering):在網路不可用時暫存資料,恢復後再傳送
- 獨立網路通道:考慮為可觀測性資料配置專用的網路路徑,避免和業務流量競爭
在雲端環境中,跨可用區(Cross-AZ)的資料傳輸通常需要額外費用。如果你的 Collector 和後端不在同一個可用區,這筆費用可能比你想像的高出許多。
告警疲勞(Alert Fatigue)#
告警疲勞是可觀測性落地後最常見、也最致命的問題。它的運作方式類似「狼來了」——當團隊每天收到幾十封無意義的告警,最終會對所有告警都失去敏感度,包括真正重要的那些。
告警疲勞的成因#
- 閾值設定過於敏感:CPU 超過 70% 就告警,但服務其實在 85% 以下都能正常運作
- 缺乏去重與聚合:同一個問題觸發 10 個不同的告警規則,收到 10 封通知
- 沒有區分嚴重程度:所有告警都用同一個管道發送,重要和不重要的混在一起
- 告警沒有對應的行動:收到告警後不知道該做什麼,只能「觀察」——這代表這則告警根本不應該存在
如何建立有效的告警機制#
設定有意義的閾值:閾值應該基於實際的服務行為,而非想像中的「安全線」。最好的做法是觀察一段時間的正常數據,再根據統計分布設定閾值。
分級告警:
- Critical:需要立即處理,會影響使用者。通知方式:電話、PagerDuty
- Warning:需要關注,但不急迫。通知方式:Slack 頻道
- Info:僅供參考,不需要動作。通知方式:Dashboard 或低優先郵件
告警路由:確保對的人收到對的告警。資料庫的告警發給 DBA,網路的告警發給 SRE,業務指標的告警發給產品團隊。沒有人應該收到與自己無關的告警。
每條告警都要有 Runbook:告警觸發後,接收者應該能立即知道下一步該做什麼。如果寫不出 Runbook,代表這條告警還不夠成熟,先不要啟用。
定期審視告警清單。如果一條告警在過去 30 天內觸發了 50 次,卻從來沒有人因為它採取任何行動,那就應該刪除它或重新設計它。
落地建議#
把可觀測性帶進生產環境不是一次性的大工程,而是一個持續迭代的過程。以下是一些務實的建議:
- 從小處開始:先觀測最核心的 3-5 個服務,建立團隊的信心和經驗後再擴展
- 先有 Metrics,再加 Traces:Metrics 的成本最可控、價值最直接,是最好的起點
- 設定成本預算:為可觀測性設定月度成本上限,當成本接近上限時觸發審視
- 培養文化:可觀測性不是 SRE 團隊的事,開發者也需要理解並使用這些工具
- 避免完美主義:80% 的觀測覆蓋率加上 20% 的投入,遠好過追求 100% 覆蓋率卻遲遲無法上線
可觀測性的真正價值不在於收集了多少資料,而在於當問題發生時,你能多快找到根因。一個設計良好的輕量級觀測系統,勝過一個面面俱到卻無人能駕馭的龐大系統。