採樣可用於減小收集和報告的進程外數據,若是未對span進行抽樣,則不會增長任何開銷(noop)。java
抽樣是一個前期決策,這意味着報告數據的決定是在trace中的第一個操做中作出的,而且該決策是向下遊傳播的。spring
默認狀況下,全局抽樣器將單個速率應用於全部跟蹤的操做,Tracer.Builder.sampler
控制此設置,默認爲跟蹤每一個請求。api
某些應用程序須要根據java方法的類型或註解進行採樣。框架
大多數用戶使用框架攔截器來自動執行此類策略,如下示例顯示了內部可能如何工做:ide
@Autowired Tracer tracer; // derives a sample rate from an annotation on a java method DeclarativeSampler<Traced> sampler = DeclarativeSampler.create(Traced::sampleRate); @Around("@annotation(traced)") public Object traceThing(ProceedingJoinPoint pjp, Traced traced) throws Throwable { // When there is no trace in progress, this decides using an annotation Sampler decideUsingAnnotation = declarativeSampler.toSampler(traced); Tracer tracer = tracer.withSampler(decideUsingAnnotation); // This code looks the same as if there was no declarative override ScopedSpan span = tracer.startScopedSpan(spanName(pjp)); try { return pjp.proceed(); } catch (RuntimeException | Error e) { span.error(e); throw e; } finally { span.finish(); } }
根據操做的不一樣,末可能但願應用不一樣的策略,例如,你可能不但願跟蹤對靜態資源(如圖像)的請求,或者你可能但願跟蹤對新api的全部請求。oop
大多數用戶使用框架攔截器來自動執行此類策略,如下示例顯示了內部可能如何工做:測試
@Autowired Tracer tracer; @Autowired Sampler fallback; Span nextSpan(final Request input) { Sampler requestBased = Sampler() { @Override public boolean isSampled(long traceId) { if (input.url().startsWith("/experimental")) { return true; } else if (input.url().startsWith("/static")) { return false; } return fallback.isSampled(traceId); } }; return tracer.withSampler(requestBased).nextSpan(); }
默認狀況下,Spring Cloud Sleuth將全部span設置爲不可導出,這意味着trace顯示在日誌中,但不顯示在任何遠程存儲中,對於測試,默認值一般就足夠了,若是你只使用日誌(例如,使用ELK聚合器),它可能就是你所須要的所有內容。若是將span數據導出到Zipkin,還有一個Sampler.ALWAYS_SAMPLE
設置能夠導出全部內容,還有一個ProbabilityBasedSampler
設置能夠對固定比例的span進行採樣。ui
若是你使用spring-cloud-sleuth-zipkin
,則ProbabilityBasedSampler
是默認值,您能夠經過設置spring.sleuth.sampler.probability
來配置導出,傳遞的值必須是從0.0到1.0的雙精度值。
能夠經過建立bean定義來安裝採樣器,如如下示例所示:this
@Bean public Sampler defaultSampler() { return Sampler.ALWAYS_SAMPLE; }
你能夠將HTTP headerX-B3-Flags
設置爲1
,或者在進行消息傳遞時,能夠將spanFlags
header設置爲1
,這樣作會強制導出當前span,而無論採樣決策如何。
爲了使用速率限制採樣器,請設置spring.sleuth.sampler.rate
屬性以選擇每秒間隔接受的trace量,最小數字爲0
,最大值爲2,147,483,647(最大int)。url