sleuth zipkin 的reporter实现主要逻辑简要分析记录,主要依托ConditionalOnMissingBean及SpringBootCondition 实现可override及可配置型。

先从tracing 的创建来看,tracing默认创建是在TraceAutoConfiguration类中,具体函数如下

@Bean@ConditionalOnMissingBean// NOTE: stable bean name as might be used outside sleuthTracing tracing(@Value("${spring.zipkin.service.name:${spring.application.name:default}}") String serviceName,Propagation.Factory factory, CurrentTraceContext currentTraceContext,Sampler sampler, ErrorParser errorParser, SleuthProperties sleuthProperties,@Nullable List<Reporter<zipkin2.Span>> spanReporters) {Tracing.Builder builder = Tracing.newBuilder().sampler(sampler).errorParser(errorParser).localServiceName(StringUtils.isEmpty(serviceName) ? DEFAULT_SERVICE_NAME: serviceName).propagationFactory(factory).currentTraceContext(currentTraceContext).spanReporter(new CompositeReporter(this.spanAdjusters,spanReporters != null ? spanReporters : Collections.emptyList())).traceId128Bit(sleuthProperties.isTraceId128()).supportsJoin(sleuthProperties.isSupportsJoin());for (FinishedSpanHandler finishedSpanHandlerFactory : this.finishedSpanHandlers) {builder.addFinishedSpanHandler(finishedSpanHandlerFactory);}for (TracingCustomizer customizer : this.tracingCustomizers) {customizer.customize(builder);}return builder.build();}

先注意函数带有annotation ConditionalOnMissingBean,因此可以自定义一个Tracing bean来override。
其次看参数@Nullable List<Reporter<zipkin2.Span>> spanReporters,因此可以实现多个Reporter<zipkin2.Span> bean来实现一个span向多方报告,比如同时向zipkin kafka及写入logstat 日志。

@Beanpublic Reporter<Span> spanReporter() {return new Reporter<Span>() {@Overridepublic void report(Span span) {logger.info("customer report:" + span);}};}

默认reporter实现在类ZipkinAutoConfiguration中实现,具体代码如下

/*** Zipkin reporter bean name. Name of the bean matters for supporting multiple tracing* systems.*/public static final String REPORTER_BEAN_NAME = "zipkinReporter";/*** Zipkin sender bean name. Name of the bean matters for supporting multiple tracing* systems.*/public static final String SENDER_BEAN_NAME = "zipkinSender";@Bean(REPORTER_BEAN_NAME)@ConditionalOnMissingBean(name = REPORTER_BEAN_NAME)public Reporter<Span> reporter(ReporterMetrics reporterMetrics,ZipkinProperties zipkin, @Qualifier(SENDER_BEAN_NAME) Sender sender) {// historical constraint. Note: AsyncReporter supports memory boundsreturn AsyncReporter.builder(sender).queuedMaxSpans(1000).messageTimeout(zipkin.getMessageTimeout(), TimeUnit.SECONDS).metrics(reporterMetrics).build(zipkin.getEncoder());}

同样使用了ConditionalOnMissingBean,因此也可以通过自定义bean 实现 override,注意下实际实现类默认使BoundedAsyncReporter (来自zipkin reporter jar),具体span发送默认使先进入bounded queue,异步flush 发送。

发送span到bounded queue 或者调用自定义reporter 的report方法在 private static final class ListReporter implements Reporter<zipkin2.Span> 类,这个类在是public class TraceAutoConfiguration的inner 类,具体实现函数如下:

@Overridepublic void report(Span span) {for (Reporter<zipkin2.Span> spanReporter : this.spanReporters) {try {spanReporter.report(span);}catch (Exception ex) {log.warn("Exception occurred while trying to report the span "+ span, ex);}}}

最后说下zipkin 三种reporter sender(rest、kafka、rabbitMQ)的实现,相关实现都在package org.springframework.cloud.sleuth.zipkin2.sender下,关键点如下;

  1. ZipkinKafkaSenderConfiguration,ZipkinRabbitSenderConfiguration,ZipkinRestTemplateSenderConfiguration 都实现@Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME)
  2. 如何实现3选一,依托@Conditional(ZipkinSenderCondition.class)来实现,即通过SpringBootCondition模式来实现根据配置项:spring.zipkin.sender.type 选择 bean实现类

sleuth zipkin reporter-sender 分析相关推荐

  1. SpringCloud Sleuth + zipkin 实现微服务链路追踪功能

    一.微服务架构下的问题 在大型的微服务架构系统中,存在很多不同的微服务应用,不同的微服务有依赖着其他微服务,以及不同微服务有可能由不同的团队维护.那么在这种复杂的系统架构中,将会存在一些问题,比如: ...

  2. 微服务下的链路追踪(Sleuth+Zipkin)

    目录 Sleuth简介 相关术语 使用Sleuth 引入依赖 创建服务 product-service order-service 启动&测试 Zipkin 使用Zipkin 参考文章 Sle ...

  3. Spring Cloud Alibaba 高级特性 基于 Sleuth+Zipkin 实施链路跟踪体系

    介绍微服务链路追踪的原理: 讲解基于 Spring Cloud Sleuth 实现链路追踪: 构建 Zipkin Server 实现链路追踪的可视化管理. 下面咱们先来介绍什么是微服务链路追踪. 微服 ...

  4. SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪

    Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...

  5. spring cloud学习进阶篇:Spring Cloud Sleuth + Zipkin 实现分布式跟踪解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 简述 使用 spring cloud 用到最多的是各种rest服务调用,Twitter的Zipkin 是一种实现分布式跟踪解决 ...

  6. 【Spring Cloud Alibaba 温故而知新】(五)SpringCloud Sleuth + Zipkin:分布式日志追踪

    目录 8.1.1 SpringCloud Sleuth 是什么 SpringCloud Sleuth 必知必会 SpringCloud Sleuth 实现的功能是:它会自动为当前应用构建起各通信通道的 ...

  7. 分布式链路监控与追踪系统(SpringCloud Sleuth + Zipkin)

    一.分布式链路监控与追踪产生背景 在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂.一个 HTTP 请求会调用多个不同的微服务来处理返回最后的结果,在这 ...

  8. sleuth+zipkin链路追踪

    sleuth+zipkin大致工作图: sleuth: 有以下术语: Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标 ...

  9. 【Spring Cloud】Sleuth+Zipkin全链路日志追踪接入实战

    文章目录 一.背景 链路追踪介绍 为什么需要链路追踪? 那该如何解决呢? 二.常见的链路追踪技术有下面这些: 三.Sleuth 3.1.Sleuth(读作/sluːθ/)介绍 3.2.相关术语 3.3 ...

  10. 服务链路跟踪:Sleuth+Zipkin

    目录 第一章 Sleuth+Zipkin介绍 1.1.什么是Sleuth 1.2.什么是Zipkin 第二章 Sleuth+Zipkin入门案例 2.1.项目准备与启动 2.2.搭Zipkin服务端 ...

最新文章

  1. jQuery的链Chaining
  2. Docker进阶-资源管理Swarm+Portainer
  3. php 递归函数自调用函数,PHP闭包实现函数的自调用实现递归
  4. KAFKA介绍(分布式架构)
  5. 自定义jackson序列化_Jackson中的自定义反序列化程序和验证
  6. MySQL时间段查询,无数据补0
  7. 图书馆预约占座系统 (SSM JAVA)
  8. win10下用ffmpeg推流拉流
  9. 【layoutit!】基于 bootstrap 实现可视化布局工具
  10. 广州行键CRM客户关系管理系统
  11. 编译g2o提示错误 error: ‘ScalarBinaryOpTraits’ is not a class template
  12. CTOR是否有助于BCH分片技术?
  13. mysql中的round函数(*)
  14. python换零钱_LeetCode-python 322.零钱兑换
  15. 从皮亚诺公理体系到1+1=2的严格证明(一)
  16. 还在到处寻找Minitab资源?看过来,Minitab使用教程/行业案例/视频教程送你!
  17. GPS/北斗模块小小总结
  18. python flask音频流/文件服务
  19. 电车续航中NEDC/WLTC/CLTC 含义和作用
  20. matlab制作有趣动画制作,18个超有趣的SVG绘制动画赏析

热门文章

  1. 【2020.09.05】基金基础问题答疑汇总
  2. 桌面的快捷方式图标异常
  3. 猜拳php代码,使用JavaScript如何实现猜拳游戏(详细教程)
  4. C语言的整型常量与实型常量
  5. 未转变者服务器买车指令,未转变者3.X服务器控制台命令大全_快吧单机游戏
  6. linux 服务器 安装svn
  7. 基于canvas图像处理的图片 灰色图像
  8. 【总结】1298- 如何用油猴提升前端开发效率
  9. ADW_Launcher
  10. ipad上面安装view