1、概念
Jaeger是一款广受欢迎的开源分布式链路跟踪系统,兼容OpenTracing API,且已加入CNCF开源组织。其主要功能是聚合来自各个异构系统的实时监控数据。
按照数据流向,整体可以分为四个部分:
- jaeger-client:Jaeger的客户端,实现了OpenTracing的API,支持主流编程语言。客户端直接集成在目标Application中,其作用是记录和发送Span到Jaeger Agent。在Application中调用Jaeger Client Library记录Span的过程通常被称为埋点。
- jaeger-agent:暂存Jaeger Client 发来的Span,并批量向Jaeger Collector发送Span,一般每台机器上都会部署一个Jaeger Agent。官方的介绍中还强调Jaeger Agent可以将服务发现的功能从Client中抽离出来,不过从架构角度讲,如果是部署在Kubernetes或者是Nomad中,Jaeger Agent存在的意义并不大。
- jaeger-collector:接受Jaeger Agent发来的数据,并将其写入存储后端,目前支持采用Cassandra和Elasticsearch作为存储后端。个人还是比较推荐用ES,既可以和日志服务共用同一个ES,又可以使用Kibana对Trace数据进行额外的分析。架构图中的存储后端是Cassandra,旁边还有一个Spark,讲的就是可以用Spark等其他工具对存储后端中的Span进行直接分析。
- jaeger-query & jaeger-ui:读取存储后端中的数据,以直观的形式呈现。
2、安装ES和Kibana
注意:ES和Kibana版本保持一致
docker pull elasticsearch:7.7.0
docker pull kibana:7.7.0
创建相应文件夹
mkdir elasticsearch
cd elasticsearch
mkdir config
mkdir data
mkdir logs
mkdir plugins
# 给 config 写入配置文件
echo "http.host: 0.0.0.0" >> config/elasticsearch.yml
chmod -R 777 /home/elasticsearch
启动ES容器
docker run --name es -p 9200:9200 -p 9300:9300 \
-e "discovery.type"="single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx1024m" \
-v /home/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /home/elasticsearch/data:/usr/share/elasticsearch/data \
-v /home/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /home/elasticsearch/logs:/usr/share/elasticsearch/logs \
-d elasticsearch:7.7.0
查看容器信息
docker inspect es
找出ES的IP地址,例如:http://172.17.0.4
启动Kibana容器
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.17.0.4:9200 -p 5601:5601 -d kibana:7.7.0
修改配置文件
进入容器
docker exec -it kibana bash
修改配置文件
vi /usr/share/kibana/config/kibana.yml
修改ES的IP为本地的IP
# ** THIS IS AN AUTO-GENERATED FILE **
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ] # 将这里的 IP 换成 Es 的 IP,172.17.0.4
monitoring.ui.container.elasticsearch.enabled: true
外网访问
输入外网IP:5601,访问kibana,第一次访问,成功就会显示一个欢迎语。
3、安装Jaeger技术栈
jaeger-collector
镜像:jaegertracing/jaeger-collector:1.28
docker run -d --name=jaeger-collector -p 9411:9411 -p 14250:14250 -p 14268:14268 -p 14269:14269 -e SPAN_STORAGE_TYPE=elasticsearch -e ES_SERVER_URLS=http://172.17.0.4:9200 jaegertracing/jaeger-collector:1.28
jaeger-agent
镜像:jaegertracing/jaeger-agent:1.28
docker run -d --name=jaeger-agent -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778/tcp -p 5775:5775/udp -e REPORTER_GRPC_HOST_PORT=172.17.0.6:14250 -e LOG_LEVEL=debug jaegertracing/jaeger-agent:1.28
jaeger-query
镜像:jaegertracing/jaeger-query:1.28
docker run -d --name=jaeger-query -p 16686:16686 -p 16687:16687 -e SPAN_STORAGE_TYPE=elasticsearch -e ES_SERVER_URLS=http://172.17.0.4:9200 jaegertracing/jaeger-query:1.28
输入外网 IP 加16686端口,访问成功显示
4、代码接入
创建一个SpringBoot项目,pom文件中引入Jaeger依赖
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>io.jaegertracing</groupId>
<artifactId>jaeger-client</artifactId>
<version>1.6.0</version>
</dependency>
在配置文件中添加配置
opentracing.jaeger.enabled=true
opentracing.jaeger.const-sampler.decision=true
opentracing.jaeger.probabilistic-sampler.sampling-rate=1
opentracing.jaeger.service-name=docker-swarm-build
opentracing.jaeger.udp-sender.host=192.168.0.123
opentracing.jaeger.udp-sender.port=6831
opentracing.jaeger.log-spans=true
服务启动后,调用SpringBoot项目接口,访问jeager-ui地址 localhost:16686,界面如下: