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

相关文章
相关标签/搜索