import io.micrometer.tracing.Span; /** * Brave implementation of a {@link Span}. * * @author Marcin Grzejszczak * @since 1.0.0 */ public class BraveSpan implements Span { final brave.Span delegate; // 省略其它无关代码 ... } 复制代码
这种方式也是 skywalking、zipkin-brave、sofatracer1.0、jaeger 等组件在早期支持 opentrcing API 的实现方式 。如何上报给 zipkin 的
我在 原理 | 分布式链路跟踪组件 SOFATracer 和 Zipkin 模型转换 这篇文章中介绍过 SOFATracer 是如何将 span 数据上报给 zipkin 的,它的做法是:在 span 结束的时候,通过预留的 reporter 扩展机制,使得用户可以通过自定义 reporter 来实现 span 数据的上报 。两个关键点:
- 上报时机:span 结束时
- 上报方式:通过自定义 reporter 上报
Micrometer Tracing 本身包括了对 span 完整生命周期管理的 API
/** * Starts this span. * @return this span */ Span start(); /** * Ends the span. The span gets stopped and recorded if not noop. */ void end(); /** * Ends the span. The span gets stopped and recorded if not noop. * @param time timestamp * @param timeUnit time unit of the timestamp */ void end(long time, TimeUnit timeUnit); 复制代码因此上报时机都是一样的,在 span 结束时发生 。上报方式,Brave 提供了一个 SpanHandler 扩展接口,对应的具体实现是 ZipkinSpanHandler,otel 中提供的是 SpanExporter 扩展接口,对应的实现是 ZipkinSpanExporter 。下面用一张简单的图描述下

文章插图
a simple guides for you
这里给一个小案例,主要是官方文档中并没有提供 step by step 的集成方式 。以 Micrometer tacing + brave + zipkin 的方式为例 。
依赖
- 增加依赖,下面给出的依赖均为必须提供的
org.springframework.boot spring-boot-starter-actuator io.micrometer micrometer-tracing io.micrometer micrometer-tracing-bridge-brave io.zipkin.reporter2 zipkin-reporter-brave io.micrometer micrometer-tracing-bom 1.0.0 pom import 复制代码 提供一个测试 Rest API @RequestMapping("api") @RestController() public class MyController { private static final Log logger = LogFactory.getLog(MyController.class); @RequestMapping("test") public String test() { // 配置了在日志中输出 traceId logger.info("this is test log ...."); return "SUCCESS"; } } 复制代码 基本配置 # 采样比率 management.tracing.sampling.probability=1.0 # 将 traceId 和 spanId 和 log 绑定 logging.pattern.level=%5p [${spring.application.name:test},%X{traceId:-},%X{spanId:-}]` 复制代码 测试 访问 curl http://localhost:8080/api/test,
- 日志输出如下:
2022-12-06T12:06:36.971+08:00 INFO [test,638ebfccd315f7022e7eee028343517f,2e7eee028343517f] 61043 --- [nio-8080- exec-1] c.g.bridge.boot.controller.MyController : this is test log .... 复制代码- zipkin 界面

文章插图
PS:你可能没有看到任何关于 zipkin 的配置,因为默认情况下,zipkin 的上报地址是 127.0.0.1:9411,我在本地通过 Docker 启动了一个 zipkin 实例,所以我并不需要做额外的配置 。总结
本篇对 SpringBoot3 tracing 做了一些介绍,通过本篇文章,希望你可以了解到 SpringBoot3 中提供 tracing 的初衷,以及在众多事实标准存在情况下选择 Micrometer tracing 作为 API 的原因 。这篇文章并不会涉及到过多对于 tracing 基础概念的介绍,如果你有兴趣可以自行查阅 。最后我给出了 Micrometer tacing + brave + zipkin 一个小案例,希望可以帮助到你 。
作者:磊叔的技术博客 链接:https://juejin.cn/post/7173914390352101412
推荐阅读
- 盘点12个Vue 3的高颜值UI组件库
- 火爆全网的 ChatGPT,还干不掉 Google 搜索
- 为什么选择 AWS 作为“架构完善的框架”?
- 我误解了分布式系统中的可伸缩性
- 建议收藏 聊聊分库分表后非Sharding Key查询的三种方案~
- C++的数据类型
- 浏览器的作用不只是搜索、浏览网页,它还隐藏着这些功能
- 升级B买体验,阿里1688的“批发采购新通路”
- 一生必看的6部韩剧:第1部揭示人间冷暖,第5部简直丧到没人性!
- 李彦宏站台的世界首家AI公园都有啥?怎么去?
