Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】

通过 TraceIDSpanID已经实现了对分布式系统中的请求跟踪,而这些记录的跟踪信息最终会被分析系统收集起来,并用来实现对分布式系统的监控和分析功能,比如:预警延迟过长的请求链路、查询请求链路的调用明细等。此时,我们在对接分析系统时就会碰到一个问题:分析系统在收集跟踪信息的时候,需要收集多少量的跟踪信息才合适呢?

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

在Sleuth中的抽样收集策略是通过 Sampler接口实现的,它的定义如下:

public interface Sampler {
    /**
     * @return true if the span is not null and should be exported to the tracing system
     */
    boolean isSampled(Span span);
}

通过实现 isSampled方法,Spring Cloud Sleuth会在产生跟踪信息的时候调用它来为跟踪信息生成是否要被收集的标志。需要注意的是,即使 isSampled返回了 false,它仅代表该跟踪信息不被输出到后续对接的远程分析系统(比如:Zipkin),对于请求的跟踪活动依然会进行,所以我们在日志中还是能看到收集标识为 false的记录。

默认情况下,Sleuth会使用 PercentageBasedSampler实现的抽样策略,以请求百分比的方式配置和收集跟踪信息,我们可以通过在 application.properties中配置下面的参数对其百分比值进行设置,它的默认值为 0.1,代表收集10%的请求跟踪信息。

spring.sleuth.sampler.percentage=0.1

在开发调试期间,通常会收集全部跟踪信息输出到远程仓库,我们可以将其值设置为 1,或者也可以通过创建 AlwaysSampler的Bean(它实现的 isSampled方法始终返回 true)来覆盖默认的 PercentageBasedSampler策略,比如:

@Bean
public AlwaysSampler defaultSampler() {
    return new AlwaysSampler();
}

在实际使用时,通过与Span对象中存储信息的配合,我们可以根据实际情况做出更贴近需求的抽样策略,比如实现一个仅对包含指定Tag的抽样策略:

public class TagSampler implements Sampler {

    private String tag;

    public TagSampler(String tag) {
        this.tag = tag;
    }

    @Override
    public boolean isSampled(Span span) {
        return span.tags().get(tag) != null;
    }
}

由于跟踪日志信息的数据价值往往仅在最近的一段时间内非常有用,比如:一周。那么我们在设计抽样策略时,主要考虑在不对系统造成明显性能影响的情况下,以在日志保留时间窗内充分利用存储空间的原则来实现抽样策略。

原文地址:http://blog.didispace.com/spring-cloud-starter-dalston-8-6/

完整示例:

读者可以根据喜好选择下面的两个仓库中查看 trace-1trace-2两个项目:

  • Github:https://github.com/dyc87112/SpringCloud-Learning/
  • Gitee:https://gitee.com/didispace/SpringCloud-Learning/

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2018-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端吧啦吧啦

项目版本与分支管理之阿里AoneFlow模式分析

1963
来自专栏IT派

Django | CoolBlog开发笔记第1课:项目分析

CoolBlog开发笔记第1课:项目分析 首先说一下CoolBlog开发笔记是我制作的《Django实战项目》系列教程基础篇的内容,使用Django来开发一个...

3984
来自专栏编程微刊

如何在电脑上保存微信公众号文章封面图片?

2.6K5
来自专栏IMWeb前端团队

后台:nodejs 前台:vue 全栈开发 外卖平台系统

关于 一直考虑写一个功能齐全的完整Nodejs项目,但苦于没有找到合适的类型,而且后台系统无法直观的感受到,需要有一个前台项目配合,因此迟迟没有动笔。恰好前一段...

3270
来自专栏大数据

内存计算网格解释

Dmitriy Setrakyan在最近为In-Memory数据网格 (IMDG)提供了一个很好的解释 - 现在我尝试为In-Memory Compute Gr...

3288
来自专栏吴伟祥

MySQL基准测试 转

基准测试是  指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。例如,对计算机CPU进行浮点运算、数据访问...

1393
来自专栏用户画像

白盒测试与黑盒测试的定义与区别

白盒测试方法按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作,而不顾它的功能。

662
来自专栏农夫安全

绕过某商业waf实现getshell

0x00 前言 目标站:http://www.xxxx.com/ Aspcms 拿后台就不说了,太多姿势了。 主要说下后台getshell(过云盾拦截) A...

3775
来自专栏生信技能树

【直播】我的基因组70:比对文件并不能完美的还原出测序文件

前面我们说到过可以用软件或者自己写脚本从已经比对到参考基因组的sam/bam格式文件提取出原始的测序fastq文件。 但是我在IGV里面检查bam文件的时候发现...

3427
来自专栏进击的程序猿

Dynamo:Amazon的高可用性的键-值存储系统

Dynamo是一个分布式键值系统,最初用于支持购物车系统,强调的是提供一个“永远在线“的用户体验。

1122

扫码关注云+社区

领取腾讯云代金券