具代表性的面試主題

資料工程面試:如何為 OpenTelemetry 指標設計基數預算?

資料困難
Offer.cc 編輯團隊發佈 更新

題幹

一個服務準備接入 OpenTelemetry,團隊想把 user_id、request_id 和 URL 全部作為指標屬性。請設計基數預算,說明哪些欄位保留、超限時如何處理,以及如何證明告警仍然有用。

題幹與適用場景

一個服務準備接入 OpenTelemetry,團隊想把 userid、requestid 和 URL 全部作為指標屬性。請設計基數預算,說明哪些欄位保留、超限時如何處理,以及如何證明告警仍然有用。

OpenTelemetry 指標由屬性組合形成時間序列;SDK 的 cardinality limit 是每個指標在一次收集週期內可追蹤的指標點上限。高基數欄位會放大記憶體、匯出、儲存和查詢成本,因此預算必須同時保護成本與診斷價值。

面試官考察點

面試官會看你是否能區分指標、日誌和 trace 的適用維度,理解屬性組合而非單欄位數量,設計硬上限和降級策略,並用服務圖、告警、取樣和去識別化約束證明方案可營運。

回答前需要釐清的問題

先確認指標用途、查詢窗口、告警延遲、租戶規模、端點數量、收集週期、後端保留期限和預算。再確認是否已有 trace/log 關聯欄位、哪些身份欄位受隱私限制,以及超限時更重視新值、舊值還是聚合準確性。

30 秒回答框架

「我先按指標用途定義允許的維度,不把所有上下文都塞進指標。保留穩定、低基數且能分組告警的欄位,例如服務、區域、路由模板和狀態類;userid、requestid 和原始 URL 放到 trace 或日誌。為每個指標設定 cardinality limit、成本告警和超限觀測,選擇有解釋性的聚合或丟棄策略。最後用歷史流量回放驗證告警召回、誤報、查詢成本和隱私要求。」

分步驟深入解答

第一步:定義指標問題

先寫出要回答的問題:錯誤率是否升高、哪個路由受影響、某區域是否退化,還是某個使用者的單次請求細節。前幾類適合指標,最後一類通常由 trace 或日誌提供。

第二步:估算組合基數

基數是屬性組合形成的唯一集合,不是每個屬性取值數量簡單相加。估算服務、區域、路由模板、狀態碼、方法和租戶等級的乘積,再用真實分布、長尾和突發流量校正。

第三步:建立欄位分層

保留穩定且可聚合的欄位;把使用者、請求和完整 URL 放入 trace/log;對高基數租戶標識採用分桶、雜湊或取樣,前提是仍符合存取控制和調查需求。不要用原始路徑參數製造無限新序列。

第四步:配置 SDK 與後端預算

在 SDK、Collector、時序後端和查詢層分別設定預算,避免只在最後一層截斷。OpenTelemetry 的指標 cardinality limit 是硬上限,具體保留哪些屬性集合必須在實作和告警中可觀察。

第五步:設計超限行為

明確超限時保留哪些屬性組合、是否回退到溢出桶、是否丟棄新集合,以及如何計數。策略要穩定、可解釋,並向維運發出「預算耗盡」信號,不能靜默丟資料。

第六步:把關聯性放到正確信號

用 traceid 關聯單次請求,用日誌保存原始 URL 或 userid,並透過 exemplars 或連結從指標跳到樣本。指標負責趨勢和告警,不能取代逐請求診斷。

第七步:管理服務圖與成本

服務圖和自動儀表化可能產生多組指標。為邊、用戶端、伺服器端和異常狀態設定獨立預算,控制匯出頻率、保留期和高基數屬性。成本報表應按服務和指標歸因,而不是只看總量。

第八步:驗證告警品質與隱私

用歷史回放和故障注入比較有無預算時的召回、誤報、延遲和查詢成本。檢查去識別化、存取控制、刪除請求和跨租戶隔離,驗證超限事件、配置變更和資料遺失都可追蹤。

高品質示範回答

我會先把問題分成趨勢告警和單請求調查。服務、區域、路由模板、方法和狀態類通常穩定且低基數,適合作為指標屬性;userid、requestid 和帶參數 URL 不放在指標中,而透過 trace、日誌和 exemplars 關聯。估算屬性組合乘積並用真實長尾修正,為 SDK、Collector 和後端設定 cardinality limit 與成本預算。超限時採用明確溢出或丟棄規則,記錄預算耗盡指標,不能靜默失敗。服務圖邊、用戶端和異常狀態分別設預算,控制收集頻率與保留期。上線前用歷史流量回放和故障注入比較告警召回、誤報、查詢成本、隱私和跨租戶隔離,確認預算不會掩蓋關鍵故障。

常見錯誤

只計算單欄位取值數量

指標序列由屬性組合形成,多個中等基數欄位相乘後也可能爆炸。必須估算組合、長尾和突發,不是逐欄看起來都可接受。

把 user_id 放進所有指標

使用者級調查更適合 trace 和日誌。把身份標識放進指標會增加成本、隱私風險和查詢噪音。

超限時靜默丟棄

靜默遺失會讓告警看似正常。要記錄預算耗盡、保留規則和配置版本,並驗證降級後的診斷能力。

延伸追問與參考答案

路由模板和完整 URL 應如何區分?

指標使用規範化路由模板,避免每個路徑參數產生新序列;完整 URL 放到受控日誌或 trace,並按隱私策略去識別化。

cardinality limit 觸發時應保留舊值還是新值?

取決於告警目標和聚合器,但必須固定、可解釋且可觀察。記錄溢出計數,避免不同實例採用不一致規則。

如何關聯指標、trace 和日誌?

使用 traceid、spanid 或 exemplars 連結樣本;指標保留穩定維度,日誌和 trace 承擔逐請求上下文,並在權限邊界內跳轉。

服務圖為什麼需要獨立預算?

自動產生的邊、用戶端和異常維度會成倍增加序列。按邊類型、收集頻率和保留期拆分預算,避免服務圖擠占業務指標。

如何證明預算沒有隱藏故障?

回放真實流量並注入高基數、錯誤峰值和租戶長尾,比較預算前後的召回、誤報、延遲和查詢結果,同時觀察預算耗盡事件。

什麼時候應增加日誌而不是指標?

當問題需要單次請求、原始輸入或使用者級上下文時,增加受控日誌或 trace;指標只承載可聚合的趨勢和告警維度。

公開來源

同類題目