Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式服務(wù)跟蹤(抽樣收集)
通過Trace ID和Span ID已經(jīng)實(shí)現(xiàn)了對(duì)分布式系統(tǒng)中的請(qǐng)求跟蹤,而這些記錄的跟蹤信息最終會(huì)被分析系統(tǒng)收集起來,并用來實(shí)現(xiàn)對(duì)分布式系統(tǒng)的監(jiān)控和分析功能,比如:預(yù)警延遲過長(zhǎng)的請(qǐng)求鏈路、查詢請(qǐng)求鏈路的調(diào)用明細(xì)等。此時(shí),我們?cè)趯?duì)接分析系統(tǒng)時(shí)就會(huì)碰到一個(gè)問題:分析系統(tǒng)在收集跟蹤信息的時(shí)候,需要收集多少量的跟蹤信息才合適呢?
理論上來說,我們收集的跟蹤信息越多就可以更好的反映出系統(tǒng)的實(shí)際運(yùn)行情況,并給出更精準(zhǔn)的預(yù)警和分析,但是在高并發(fā)的分布式系統(tǒng)運(yùn)行時(shí),大量的請(qǐng)求調(diào)用會(huì)產(chǎn)生海量的跟蹤日志信息,如果我們收集過多的跟蹤信息將會(huì)對(duì)我們整個(gè)分布式系統(tǒng)的性能造成一定的影響,同時(shí)保存大量的日志信息也需要不少的存儲(chǔ)開銷。所以,在Sleuth中采用了抽象收集的方式來為跟蹤信息打上收集標(biāo)記,也就是我們之前在日志信息中看到的第四個(gè)boolean類型的值,它代表了該信息是否要被后續(xù)的跟蹤信息收集器獲取和存儲(chǔ)。
在Sleuth中的抽樣收集策略是通過Sampler接口實(shí)現(xiàn)的,它的定義如下:
- public interface Sampler {
- /**
- * @return true if the span is not null and should be exported to the tracing system
- */
- boolean isSampled(Span span);
- }
通過實(shí)現(xiàn)isSampled方法,Spring Cloud Sleuth會(huì)在產(chǎn)生跟蹤信息的時(shí)候調(diào)用它來為跟蹤信息生成是否要被收集的標(biāo)志。需要注意的是,即使isSampled返回了false,它僅代表該跟蹤信息不被輸出到后續(xù)對(duì)接的遠(yuǎn)程分析系統(tǒng)(比如:Zipkin),對(duì)于請(qǐng)求的跟蹤活動(dòng)依然會(huì)進(jìn)行,所以我們?cè)谌罩局羞€是能看到收集標(biāo)識(shí)為false的記錄。
默認(rèn)情況下,Sleuth會(huì)使用PercentageBasedSampler實(shí)現(xiàn)的抽樣策略,以請(qǐng)求百分比的方式配置和收集跟蹤信息,我們可以通過在application.properties中配置下面的參數(shù)對(duì)其百分比值進(jìn)行設(shè)置,它的默認(rèn)值為0.1,代表收集10%的請(qǐng)求跟蹤信息。
- spring.sleuth.sampler.percentage=0.1
在開發(fā)調(diào)試期間,通常會(huì)收集全部跟蹤信息輸出到遠(yuǎn)程倉(cāng)庫(kù),我們可以將其值設(shè)置為1,或者也可以通過創(chuàng)建AlwaysSampler的Bean(它實(shí)現(xiàn)的isSampled方法始終返回true)來覆蓋默認(rèn)的PercentageBasedSampler策略,比如:
- @Bean
- public AlwaysSampler defaultSampler() {
- return new AlwaysSampler();
- }
在實(shí)際使用時(shí),通過與Span對(duì)象中存儲(chǔ)信息的配合,我們可以根據(jù)實(shí)際情況做出更貼近需求的抽樣策略,比如實(shí)現(xiàn)一個(gè)僅對(duì)包含指定Tag的抽樣策略:
- public class TagSampler implements Sampler {
- private String tag;
- public TagSampler(String tag) {
- this.tag = tag;
- }
- @Override
- public boolean isSampled(Span span) {
- return span.tags().get(tag) != null;
- }
- }
由于跟蹤日志信息的數(shù)據(jù)價(jià)值往往僅在最近的一段時(shí)間內(nèi)非常有用,比如:一周。那么我們?cè)谠O(shè)計(jì)抽樣策略時(shí),主要考慮在不對(duì)系統(tǒng)造成明顯性能影響的情況下,以在日志保留時(shí)間窗內(nèi)充分利用存儲(chǔ)空間的原則來實(shí)現(xiàn)抽樣策略。
完整示例:
讀者可以根據(jù)喜好選擇下面的兩個(gè)倉(cāng)庫(kù)中查看trace-1和trace-2兩個(gè)項(xiàng)目:
Github:https://github.com/dyc87112/SpringCloud-Learning/
Gitee:https://gitee.com/didispace/SpringCloud-Learning/
【本文為51CTO專欄作者“翟永超”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過51CTO聯(lián)系作者獲取授權(quán)】

























