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服务就部署好了

上面这么多端口,官网也有介绍,我这里做一下搬运:

PortProtocolComponentFunction
5775UDPagentaccept zipkin.thrift over compact thrift protocol (deprecated, used by legacy clients only)
6831UDPagentaccept jaeger.thrift over compact thrift protocol
6832UDPagentaccept jaeger.thrift over binary thrift protocol
5778HTTPagentserve configs
16686HTTPqueryserve frontend
14268HTTPcollectoraccept jaeger.thrift directly from clients
14250HTTPcollectoraccept model.proto
9411HTTPcollectorZipkin compatible endpoint (optional)
  • 其中16686端口是WebUI端口,可以在网页上查看链路的情况,如下图 jaeger首页
  • 另外本次要用到的tcp端口是: 6831

引入maven依赖(2.2.6.RELEASEHoxton.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.1
    • RateLimitingSampler:采样器限速
    • RemoteControlledSampler:未知
  • 一些默认的配置
    • 如果没有没有给定spring.application.name或者opentracing.jaeger.service-name的值则默认展示的应用名称为: unknown-spring-boot
    • CompositeReporter提供了一些默认的配置:LoggingReporter把追踪日志打印在控制台;RemoteReporter的默认配置是UdpSender,指向localhost:6831
    • ConstSampler的值为true。 这意味着每条链路都将被采样
    • 使用NoopMetricsFactory,实际上这意味着不会collec指标

在所有的项目都加上opentracing-spring-jaeger-cloud-starter链路追踪后,可以访问一写接口,然后去到jaeger网页上查看:

jaeger查询

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

jaeger详情

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

jaeger模块

也就意味着如果你的项目没有用到这个组件的化是可以移除的。这样可以让jar包苗条一点

总结

之前用的是zipkin,从部署程度来说jaeger要友好一点。代码配置上都差不多。

两者最近都属于活跃开发中,值得注意的是jaeger比openzipkin晚诞生4年,但start及watch的数量已有后者的一半了,可谓发展迅猛。另外还有一点值得注意的是jaeger是Cloud Native Computing Foundation的项目,因此云原生的项目都会支持它。 来源