對於絕大多數分布式系統,不是每一條調用鏈都值得被可觀測平台記錄,因為其中包含大量重複、低關注度資訊。調整採樣是目前解決這類問題最高效且主流的方式,但具體配置什麼樣的採樣策略,能夠在可控的資源開銷和費用成本內,最大程度保證錯、慢、異常等鏈路被採集,從而最大限度保障效能監控和問題排查的使用需求。本文將重點圍繞不同業務情境下如何配置最合適的調用鏈採樣策略以達到成本最優、效果最佳的目的。
概述
隨著越來越多的企業步入數字化轉型,IT系統也逐步向分布式、微服務化發展。在分布式系統中,隨著各種中介軟體的引入,讓原本就非常複雜的商務邏輯更加複雜,調用鏈路也越來越深。為了能夠在分布式系統中清晰直觀的展示調用關係並精確定位問題的案發現場,分布式鏈路追蹤技術應運而生,可提供端到端的即時可觀測能力。
下圖是由ARMS調用鏈分析功能呈現的可視化調用鏈路,對於一條完整調用鏈路,通常用Trace來表示,一個Trace描述一次請求在(多個)服務中經過的路徑。繼續細分,每個路徑均可稱為Span,Span代表一個過程,它可以是一次RPC調用、中介軟體調用,也可以是一個for迴圈邏輯。

當業務量級不斷增長,鏈路資料也會隨之增多,簡單算一下,如果某個鏈路的調用量4000 QPS,每個調用產生大概30個Span,每個Span大約500 Bytes,那一天產生的資料就是:4000×30×500(Bytes)×24(Hours)=4.7(TiB)。
如果有100個調用鏈路入口需要被全量採集,那每天就能產生400 TiB 資料。不可否認,調用鏈被全量採集後,出現突髮狀況時都可以找到對應的完整請求鏈路並進行問題排查定位。但是我們也無法忽視調用鏈全量採集帶來的網路I/O 、鏈路處理、效能損耗、資料存放區等可觀測費用成本。
常用採樣方案介紹
通過大量實踐發現,無論從計算、儲存資源成本消耗上進行分析,還是從具體使用情境角度評估,都不一定需要收集所有埋點資料。因此,分布式鏈路追蹤系統支援按照一定策略上報資料,取得成本與收益之間的平衡,提高投入產出比。按照採樣決策時機的不同可以分為3種典型採樣策略:
頭部採樣:Head-based sampling
頭部採樣是在用戶端就決定該鏈路是否採樣,為了保證採樣的連貫性,每條調用鏈都是在鏈路的入口服務就決定是否需要採樣。這種採樣演算法對每個請求基本上都有平等的採樣機率。優勢是能夠有效減少鏈路開銷和資料成本,缺點是採樣決策發生在端側,命中錯、慢或異常的鏈路機率可能較低。
尾部採樣:Tail-based sampling
尾部採樣是每條調用鏈都是在調用完成後,在服務端根據規則決定這條調用鏈是否需要被採樣,所以需要將鏈路資訊進行緩衝,在決定是否採樣之後才儲存資料或丟棄資料,以保證資料的連貫性。優勢是可在服務端精準篩選錯、慢或異常的鏈路便於進行任意時刻的問題排查診斷,缺點是鏈路開銷和資料成本高。
單元採樣:Unitary sampling
單元採樣是一種非連貫的採樣機制,每條調用鏈分別由每個Span所屬服務決定其資料是否採樣上報。這種採樣機制由每個服務決定自身的鏈路採樣情況,因此上報的鏈路資料不是完整的。
應用即時監控服務ARMS重點在頭部採樣方案的基礎上,在錯慢鏈路、介面層級、流量自適應等維度做了較多增強,關於ARMS調用鏈採樣規則說明,請參見調用鏈取樣模式選擇(3.2.8以下探針版本)。
基於業務情境制定最優採樣策略
不同採樣策略各有優劣,在實際業務情境中通常很難通過單一採樣策略做到效果與成本的平衡,需要綜合評估業務情境、觀測需求和費用成本,因地制宜配置最適合的採樣策略,例如核心應用、核心鏈路需要儘可能多採集,特別是對於異常鏈路的命中率,對於一些旁路服務或邊緣應用則可以從成本考慮少採集甚至不採集。除了日常監控營運情境外,重大事件保障期間或新版本發布灰階期間,則需要從穩定性和應急響應角度評估採樣方案,必要時可配置為全量採樣策略。
以下將從ARMS調用鏈採樣規則、成本控制和鏈路價值最大化的角度分析幾種典型業務情境下的採樣策略:
基於成本控制角度考慮,從鏈路入口應用維度調整採樣率,控制整體鏈路資料量
頭部採樣的機制是由入口應用決定該條調用鏈是否被採樣,如果入口應用的根 Span 被決策採樣,那麼鏈路資訊將會逐級傳遞從而保證被採樣鏈路的完整性,這個過程包括跨應用傳遞的情境。針對某個指定商務邏輯,調用鏈的層級相對明確,所以入口應用的請求數和採樣率直接決定了整體觀測應用被採集和上報的資料量,如果按照 ARMS 最新的按照可觀測資料量計費方案,也將直接影響整體的產品使用費用。
如圖,入口應用A對應的完整鏈路為:A - 1 - 3 - 4,入口應用B對應的完整鏈路為:B - 2 - 4,這裡調用關係僅根據Top N介面固定機率採樣後抽象到應用粒度進行說明,實際應用內不同介面調用鏈路會有所差異。
1、2、3、4作為整個應用拓撲中的下遊應用,其被採樣的鏈路資料絕大部分都由其上遊決定,所以從成本控制的角度考慮,通過調整應用A和B的採樣率可較為明顯的控制整體的可觀測資料擷取量。另外從鏈路價值角度來看,絕大部分調用鏈都是重複且雷同的,一個問題出現,除非是毛刺型偶發異常,不然異常表現也將會在多條調用鏈中重複出現,那麼也就會以固定機率被採集到。所以通過降低入口應用的採樣率,特別是請求數較高的入口應用,其帶來的成本優勢是遠大於縮減調用鏈數量而引起的鏈路價值降低的。例如,調用鏈採樣率由10%降低為5%,其鏈路資料對應的費用成本是減半的,但是鏈路價值並不會縮減一半,因為對於線上生產環境應用來說,出現錯、慢、異常鏈路通常是小機率事件。
ARMS支援應用層級設定固定機率採樣策略,使用者可以根據自身應用對應的商務邏輯,調整入口應用的調用鏈採樣率,典型的入口應用有網關類應用、代理類應用、核心上遊應用等。
您可以在ARMS控制台指定應用下頁面的採樣設定地區調整固定採樣率。更多資訊,請參見固定採樣率。

同時ARMS也提供全域維度採樣率自訂調整,ARMS通過探針標識每個應用的根Span,服務端計算出基於根Span數量的入口應用並按照鏈路資料量進行排序,使用者可快速通過頁面對Top N入口應用進行統一的採樣率調整。
基於核心業務多採集角度考慮,針對核心介面定向配置高比例採樣率
接入可觀測的諸多應用中,一般會根據業務屬性區分核心應用和非核心應用;對於單個應用內,也有核心介面和非核心介面的區別。例如電商系統中,商品詳情和購買流程的商務邏輯是比查詢或編輯使用者資訊的優先順序高,對於這類商務邏輯對應的後端介面,是需要被優先採集以便確保重要的、難以快速複現的鏈路故障能夠被立刻分析和解決。所以這類介面對應的調用鏈採樣率建議配置較高比例,甚至是100%比例採樣。
ARMS支援介面粒度的採樣策略,使用者可以根據自身業務需求,配置介面粒度的自訂採樣策略。每條介面粒度的採樣策略可以按照固定比例或者固定流量採樣。
您可以在ARMS控制台指定應用下頁面的採樣率設定地區設定介面粒度的自訂採樣策略。

與之配合的,針對非核心應用或非核心介面,則可按需降低對應的採樣率,從而實現鏈路價值和成本優勢最大化。
基於大、小流量均可控採集角度考慮,採用流量自適應採樣方案
對於商務邏輯較為複雜的應用來說,單個應用內提供的介面通常較多,如果按照手動方式對不同類型介面進行自訂採樣策略配置會帶來不小的營運負擔,且介面的調用情況會隨著外部業務變化而有較大差異,特別對於一些小流量的介面,從業務價值來說非常重要,如果出錯將會影響整條關鍵鏈路,例如一些調度類介面,但是這些介面在實際運行過程中被調用頻次較低。如果按照應用維度固定機率採樣,則會被請求數較多的介面擠占被採樣的機率,如果按照介面粒度配置採樣策略,則需要人為梳理這些小流量介面進行精準配置,帶來較大營運成本。
ARMS為了進一步降低使用和營運成本,提供了應用層級自適應取樣模式。與固定採樣率不同,自適應採樣通過引入多項採樣命中策略,動態決定是否對一條鏈路進行採樣,從而解決固定採樣率在小採樣率下的覆蓋度問題以及大採樣率下的成本問題。
自適應採樣涉及的主要命中策略包括特定介面全採樣、介面Top N採樣、小流量兜底採樣三種。
特定介面全採樣指您可以通過自訂介面名、介面前尾碼,來標記需要100%採樣的介面。對於這些介面收到的請求,會觸發整條鏈路的100%採樣。由於特定介面全採樣會造成採集資料量的大幅增加,請確保只對最重要的介面開啟,或在必要的時候臨時開啟。
介面Top N採樣使用變種LFU演算法實現,在單位時間內只對每個介面的有限條目請求進行採樣,其目的是為了保證資料擷取規模不隨介面的實際流量而線性增長。
小流量兜底採樣是指在單位時間內,每個介面都至少保證有1次採樣。這樣可以在流量比較低的時候,對每個業務介面都確保記錄最有價值的特徵資訊。
您可以在ARMS控制台指定應用下頁面的採樣設定地區設定自適應採樣策略。更多資訊,請參見自適應採樣。

基於重保角度考慮,特定時間段全採樣
營運過程中也經常會面臨重大事件保障的情境,比如大促、新版本壓測等,需要針對某一類標籤的資料甚至全部應用開啟全量資料擷取和儲存,以便出現問題或者故障時,可以快速定位,甚至影響審計和定責。那麼,在這些特定時間段內我們建議開啟調用鏈100%全量採集,等到重保時間段過去後再重新把採樣策略調整為日常態策略,從而緩解全采帶來效能損耗和成本壓力。
ARMS支援調用鏈採樣配置模板化能力,滿足不同情境切換生效不同配置模板的需求。更多資訊,請參見將配置複製到其他應用。
相關文檔
調用鏈採集完成後,您可以基於已儲存的全量鏈路詳細資料,自由組合篩選條件與彙總維度進行即時分析。更多資訊,請參見調用鏈分析。