Uber Jaeger安装与使用

· Read in about 2 min · (266 Words)
dev work

关于Jaeger

Jaeger是Uber推出的一款调用链追踪系统,类似于ZipkinDapper,为微服务调用追踪而生。 其主要用于多个服务调用过程追踪分析,图形化服务调用轨迹,便于快速准确定位问题。

组件分析

Jaeger主要组件有:

  • 数据存储Cassandra
  • 数据收集处理Collector
  • 客户端代理Agent
  • 数据查询Query
  • 前端界面展示UI
  • 客户端库jaeger-client-*

相互之间关系如下图所示: Jaeger Architecture

数据存储

目前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编写的二进制应用,所以部署起来相对比较方便,不需要安装额外依赖。

  1. 部署时,需要将UI静态文件服务与Query服务放置于同一台服务器。
  2. Collector服务可以任意部署到某台机器上。
  3. 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();

参考

Comments