可觀測平臺:滴滴可觀測性的實現

可觀測性(Observability)是近年來備受關注的話題。那什麼是可觀測性?別急,讓我們先從一個常見的場景開始:

你是一個一線開發同學,在某天上班路上收到了一個電話報警,提示某個接口的錯誤數超過了閾值 30。得益於公司監控團隊做的所謂 chatops,幾經周折後,你終於在 IM 中打開了對應的監控圖表,發現當前的錯誤數似乎比之前多了一些。

作爲服務開發者的你,昨天晚上部署了一個新版本,並且依賴的服務好像也做了變更。你開始猜測這個報警是否與你昨晚的上線有關,但怎麼也回憶不起來昨晚依賴服務的變更內容了。

你的組長打電話過來詢問報警的情況。搞不清狀況的你只能回答” 我需要看一下”。你打開電腦連上熱點並登錄上了機器,tail -f xxx.log | grep -E 'error|timeout|code=9527'。一通猛如虎的操作,你發現了問題所在,是你依賴的另一個服務延遲過高導致。和你的上線無關,和昨晚變更的依賴服務也無關。

上述這個場景,很多同學都遇到過。我們從中會發現一些問題:

這些問題如何解決?需要依靠可觀測性。可觀測性在計算機領域目前仍沒有標準的定義,但已經有了一些共識:如果你能從外部,理解一個系統所處的任何狀態,這些狀態不需要是預定義的(例如 9527),它們可能出現過也可能從未出現。當新的狀態出現時,也不需要你重新埋點、發佈新代碼,那麼我們說這個系統就具備了可觀測性。

基於上述對可觀測性的描述,我們從幾個方面簡單比較所熟知的監控與可觀測性,以便大家能夠更直觀地理解它們的區別:

總的來說,可觀測性的目標是爲了讓我們更好地瞭解系統的運行情況,從而能夠更快速地發現和解決問題,提高系統的穩定性。它強調的是全面的、詳細的數據,鼓勵用戶主動去探索和發現,而不僅僅是被動地接收那些我們自己都無法確定閾值的報警通知。

可觀測性實現

上一節我們簡單描述了一下可觀測性優於監控的地方。那如何實現可觀測性?可觀測性期望儘可能多的保留請求上下文,以便探索導致故障(可能是歷史的也可能是新的)的環境和細節狀態。因此可觀測性在信息的豐富程度上,要求比監控高很多,需要用戶暴露更多的信息(例如豐富 Metrics 的 Label),但這樣一來,用戶的成本可能就控制不住了。

畫外:說來說去你不就是要加錢麼?

作者:秀兒同學,請你先坐下。

如果按照一些 SAAS 廠商的推薦做法,上報幾十幾百的維度,每個維度下不限制基數,的確可以達成可觀測性的先決條件。但有 2 個現實問題:

  1. 上報如此豐富的數據,用戶成本將會爆炸性地增長。

  2. 現存的存儲解決方案,很難能扛住如此高維度 + 高基數 + 大量級的數據。

畫外:你就不能自己實現一個麼?

作者:保安在麼,請秀兒同學出去。

除了一些 SAAS 廠商倡導的 high dimensionality, high cardinality 論調外,開源屆更傾向於採用 “曲線救國” 的方式,通過關聯當下主要的觀測信號來實現可觀測性。這些主要的觀測信號包括:Metrics(指標)、Traces(分佈式追蹤)、Logs(日誌)等。關聯論期望關聯 Metrics 的高層次抽象 + Traces 的跨服務的上下文關聯 + Logs 暴露最詳細的 Human-Readable/Acceptable 信息的形式,達到可觀測的目標。

滴滴的可觀測性實現

答案是結合這兩者,以平衡成本、效率和實現可觀測性的目標。在實現上,我們改造了日誌採集和 Metrics 採集的方式,對低基數和高基數維度進行切分,分別存儲到不同的後端存儲中,並建立關聯關係。對用戶暴露其關心的日誌原文、traceID 等信息,從而實現可觀測性。

具體來說,對於日誌採集,在採集端實時分析日誌生成監控曲線的過程中,會按照給定的週期,採樣上報一條日誌原文及其與監控曲線的對應關係。對於 Metrics 採集,需要用戶調用埋點代碼時傳遞額外的參數,告訴我們希望採樣保存的維信息,這個額外維在生產環境中一般會被設置爲 TraceID,它不會出現在 Metrics 曲線的 Label 中,我們每個週期採樣上報一條額外維的信息,及其和監控曲線的對應關係。

滴滴可觀測性產品介紹

可觀測性不僅僅需要在技術層面考慮,更要完善產品以幫助用戶從監控到可觀測性的升級。下面,我們將介紹幾個常用的場景,並結合前文所述,深入感受可觀測性帶來的便利性和可探索性。

報警現場關聯日誌原文

如果配置的策略發出了報警通知,可以直接在 IM 中查看你最熟悉的日誌原文,基於日誌原文進行下一步的決策,無需登錄機器,無需 tail、grep 等。

圖 1: 報警現場關聯日誌原文

曲線看圖關聯日誌原文、TraceID

只是在報警時刻使用還不夠,還可以在看圖時下鑽日誌原文,我們已將提取的日誌原文進行簡單清洗,當識別到 TraceID 時,可以直接跳轉到 Trace 平臺進行上下游服務的排查:

圖 2: 曲線看圖關聯日誌原文、TraceID

結尾

通過建立 Logs、Traces 和 Metrics 這幾個觀測信號的關聯,這套內部稱之爲 MTL 的架構和產品,在滴滴的可觀測體系中發揮着重要作用,使得開發人員和運維團隊可以更加了解其系統的運行狀態,從而更準確地發現問題和進行故障排查,這套系統也得到了衆多用戶的認可和正向評價。希望通過這篇文章,能爲大家提供一些經驗和啓示。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/03YwQyqbT_WO1PXa70ZHJQ