用Jaeger监控你的服务性能

2,171 阅读3分钟

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。

好了到此就结束了。希望你搭建顺利