當前位置: 妍妍網 > 碼農

網易雲音樂為何選Pinpoint來建服務監控系統?

2024-03-08碼農

雲音樂服務監控系統(代號:Pylon APM)為業務提供服務監控、鏈路追蹤、治理分析、問題診斷等能力,本文介紹了平台建設中的一些實踐經驗。

一、背景介紹

雲音樂伺服端原有的伺服端套用監控體系,存在很多痛點和問題,導致出現線上問題時,定位的效率不太理想。伺服端套用監控體系主要存在以下幾個問題:

  • Trace鏈路完整性問題: 老的trace是透過元件sdk埋點的形式,進行trace的記錄與輸出,導致了trace的完整性依賴埋點邏輯,如果鏈路埋點處理不正確,會出現上下文異步透傳遺失,trace數據沖突混亂的問題。同時,對於異常的非采樣鏈路,在采集時,無法回溯上遊來源,經常出現定位資訊不足的問題。

  • Trace與Metric割裂問題: trace與metric之間缺少數據關聯,metric服務監控數據依賴其他平台,導致慢請求,慢sql之類的問題場景定位時,找不到具體發生問題的trace。線上發生異常錯誤指標報警時,很難找到對應的錯誤鏈路,定位問題效率低下。

  • Trace與日誌聯動問題: 業務服務產生ERROR日誌時,有追溯異常呼叫的來源的需求。低取樣率的線上場景,只能找到日誌,而找不到請求的具體鏈路,對問題排查幫助很小。

  • 版本升級叠代困難: 版本升級依賴業務服務升級sdk,推進困難,功能叠代效率低。

  • 開源計畫中Pinpoint和SkyWalking都是目前比較成熟的鏈路追蹤方案,兩者各有優劣,在對比中,我們發現Pinpoint與雲音樂的鏈路模型更加接近,外掛程式開發也更加友好,並且國內有多個基於Pinpoint的商業化落地計畫,穩定性有保障。

    最終我們選擇基於Pinpoint開源方案,進行了深度的自研改造和最佳化,希望達成以下目標:

  • 業務服務解耦: Java Agent形式實作套用監控功能,與服務程式碼完全解耦,業務無感知接入,無感知升級。外掛程式化實作,能夠在管控平台透過開關動態控制細粒度功能的開關。

  • 保證鏈路完整性: 透過異步上下文管理無感知解決了鏈路異步透傳的問題,保證trace透傳的完整性。同時透過TailBased方案,實作了異常錯誤鏈路完整采樣的能力,最大限度的保證鏈路問題定位有效性。

  • 整合Metric能力: 透過整合prometheus元件,實作了套用服務監控的能力,開發相比哨兵監控項更加簡單。同時實作了Metric監控聯通Trace的能力,對於指定監控指標,能夠根據監控值檢索對應Trace。

  • 問題快速診斷: 不論是異常日誌,還是錯誤、長耗時呼叫,都能透過後設資料或監控數據關聯到完整的鏈路,在平台快速下鉆,提升問題定位效率。

  • 問題診斷工具: 提供自動異常現場采集能力,整合白屏化診斷工具,完善問題分析能力。

  • 二、計畫思路與方案

    1.計畫整體架構

    主要分為Agent和Console兩個部份,Agent主要負責Trace生成與傳遞,Metric記錄與上報,實作了一套字節碼註入工具,以及數據處理框架,再透過外掛程式化的形式,實作不同元件的trace與metric能力。Console主要負責數據的收集與儲存,分析與展示,將Trace,metric,log聯動的數據模型,透過鏈路問題定位能力串聯起來,實作快速的問題診斷。

    2.基於Pinpoint開發的Java Agent

    開源的Pinpoint實作了外掛程式化的Trace能力,並且實作了很多常用的中介軟體的外掛程式,但是開源Pinpoint Agent依舊存在以下問題:

  • Trace模型過於簡單,對於部份Trace使用場景無法很好支持(比如訊息佇列多個消費者的場景,消費者之間無法區分),支持的鏈路型別有限,後設資料管理不方便。

  • 上下文透傳能力支持不足,Trace上下文因為支持透傳,很多時候業務上下文,可以復用這部份能力,不需要重復開發,Pinpoint這塊支持不足。

  • 異常鏈路回溯采樣不完整,對於非采樣鏈路,出現異常時,無法回溯采集上遊,定位效率會大打折扣。

  • 不支持Metric能力,無法關聯監控數據,浪費了切面中的數據與狀態結果。

  • 1)擴充套件Trace數據模型

    基於Pinpoint Trace-Span-SpanEvent的模型,擴充套件了部份關聯欄位和透傳欄位,使得Trace能夠支持多下遊關聯,異步下遊關聯,異步回呼關聯等能力。在上下文透傳上,支持行程內欄位透傳,跨行程欄位透傳,跨行程欄位反向透傳,並提供專門的透傳sdk供接入方使用。

    2)異常鏈路後置采樣

    鏈路上發生單點異常時,如果只是把異常點及其下遊鏈路采集上來是比較容易的,但是這樣帶來的問題定位收益並不高,很多時候不知道上遊來源的話,問題定位無法繼續下去。為了解決異常鏈路完整采樣的問題,我們實作了一套TailBased的異常鏈路采集能力。具體方案示意如下圖:

    每個服務節點上,對於短時間內的Trace,會先全量輸出到一個全量日誌中,當鏈路上發生異常時,對應服務的Agent會將異常TraceId寫入到中心化緩存中,並在Trace上下文資訊中帶上標記。獨立的Tail執行緒會以一個穩定的延遲(30s~1min),掃描全量日誌中的trace數據,發現存在於緩存中的異常TraceId後,將該TraceId關聯的鏈路數據寫入到最終的采集日誌中,實作完整的鏈路采集。

    3)Prometheus監控整合

    我們在Agent端整合Prometheus sdk,用以記錄和輸出監控數據,伺服端透過Pull請求定時拉取每台服務上的監控數據,進行數據的預聚合,最終寫入到vm storage儲存中。監控數據在記錄過程中,還會與當前TraceId進行關聯,輸出到關聯日誌中,保證每項監控數據,都有一定的Trace鏈路數據進行關聯定位與分析。關聯示意圖如下所示:

    4)自動Jstack采集

    線上服務在發生問題時,經常要面對抓不到現場的情況。我們對於有可能出現服務阻塞的場景,啟動了異步監聽任務。當呼叫方法執行時間超出設定閾值時,對當前執行緒執行一次Jstack堆疊采集,將當前的執行現場保存下來,同時關聯TraceId和方法監控指標,便於追溯。流程示意圖如下:

    3.APM產品設計

    開源的Pinpoint內建了pinpoint-web管控界面並不能滿足我們的需求,我們重新開發了一套APM平台,以套用為中心視角,劃分不同維度的監控指標,再到不同監控視角下,透過Trace,Metric,Log聯動,來幫助快速定位線上問題,APM平台主要具備以下幾個能力。

    1)鏈路詳情診斷

    完整的展示從請求入口到下遊所有節點的呼叫拓撲關系,以及請求耗分時布資訊,是鏈路詳情的基本功能。為了定位關鍵透傳欄位遺失的情況,驗證鏈路上下文正確與否,平台鏈路詳情中還包含透傳欄位以及部份請求參數,使用者可以選擇全域視角或行程視角檢視呼叫棧,狀態參數幫助快速定位到異常節點。

    在鏈路詳情頁可以檢視關聯的日誌資訊,實作與日誌聯動定位問題。

    單個呼叫介面的詳情頁中,除了行程內呼叫棧,還有監控資訊聯動。

    2)套用監控圖表

    平台以套用視角為中心,利用Agent整合的監控數據采集,構建了監控圖表大盤,透過不同的後設資料分類,平台支持HTTP,RPC,訊息,資料庫,緩存等各個獨立視角的監控數據,以大盤曲線結合表格下鉆的形式展現。

    大盤圖表在Grafana基礎上,做了二次開發,支持同環比分析,多例項比較等實用的數據分析功能。


    3)異常錯誤長耗時關聯分析

    為了解決目前尋找異常監控點相關鏈路時,找不到可用鏈路,導致問題定位進展困難的問題。我們平台打通了監控數據與關聯的TraceId,讓使用方能夠快速的找到關聯鏈路,推進問題定位。平台提供了監控大盤圖表,以及相關的下鉆鏈路檢索,使用者可以在界面上定向檢索關聯的異常鏈路TraceId,每個TraceId下鉆後,會到達詳細的Trace詳情頁。


    4)耗時請求Jstack追蹤

    觸發了自動Jstack采集的方法,在平台上會給出提示文案。每個具體的Jstack采集結果,有詳細的堆疊資訊,關聯的Trace上下文資訊以及執行緒池資訊。除開自動Jstack采集,平台還支持主動下發Jstack請求,主動抓取現場。

    5)Arthas線上診斷

    平台還整合了Jstack,Arthas等使用頻率較高的定位工具。透過Agent連線,使用者可以在平台上使用工具直接對服務進行資訊采集。采集結果被收集後,平台提供更友好的展示和進一步分析的能力。


    三、計畫總結

    在計畫的開發學習過程中,我們積累沈澱了一些線上問題定位的方法論,總結了很多針對伺服端問題定位的流程與工具。我們希望能夠將這部份經驗透過產品的形式呈現出來,來幫助面對問題無從下手的同學,透過路徑引導快速得到問題資訊。對於有一定問題定位經驗同學,提供更加易用,更加高效定位工具,打通定位流程上的各個環節。最終達到快速定位發現線上問題,快速止血的目標。

    當然,線上服務治理不是光靠單一平台就能完全覆蓋的,Pylon大平台下還提供了業務日誌、監控分析、告警治理、場景事件等多個子平台,來幫助我們更好地進行線上服務治理。我們會在後續的文章中,逐一介紹這些平台的建設實踐。

    作者丨 碧海(蔣星韜)

    來源丨公眾號: 網易雲音樂技術團隊 (ID: gh_e0a72742f973

    dbaplus社群歡迎廣大技術人員投稿,投稿信箱: [email protected]