spring cloud sleuth 抽样采集


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:

      

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值