Spring Boot 2.x 整合Jaeger实现分布式跟踪(链路、日志、性能监测)

发布时间:2022年05月03日 // 分类:代码 // 暂无评论

Zipkin是最早流行起来的主流分布式跟踪平台,起源于Google Dapper并由Twitter进一步开发。而后Uber用Golang实现了Jaeger。Jaeger除了兼容Zipkin原有的大部分功能以外,还提供了更为丰富的功能。对比来说,两者都是比较成熟稳定的分布式跟踪解决方案。

考虑Jaeger更好的性能、更轻量的资源占用,所以决定在项目中使用Jaeger。

Spring Cloud 的Sleuth官方支持兼容Zipkin,在pom中引入spring-cloud-starter-sleuthspring-cloud-sleuth-zipkin即可。使用起来非常方便。

实现方案一

因为Spring Cloud官方的Sleuth支持Zipkin,且Jaeger兼容Zipkin,其实可以直接按照官方文档配置引入Sleuth和Zipkin的依赖,并在配置中将spring.zipkin.baseUrl指向Jaeger实现。

Spring Cloud Sleuth官方文档:https://spring.io/projects/spring-cloud-sleuth

在这种方案下,Spring Cloud通过HTTP协议将日志和跟踪数据传递给Jaeger。

实现方案二

Github社区opentracing-contrib提供了SpringBoot接入Jaeger的第三方解决方案。该方案的好处是支持UDP协议传输日志跟踪数据。基于社区方案,对接也非常简单。

1、在pom.xml中引入依赖

<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
    <version>3.3.1</version>
</dependency>

2、修改配置文件,配置Jaeger服务器地址

opentracing:
  jaeger:
    enabled: true # 启用对接Jaeger(可以不配置,默认true)
    enable128-bit-traces: true # 使用短TraceID(可以不配置)
    udp-sender:
      host: 192.168.1.102  # 配置Jaeger服务器地址

项目启动后,访问接口即可在Jaeger中看到数据。值得一提的是,Spring的Redis、JDBC也接入了Jaeger,这给我们带来的非常好的跟踪体验。可以在下图中看到,Redis和数据库查询的语句和时间也被记录到了Jaeger中,这对我们调试、优化程序有非常大的帮助。

jaeger-2.png
jaeger-1.png

扩展阅读

开发时,可以通过Jaeger提供的all-in-one全家桶Docker镜像进行部署。Docker启动后,直接访问http://地址:16686即可访问Jaeger面板。当然,生产环境下不能使用这种all-in-one的,具体可以查看官方文档的推荐实践。

Jaeger官方文档:https://www.jaegertracing.io/docs/1.33/getting-started/

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.33

另外,在开发时,尤其是配合客户端、测试工作时,我们常常需要查看接口完整的请求、响应数据,我们可以通过 Servlet 提供的 Filter 轻松实现这个功能。可参考下一篇文章 《SpringBoot 利用Filter将请求数据、响应数据写入日志

本文固定链接
https://www.ywlib.com/archives/191.html

标签
Spring Boot, Jaeger, Zipkin, 分布式跟踪, 日志

添加新评论 »