4. 采样

可以采用抽样来减少在进程外收集和报告的数据。 当 span 未采样时,它不会增加开销 (noop)。spring-doc.cn

采样是一个预先决定,这意味着报告数据的决定是在跟踪中的第一次操作时做出的,并且该决定会传播到下游。spring-doc.cn

默认情况下,全局采样器将单个速率应用于所有跟踪的操作。 控制此设置,并且默认跟踪每个请求。Tracer.Builder.samplerspring-doc.cn

4.1. 声明式采样

某些应用程序需要根据 java 方法的类型或注释进行采样。spring-doc.cn

大多数用户使用框架拦截器来自动化此类策略。 以下示例显示了它在内部的工作原理:spring-doc.cn

@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();
  }
}

4.2. 自定义采样

根据操作的内容,您可能需要应用不同的策略。 例如,您可能不想跟踪对静态资源(如图像)的请求,或者您可能希望跟踪对新 API 的所有请求。spring-doc.cn

大多数用户使用框架拦截器来自动化此类策略。 以下示例显示了它在内部的工作原理:spring-doc.cn

@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();
}

4.3. Spring Cloud Sleuth 中的采样

采样仅适用于跟踪后端,例如 Zipkin。跟踪 ID 显示在日志中,无论 采样率。采样是一种防止系统过载的方法,通过持续跟踪一些,但是 不是所有请求。spring-doc.cn

每秒 10 条跟踪的默认速率由该属性控制,当我们知道 Sleuth 用于日志记录以外的原因时适用。使用高于 100 的速率 每秒跟踪数要格外小心,因为它可能会使您的跟踪系统过载。spring.sleuth.sampler.ratespring-doc.cn

sampler 也可以通过 Java Config 设置,如以下示例所示:spring-doc.cn

@Bean
public Sampler defaultSampler() {
    return Sampler.ALWAYS_SAMPLE;
}
您可以将 HTTP 标头设置为 ,或者在执行消息传递时,可以将标头设置为 。 这样做会强制对相应的跟踪进行采样,而不管采样配置如何。X-B3-Flags1spanFlags1