Spring Cloud Sleuth 抽样
采样可用于减少收集和报告的进程外数据,如果未对 span 进行抽样,则不会增加任何开销(noop)。
抽样是一个前期决策,这意味着报告数据的决定是在 trace 中的第一个操作中做出的,并且该决策是向下游传播的。
默认情况下,全局抽样器将单个速率应用于所有跟踪的操作,Tracer.Builder.sampler
控制此设置,默认为跟踪每个请求。
声明性抽样
某些应用程序需要根据 java 方法的类型或注解进行采样。
大多数用户使用框架拦截器来自动执行此类策略,以下示例显示了内部可能如何工作:
@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 的所有请求。
大多数用户使用框架拦截器来自动执行此类策略,以下示例显示了内部可能如何工作:
@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 进行采样。
如果你使用
spring-cloud-sleuth-zipkin
,则ProbabilityBasedSampler
是默认值,您可以通过设置spring.sleuth.sampler.probability
来配置导出,传递的值必须是从 0.0 到 1.0 的双精度值。
可以通过创建 bean 定义来安装采样器,如以下示例所示:
@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)。