spring cloud sleuth 抽样采集
**************************
相关类
Sampler
public abstract class Sampler {
public static final Sampler ALWAYS_SAMPLE = new Sampler() { //输出所有日志
public boolean isSampled(long traceId) {
return true;
}
public String toString() {
return "AlwaysSample";
}
};
public static final Sampler NEVER_SAMPLE = new Sampler() { //任何日志都不输出
public boolean isSampled(long traceId) {
return false;
}
public String toString() {
return "NeverSample";
}
};
public Sampler() {
}
public abstract boolean isSampled(long var1);
public static Sampler create(float probability) {
return CountingSampler.create(probability);
}
}
ProbabilityBasedSampler:概率采集,默认使用的采集器
public class ProbabilityBasedSampler extends Sampler {
private final AtomicInteger counter = new AtomicInteger(0);
private final BitSet sampleDecisions;
private final SamplerProperties configuration;
public ProbabilityBasedSampler(SamplerProperties configuration) {
Assert.notNull(configuration.getProbability(), "probability property is required for ProbabilityBasedSampler");
int outOf100 = (int)(configuration.getProbability() * 100.0F);
this.sampleDecisions = randomBitSet(100, outOf100, new Random());
this.configuration = configuration;
}
static BitSet randomBitSet(int size, int cardinality, Random rnd) {
BitSet result = new BitSet(size);
int[] chosen = new int[cardinality];
int i;
for(i = 0; i < cardinality; ++i) {
chosen[i] = i;
result.set(i);
}
for(; i < size; ++i) {
int j = rnd.nextInt(i + 1);
if (j < cardinality) {
result.clear(chosen[j]);
result.set(i);
chosen[j] = i;
}
}
return result;
}
public boolean isSampled(long traceId) {
if (this.configuration.getProbability() == 0.0F) { //0不输出任何日志到zipkin等服务器
return false;
} else if (this.configuration.getProbability() == 1.0F) { //1输出所有日志到zipkin等服务器
return true;
} else {
synchronized(this) {
int i = this.counter.getAndIncrement();
boolean result = this.sampleDecisions.get(i);
if (i == 99) {
this.counter.set(0);
}
return result;
}
}
}
}
SamplerProperties:采集属性配置
@ConfigurationProperties("spring.sleuth.sampler")
public class SamplerProperties {
private Float probability;
private Integer rate = 10;
public SamplerProperties() {
}
public Float getProbability() {
return this.probability;
}
public void setProbability(Float probability) {
this.probability = probability;
}
public Integer getRate() {
return this.rate;
}
public void setRate(Integer rate) {
this.rate = rate;
}
}
SamplerAutoConfiguration:自动配置sampler
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(
value = {"spring.sleuth.enabled"},
matchIfMissing = true
)
@EnableConfigurationProperties({SamplerProperties.class})
public class SamplerAutoConfiguration {
public SamplerAutoConfiguration() {
}
static Sampler samplerFromProps(SamplerProperties config) {
return (Sampler)(config.getProbability() != null ? new ProbabilityBasedSampler(config) : new RateLimitingSampler(config));
}//probability属性不为null,使用ProbabilityBasedSampler,否则使用RateLimitingSampler
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnMissingBean(
type = {"org.springframework.cloud.context.scope.refresh.RefreshScope"}
)
protected static class NonRefreshScopeSamplerConfiguration {
protected NonRefreshScopeSamplerConfiguration() {
}
@Bean
@ConditionalOnMissingBean
public Sampler defaultTraceSampler(SamplerProperties config) {
return SamplerAutoConfiguration.samplerFromProps(config);
}
}
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnBean(
type = {"org.springframework.cloud.context.scope.refresh.RefreshScope"}
)
protected static class RefreshScopedSamplerConfiguration {
protected RefreshScopedSamplerConfiguration() {
}
@Bean
@RefreshScope
@ConditionalOnMissingBean
public Sampler defaultTraceSampler(SamplerProperties config) {
return SamplerAutoConfiguration.samplerFromProps(config);
}
}
}
**************************
示例
**********************
服务1:hello-service
添加bean
@Bean
public Sampler initSampler(){
return Sampler.ALWAYS_SAMPLE;
}
**********************
服务2:hello-consumer
添加bean
@Bean
public Sampler initSampler(){
return Sampler.ALWAYS_SAMPLE;
}
********************
使用示例
hello-service:
hello-consumer: