基本介绍

支持OpenTracingserver端有很多,我们总要选一个。在这里,选用jaegerjaeger的开发较为活跃,支持的客户端实现也较多。由于采用了golang开发,发行包也比较简洁。

jaeger的官网是www.jaegertracing.io/

特点

 jaeger的开发语言是`golang`
 jaeger支持OpenTracing协议,同属于CNCF基金会 
 jaeger支持各种各样的客户端,包括Go、Java、Node、Python、C++等
 jaeger支持udp协议传输,当然也支持http复制代码

jaeger能够解决以下问题

分布式事务监控
性能分析与性能优化
调用链,找到根源问题
服务依赖分析(需大数据分析)复制代码

安装需了解的技术栈:

OpenTracing
Golang
ElasticSearch
Kafka (可选)复制代码
安装

下载

jaeger是二进制发行包,使用wget下载即可,这里以linux版本为例。

wget -c https://github.com/jaegertracing/jaeger/releases/download/v1.11.0/jaeger-1.11.0-linux-amd64.tar.gz复制代码

jaeger的二进制发行包包含五个二进制文件:

jaeger-agent
jaeger-collector
jaeger-query
jaeger-standalone
jaeger-ingester	
复制代码

如果没有执行权限,可以使用

chmod a+x jaeger-*复制代码

增加执行权限。

选择存储

trace数据总要存在一个地方。jaeger支持ESCanssandra两种后端DB。国内用ES的多一点,我们就以ES为例,来介绍其安装方式。

ES请先自行安装。

由于上面四个命令都有很多参数,所以我们可以创建几个脚本,来支持jaeger的启动。

start-collector.sh

export SPAN_STORAGE_TYPE=elasticsearch
nohup ./jaeger-collector  --es.server-urls http://10.66.177.152:9200/  --log-level=debug > collector.log  2>&1 &复制代码

start-agent.sh

export SPAN_STORAGE_TYPE=elasticsearch
nohup  ./jaeger-agent  --collector.host-port=10.66.177.152:14267 --discovery.min-peers=1 --log-level=debug > agent.log 2>&1 &复制代码

start-query.sh

export SPAN_STORAGE_TYPE=elasticsearch
nohup ./jaeger-query --span-storage.type=elasticsearch --es.server-urls=http://10.66.177.152:9200/  > query.log 2>&1 &复制代码

部署方式

jaeger有两种部署方式。下面一一介绍。如果你的数据量特别多,使用kafka缓冲一下也是可以的(所以就引入了另外一个组件jaeger-ingester),不多做介绍。

简易环境


这种方式一般用在dev环境或者其他测试环境。只需要部署一个单一节点即可。我们的app,需要手动填写agent的地址,这个地址一般都是固定的。


这些环境的流量很小,一个agent是足够的。

更加简洁的部署方式,连agent都不需要,直接向collector发送数据即可。为了方便测试,我们使用此方式。

生产环境


上面这种部署方式,适合生产环境。agent安装在每一台业务机器上。Client端的目标agent只需要填写localhost即可。


这种方式的好处是生产环境的配置非常的简单。即使你的机器是混合部署的,也能正常收集trace信息。

调用关系图

jaeger的调用关系图是使用spark任务进行计算的。项目地址为:

https://github.com/jaegertracing/spark-dependencies复制代码

作为一个可选部分,只有在计算完毕后,才能在jaeger的后台中进行展现。

端口整理

Agent

5775 UDP协议,接收兼容zipkin的协议数据
6831 UDP协议,接收兼容jaeger的兼容协议
6832 UDP协议,接收jaeger的二进制协议
5778 HTTP协议,数据量大不建议使用复制代码

它们之间的传输协议都是基于thrift封装的。我们默认使用5775作为传输端口。

Collector

14267 tcp agent发送jaeger.thrift格式数据
14250 tcp agent发送proto格式数据(背后gRPC)
14268 http 直接接受客户端数据
14269 http 健康检查复制代码

Query

16686 http jaeger的前端,放给用户的接口
16687 http 健康检查复制代码

至此,我们的jaeger就安装完毕。

End

以上,就是我们的环境准备。有了一个server接收数据,调用链的主要工作就在于客户端开发。

接下来,将从一个简单的java程序说起,来说明OpenTracing规范的使用方式。