Jaeger主要是做分布式追踪的,但是如果项目不是分布式,我觉得他的查看接口性能的功能还是很棒棒的,可以清晰的看到各个接口的执行时长,方便我们去做接口的优化。
一、下载jarger 地址 github.com/jaegertraci… 最新版本为1.31.1。
wget github.com/jaegertraci…(linux版本)
wget github.com/jaegertraci… (macos版本)
二、下载elasticsearch,本人亲自测试过了不要用7.x,索引建立不起来。数据发送不过去。选5.x/6.x。我本着版本越高应该越好的臆测。所以选用了6.x的最后一个版本6.8.2,不费心你找了
直接 wget artifacts.elastic.co/downloads/e…(macos/linux都是这个)
三、解压elasticsearch,修改config/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9200
transport.host: 0.0.0.0
transport.tcp.port: 9300
一个节点就这么配置就好了,但是在看数据的时候,elasticsearch总是报节点不健康,原因是elasticsearch存储数据分主片和副片。主片和副片无法分布在一个节点上。如果你只有一个节点就没有副片,所以就给个警告。我最早用过elasticsearch的2.x版本,貌似没有这个现象。有强迫症你就弄个集群,嫌麻烦一个节点也没啥问题
./bin/elasticsearch -d 启动 elasticsearch
4、解压 jaeger-1.13.1-linux-amd64.tar.gz
到jaeger目录下 chmod a+x jaeger-*
编写一个脚本。因为jaeger分几个模块,jaeger-agent ,jaeger-collector,jaeger-query等等。(ps:为啥只写这三个,因为我们只用这几个,别的我没研究)
jaeger-agent :jaeger代理。支持多种协议接收数据。
jaeger-collector :负责收集数据的。可以不通过jaeger-agent,应用直接链接jaeger-collector
jaeger-query:jaeger查询页面
脚本呈上:
#!/bin/bash
nohup ./jaeger-collector --span-storage.type=elasticsearch --es.server-urls=http://127.0.0.1:9200 --log-level=debug > collector.log 2>&1 &
nohup ./jaeger-agent --collector.host-port=127.0.0.1:14267 --discovery.min-peers=1 --log-level=debug > agent.log 2>&1 &
nohup ./jaeger-query --es.server-urls=http://127.0.0.1:9200/ > query.log 2>&1 &
执行脚本就ok
基础设施搭建好了。现在访问http://127.0.0.1:16686/search就能看到一个jaeger的查询页面了
五:应用集成jaeger
Springboot + maven做的增加如下依赖:
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-web-autoconfigure</artifactId>
<version>0.3.0</version>
</dependency>
<dependency>
<groupId>com.uber.jaeger</groupId>
<artifactId>jaeger-core</artifactId>
<version>0.26.0</version>
</dependency>增加一个配置类如下
@Component
public class JaegerTracerConfig {
@Value("${project.name}")
private String serviceName;
@Bean
public Tracer jaegerTracer() {
var senderConfiguration = new Configuration.SenderConfiguration();
var reporterConfiguration = new Configuration.ReporterConfiguration()
.withSender(senderConfiguration)
.withLogSpans(false)
.withMaxQueueSize(1000)
.withFlushInterval(100);
var samplerConfiguration = new Configuration.SamplerConfiguration()
.withType(ConstSampler.TYPE)
.withParam(1);
var configuration = new Configuration(serviceName)
.withReporter(reporterConfiguration)
.withSampler(samplerConfiguration);
return configuration.getTracer();
}
}别问我为啥用var,因为懒,为了少写代码用的jdk11,而且觉得jdk的steam很多方法很方便写业务。所以就用了jdk11写项目。
这里用的默认配置,他直接会通过tcp协议发送数据到jaeger.如果你服务和jaeger不是一台服务器,你可以在senderConfiguration中指定:
withEndPoint可以直接以http方式直接将数据发送到 jaeger-collector中。地址为:http:127.0.0.1:14268/api/traces。你什么都不配置它默认通过jaeger-agent通过tcp协议发送数据。(建议用tcp发送数据,jaeger-collector我觉得只适合小数据量测试)
好了让我们看下效果启动项目,访问接口看下效果吧
可以看到接口执行了160.71ms。
好了到此就结束了。希望你搭建顺利