題干與適用場景
一個多語言微服務平台同時使用 OpenTracing API、廠商 shim 和 OpenTelemetry SDK。OpenTelemetry 規範在 2026 年 3 月起不再要求新實作提供 OpenTracing 相容性,但現有 shim 仍需在過渡期運行。請設計遷移方案,要求不中斷追蹤、可控制成本,並能在單個服務出現問題時回滾。
面試官考察點
面試官考察你能否區分 API 相容、資料語義相容和後端協議相容;能否處理 trace/span 屬性映射、上下文傳播、採樣一致性、雙寫成本和供應商鎖定。高品質回答會給出遷移順序、驗收指標與失敗隔離,而不是只說「替換依賴」。
回答前需要釐清的問題
- 現有 OpenTracing 呼叫集中在哪些語言和框架,shim 是否修改過語義?
- 追蹤後端是否接受 OTLP,歷史資料和查詢維度是否必須保持一致?
- 遷移優先級是零遺失、低開銷、統一語義,還是供應商可替換性?
- 是否允許短期雙寫,採樣率和每服務成本上限是多少?
30 秒回答
「我會把遷移拆成 API、語義、傳輸和運營四層。先凍結新的 OpenTracing 依賴,盤點 shim、傳播格式和關鍵屬性;在一個服務中接入原生 OpenTelemetry,同時保留 shim 作為相容入口,用一致的 trace context 和採樣策略做對照。通過 trace 連續性、錯誤率、屬性覆蓋、延遲和成本門檻後,再按語言和依賴拓撲擴展。出現問題時按服務關閉雙寫或回退入口,不回滾整個 Collector 平台。」
分步驟深入解答
1. 盤點呼叫與語義
建立服務、語言、OpenTracing 套件、shim 版本、傳播格式和匯出路徑清單。標記自訂 tag、log、baggage 和 span 命名,逐項映射到 OpenTelemetry attributes、events、links 和 baggage。先處理邊界清晰的無狀態服務,避免從最複雜的自訂 tracer 開始。
2. 設計相容邊界
讓應用逐步依賴 OpenTelemetry 原生 tracer;對暫時不能修改的庫保留 OpenTracing shim,但禁止新增 shim 特性。Context propagation 必須在入口、非同步佇列、RPC 和批處理邊界保持一致;不得因 API 名稱相似就假設採樣和 parent 關係相同。
3. 選擇雙寫位置
優先在 SDK 或 Collector 出口做可控分流,而不是讓每個業務程式碼生成兩套 span。若確實要雙寫,給每個服務設定採樣上限、佇列容量、重試和丟棄指標,並區分「業務 span 未生成」和「匯出失敗」。雙寫窗口應有明確結束條件。
4. 保持後端可查詢
遷移期間固定 service、operation、status 和關鍵業務屬性的命名。用同一組請求同時比較舊鏈路和新鏈路的 trace 數量、父子關係、錯誤狀態、延遲分位數和 exemplars。若後端查詢語義變化,先提供查詢適配或儀表板雙版本,再切換預設視圖。
5. 灰度與成本護欄
按語言、團隊或依賴樹逐批遷移。灰度看端到端 trace 連續率、span 遺失率、Collector 佇列、CPU/記憶體、出口流量和每百萬 span 成本。任何指標超閾值只停止新服務進入,保留已遷移服務和原始證據。
6. 回滾和生命週期
為每個服務保留 tracer 初始化開關、依賴版本和設定快照。回滾只切換該服務的入口或匯出路由,避免刪除共享 Collector 中的資源。遷移完成後刪除 shim 依賴前,先確認沒有下游庫仍透過全局 tracer 取得上下文,並保留一段時間的相容監控。
高品質示範回答
我會先凍結新增 OpenTracing 相容開發,建立呼叫、語義、傳播和匯出清單。原生 OpenTelemetry API 逐服務接入,暫時不能修改的庫繼續經 shim 運行;Context、採樣和屬性映射用契約測試固定。雙寫只在 SDK/出口做限額分流,觀察 trace 連續性、屬性覆蓋、Collector 佇列、延遲和成本。按語言和依賴拓撲灰度,失敗時關閉單服務的新路徑並恢復舊出口,保留設定、事件和對照資料;全部服務穩定後才刪除 shim。
常見錯誤
- 只替換 import → parent、baggage 或屬性語義改變 → 用傳播和語義契約測試驗證。
- 每處業務程式碼雙寫 → span 數量與成本失控 → 在 SDK/出口集中分流並限額。
- 只看 Collector 成功率 → 應用端已遺失 span → 區分生成、排隊、匯出和後端落庫指標。
- 一次遷移所有服務 → 故障域過大 → 按語言和依賴拓撲灰度。
- 立即刪除 shim → 未遷移庫無法啟動 → 先凍結新增依賴,確認引用清零再刪除。
追問及應對
為什麼不能要求所有團隊同時改成原生 API?
共享庫、發布節奏和語言 SDK 不同會造成大爆炸半徑。分層相容允許業務持續運行,同時把新能力集中到原生 API。
如何證明沒有遺失 trace?
用可重複請求注入穩定標識,比較入口、服務間傳播、Collector 接收和後端查詢的計數,並抽樣核對 parent、status 和關鍵屬性。
雙寫會不會改變採樣結果?
會。兩個 tracer 若各自採樣,鏈路可能斷裂或成本翻倍。應在共享上下文中決定採樣,並讓分流繼承同一決定。
什麼時候可以刪除相容層?
當依賴掃描確認沒有 OpenTracing 入口,契約測試覆蓋傳播與語義,灰度指標達到門檻,且保留窗口內無回退事件時,再刪除並保留設定審計。