返回 导航

SpringBoot / Cloud

hangge.com

分布式服务跟踪Spring Cloud Sleuth使用详解3(设置采用率、抽样收集策略)

作者:hangge | 2020-11-20 08:58
    理论上来说,我们收集的跟踪信息越多就越能反映出系统的实际运行情况,并给出更精准的预警和分析。但是在高并发的分布式系统运行时,大量的请求调用会产生海量的跟踪日志信息,如果我们收集过多的跟踪信息将会对我们整个分布式系统的性能造成一定的影响,同时保存大量的日志信息也需要不少的存储开销。
    所以,在 Sleuth 中采用了抽样收集的方式来为跟踪信息打上收集标记,也就是我们之前在日志信息中看到的第四个 boolean 类型的值,它代表了该信息是否要被后续的跟踪信息收集器(比如 Zipkin)获取和存储。

    如果项目同时添加了 Zipkin 依赖(spring-cloud-sleuth-zipkin 或者 spring-cloud-starter-zipkin),我们可以自由选择使用 Zipkin brave 自带的两个抽样策略:ProbabilityBasedSamplerRateLimitingSampler,并且可以设置相关参数。下面通过样例进行演示。

三、采用率、抽样收集策略

1,ProbabilityBasedSampler 抽样策略

(1)默认情况下,Sleuth 会使用 zipkin braveProbabilityBasedSampler 抽样策略,以请求百分比的方式配置和收集跟踪信息,我们可以通过在 application.properties 中配置下面的参数对其百分比值进行设置(它的默认值为 0.1,代表收集 10% 的请求跟踪信息)
spring.sleuth.sampler.probability=0.5

(2)我们也可以通过在代码中创建 bean 定义来安装设置采样器,比如下面效果同上面是一样的,即有一半的几率收集跟踪信息并输出到远程仓库:
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }

    @Bean
    public Sampler defaultSampler(){
        return ProbabilityBasedSampler.create(0.5f);
    }
}

(3)而如果要收集全部的跟踪信息并输出到远程仓库,除了可以将值设置为 1 外(通过配置或者代码),还可以创建 ALWAYS_SAMPLEBean(它实现的 isSampled 方法始终返回 true)来覆盖默认的策略:
@Bean
public Sampler defaultSampler(){
    return Sampler.ALWAYS_SAMPLE;
}

(4)如果所有的跟踪信息都不需要收集起来,除了可以将值设置为 0 外(通过配置或者代码),也可以创建 NEVER_SAMPLE Bean(它实现的 isSampled 方法始终返回 false)来覆盖默认的策略:
@Bean
public Sampler defaultSampler(){
    return Sampler.NEVER_SAMPLE;
}

2,RateLimitingSampler 抽样策略

(1)如果在 application.properties 文件中设置了 spring.sleuth.sampler.rate 属性值,那么便会使用 zipkin brave 自带的 RateLimitingSampler 策略。不同于 ProbabilityBasedSampler 是概率采集,RateLimitingSampler 是限速采集,也就是说它可以用来限制每秒追踪请求的最大数量。
注意:
  • 如果同时设置了 spring.sleuth.sampler.rate spring.sleuth.sampler.probability 属性值,也仍然使用 RateLimitingSampler 抽样策略(即 spring.sleuth.sampler.probability 属性值无效)
  • RateLimitingSampler 策略每秒间隔接受的 trace 量设置范围:最小数字为 0,最大值为 2,147,483,647(最大 int
spring.sleuth.sampler.rate=1

(2)我们同样可以通过在代码中创建 bean 定义来安装设置采样器,比如下面效果同上面是一样的,如果一秒接收到了 10 个请求,那么只有第一个请求会被追踪。
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }

    @Bean
    public Sampler defaultSampler(){
        return RateLimitingSampler.create(1);
    }
}
评论

全部评论(0)

回到顶部