Spring Cloud 參考文檔(Spring Cloud Sleuth抽樣)

Spring Cloud Sleuth抽樣

採樣可用於減小收集和報告的進程外數據,若是未對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中的採樣

默認狀況下,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 header X-B3-Flags設置爲 1,或者在進行消息傳遞時,能夠將 spanFlags header設置爲 1,這樣作會強制導出當前span,而無論採樣決策如何。

爲了使用速率限制採樣器,請設置spring.sleuth.sampler.rate屬性以選擇每秒間隔接受的trace量,最小數字爲0,最大值爲2,147,483,647(最大int)。url

相關文章
相關標籤/搜索