jaeger是开源的,端对端的分布式链路追踪系统。支持多种编程语言和多种存储方式
开始
首先需要启动一个jaeger服务,官网有着docker启动开发版jaeger的方式:
$ docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:1.17
这样一个开发版的jaeger服务就部署好了
上面这么多端口,官网也有介绍,我这里做一下搬运:
| Port | Protocol | Component | Function |
|---|---|---|---|
| 5775 | UDP | agent | accept zipkin.thrift over compact thrift protocol (deprecated, used by legacy clients only) |
| 6831 | UDP | agent | accept jaeger.thrift over compact thrift protocol |
| 6832 | UDP | agent | accept jaeger.thrift over binary thrift protocol |
| 5778 | HTTP | agent | serve configs |
| 16686 | HTTP | query | serve frontend |
| 14268 | HTTP | collector | accept jaeger.thrift directly from clients |
| 14250 | HTTP | collector | accept model.proto |
| 9411 | HTTP | collector | Zipkin compatible endpoint (optional) |
- 其中
16686端口是WebUI端口,可以在网页上查看链路的情况,如下图
- 另外本次要用到的tcp端口是: 6831
引入maven依赖(2.2.6.RELEASE和Hoxton.SR3):
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>3.1.1</version>
<exclusions>
<exclusion>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-rabbitmq-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-rabbitmq-starter</artifactId>
<version>3.0.0</version>
</dependency>
这里说明一下opentracing-spring-jaeger-cloud-starter:3.1.1版本默认的rabbitmq链路追踪会有一个空指针的bug,需要手动引入更高版本的opentracing-spring-rabbitmq-starter才行,所以上面的maven文件才这样做
配置文件(consul配置中心):
opentracing:
jaeger:
udp-sender:
host: 192.168.1.104
port: 6831
- 所有的配置都在
JaegerConfigurationProperties配置文件上- RemoteReporter: 链路报告的配置
flushInterval:刷新间隔maxQueueSize:最大(消息?)队列大小
HttpSender/UdpSender:以不同的形式配置jaeger的地址ConstSampler:是否每条链路都采样ProbabilisticSampler:采集百分比,比如10条采集一条则为0.1RateLimitingSampler:采样器限速RemoteControlledSampler:未知
- RemoteReporter: 链路报告的配置
- 一些默认的配置
- 如果没有没有给定
spring.application.name或者opentracing.jaeger.service-name的值则默认展示的应用名称为:unknown-spring-boot CompositeReporter提供了一些默认的配置:LoggingReporter把追踪日志打印在控制台;RemoteReporter的默认配置是UdpSender,指向localhost:6831ConstSampler的值为true。 这意味着每条链路都将被采样- 使用
NoopMetricsFactory,实际上这意味着不会collec指标
- 如果没有没有给定
在所有的项目都加上opentracing-spring-jaeger-cloud-starter链路追踪后,可以访问一写接口,然后去到jaeger网页上查看:

每条链路都可以点进去看详情:

另外说明一点的是jaeger追踪是按照模块区分好了的:

也就意味着如果你的项目没有用到这个组件的化是可以移除的。这样可以让jar包苗条一点
总结
之前用的是zipkin,从部署程度来说jaeger要友好一点。代码配置上都差不多。
两者最近都属于活跃开发中,值得注意的是jaeger比openzipkin晚诞生4年,但start及watch的数量已有后者的一半了,可谓发展迅猛。另外还有一点值得注意的是jaeger是Cloud Native Computing Foundation的项目,因此云原生的项目都会支持它。 来源