聊聊 SpringBoot3 的 Micrometer Tracing( 二 )


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 。下面用一张简单的图描述下
聊聊 SpringBoot3 的 Micrometer Tracing

文章插图
 
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 界面
 
聊聊 SpringBoot3 的 Micrometer Tracing

文章插图
 
 
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




推荐阅读