4. Sampling

采样可以用于减少收集和报告的中途数据。 当跨度未被采样时,不会产生任何开销(空操作)。spring-doc.cadn.net.cn

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

默认情况下,全局采样器会对所有跟踪操作应用单一速率。Tracer.Builder.sampler控制此设置,默认情况下会跟踪每个请求。spring-doc.cadn.net.cn

4.1 声明式采样

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

大多数用户使用框架拦截器来自动化此类策略。<br/>下面的例子展示了其内部的工作方式:spring-doc.cadn.net.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. 自定义采样

根据操作的不同,您可能希望应用不同的策略。<br />例如,您可能不希望跟踪对静态资源(如图片)的请求,或者您可能希望跟踪到新 API 的所有请求。spring-doc.cadn.net.cn

大多数用户使用框架拦截器来自动化此类策略。<br/>下面的例子展示了其内部的工作方式:spring-doc.cadn.net.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.cadn.net.cn

缺盜速率为每秒10个近可类始,用 spring.sleuth.sampler.rate属性控制,并在是否知道 Sleuth 被使用的原因除了日志以外时应用。使用高于 100 个近可类始/秒的速率时需要很深刻,因为它可能会对你的路线p系统导致负荷。spring-doc.cadn.net.cn

采样器也可以通过 Java 配置来设置,如下例所示:spring-doc.cadn.net.cn

@Bean
public Sampler defaultSampler() {
    return Sampler.ALWAYS_SAMPLE;
}
您可以设置 HTTP 头部 X-B3-Flags1,或者在进行消息传递时,可以设置 spanFlags 头部到 1

spring-doc.cadn.net.cn

这样做会强制相应的跟踪被采样,而不考虑采样配置。spring-doc.cadn.net.cn