Uber Jaeger安装与使用
关于Jaeger
Jaeger是Uber推出的一款调用链追踪系统,类似于Zipkin和Dapper,为微服务调用追踪而生。 其主要用于多个服务调用过程追踪分析,图形化服务调用轨迹,便于快速准确定位问题。
组件分析
Jaeger主要组件有:
- 数据存储
Cassandra
- 数据收集处理
Collector
- 客户端代理
Agent
- 数据查询
Query
- 前端界面展示
UI
- 客户端库
jaeger-client-*
相互之间关系如下图所示:
数据存储
目前Jaeger收集到的数据都是持久化到Cassandra里面。
数据收集处理
数据收集处理即从客户端代理处获取到最新的数据,进行处理后存入到存储里面
客户端代理
一般来说,应用的trace
数据并不是直接从应用发到收集处理的服务端(虽然也可以直接发过去),
而是通过一个靠近客户端的代理,由代理转发到服务端。这样方便应用的快速处理,同时也可以减缓对服务端的直接压力。
客户端代理还有一个特性,就是可以进行控制应用追踪数据采样控制。这样就不必把所有的配置都固化写到应用配置文件里, 可以通过代理动态调整频率。
数据查询
前端界面进行展示时,通常需要根据不同条件到数据库里进行搜索。所以这里需要一个拼接搜索条件、读取数据库的程序。 因而Jaeger提供了这样一个组件来供前端来使用。
前端界面
这是一个React的前端应用,当前界面上功能相对还是比较简单的。
客户端库
目前,Jaeger提供了四种语言的官方客户端库,分别为Go
, Node
, Java
, Python
这四种语言。
安装部署
请注意,Jaeger依赖于Cassandra
,所以请先安装Cassandra
后再进行安装使用。
目前(2017/06/30),由于Jaeger还是处于Beta状态,所以需要自行下载编译。
看官方的动向,是想要容器化使用docker
镜像的方式来安装,所以这里介绍一下手工安装过程。
编译二进制文件
到Jaeger的Github仓库下载源码到GOPATH下。 可以通过下面的命令进行下载:
go get github.com/uber/jaeger
然后需要安装依赖(请注意,这里可能需要梯子!):
glide install
完成以上两个步骤后,进行编译(这一步会同时编译多个二进制文件):
make build-crossdock-bin # 编译Linux可执行程序
make build-ui # 编译UI界面
编译完成后主要的三个可执行文件(Linux程序)分别位于:
cmd/collector/collector-linux # Collector
cmd/agent/agent-linux # Agent
cmd/query/query-linux # Query
前端编译成静态文件位于jaeger-ui-build/build/
目录下,前端界面可以直接使用Nginx
处理,也可以参照说明使用serve应用进行处理。
部署组件
由于大部份组件都是用Golang编写的二进制应用,所以部署起来相对比较方便,不需要安装额外依赖。
- 部署时,需要将
UI
静态文件服务与Query
服务放置于同一台服务器。 Collector
服务可以任意部署到某台机器上。Agent
应优先部署到应用的服务器上或者是同一网络中。
注意 由于UI
组件使用了sockjs
库,所以如果使用反向代理的话,请注意代理放行WebSocket。
连接配置
从架构图上可以看出各个组件的连接关系:
Agent --> Collector # 从Agent发送数据到Collector
Collector --> Cassandra # 从Collector写数据到Cassandra
Query --> Cassandra # 从Cassandra读数据到Query
这里给出几个组件启动时基本参数,如下所示:
# 这里Cassandra部署了三台机器,其IP地址分别为:
# 192.168.2.1, 192.168.2.2, 192.168.2.3
#
# Collector 部署机器IP地址为:192.168.2.5
# 启动Query
query -cassandra.keyspace jaeger_test -cassandra.servers 192.168.2.1,192.168.2.2,192.168.2.3
# 启动Collector
collector -cassandra.keyspace jaeger_test -cassandra.servers 192.168.2.1,192.168.2.2,192.168.2.3
# 启动Agent
agent -collector.host-port 192.168.2.5:14267
端口号说明
端口号 | 类型 | 组件 | 说明 |
---|---|---|---|
5775 | UDP | Agent | 通过兼容性Thrift协议,接收Zipkin thrift类型数据 |
6831 | UDP | Agent | 通过兼容性Thrift协议接收Jaeger thrift类型数据 |
6832 | UDP | Agent | 通过二进制Thrift协议接收Jaeger thrift类型数据 |
5778 | HTTP | Agent | 配置控制服务接口 |
16686 | HTTP | Web | 客户端前端界面展示端口 |
14268 | HTTP | Collector | 接收Zipkin thrift类型数据 |
14267 | UDP | Collector | 接收Jaeger thrift类型数据 |
使用指南
使用Jaeger其实很大程度上是使用Opentracing这个分布式追踪标准。 由于Opentracing定义了完整的追踪标准,并且实现了多种语言的客户端库,所以Jaeger做的只是将Opentracing追踪到的数据转换成自己的格式并存储。
综上所述,使用Jaeger最大的问题就是如何对接Opentracing的库,目前Jaeger提供了四种语言(Opentracing现支持八种语言)的对接。
Jaeger的配置可以参考Go版本和Node版本等,不同语言版本的配置大同小异。其配置大致为:
jaeger_configuration:
serviceName: "AppName" // 你应用的名称
disabled: false // 是否禁用追踪
sampler: // 采样配置
type: "const" // 采样类型为固定间隔时间采样
//type: "probabilistic" // 采样类型为随机间隔时间采样
//type: "ratelimiting" // 采样类型为每秒最多几次采样
//type: "remote" // 采样频率由远程服务提供,其额外配置如下所示
param: 1 // 采样参数,与上面的采样类型相关,数值类型
hostPort: "server:port" // 远程采样控制服务的域名或IP地址和端口号
refreshInterval: 10 // 远程采样控制配置获取间隔时间
reporter: // 提交到代理配置
logSpans: false // 是否启用LoggingReporter并行处理并记录所有提交数据
hostPort: "server:port" // 本地代理Agent的域名或IP地址和端口号
flushInterval: 5 // 至多间隔多长时间发送数据到代理
queueSize: 50 // 最多缓冲多少条数据
不同语言可能有多或有少配置项,但此处列出的大部份都兼容(可能配置项名称不同)。
其配置使用方式大致为(以Node代码为例):
var initTracer = require('jaeger-client').initTracer;
// 请按照自己的配置进行完整配置
var config = {
serviceName: 'my-awesome-service',
disabled: false,
sampler: {},
reporter: {}
};
// 可选的参数
var options = {};
// 生成Tracer对象
var tracer = initTracer(config, options);
// 将其设置为全局的Tracer对象
opentracing.initGlobalTracer(tracer);
// 使用的时候如下获取全局Tracer即可,不需要每次都初始化
const tracer = opentracing.globalTracer();