0%

jaeger

1. 概述

Jaeger有几个组件:

  • Jaeger-agent:一个无状态的进程,负责接收并转发数据到Jaeger-collector。
  • Jaeger-collector:一个有状态的进程,负责接收并聚合数据,以及提供查询服务。
  • Jaeger-query:一个有状态的进程,负责接收查询请求,并返回结果。

2. 部署

2.1 Jaeger-agen

Jaeger-agent可以部署到node上,所有的数据会发送到collector,collector会聚合数据,query负责查询。然后此node上的所有Application都可以连接此agnet,然后agent把数据发给collector。

1
2
# 14250是Jaeger collector的grpc端口
./jaeger-agent --log-level=debug --reporter.grpc.host-port=localhost:14250

2.2 Jaeger-collector

Jaeger-collector接受数据,然后内部有个队列,类似logstash,把接受的数据都转发个后端存储,比如Elasticsearch, cassandra. 这里有个非常tricky的地方,在使用命令行部署Jaeger-collector和Jaeger-query的时候,需要先指定环境变量export SPAN_STORAGE_TYPE=elasticsearch,这里是我很迷惑的地方,为啥要先指定环境变量SPAN_STORAGE_TYPE,不能也作为参数吗。1

Jaeger-agent和Jaeger-collector都可以支持多种协议,如HTPP, gprc。默认是grpc,而且当要使用HTTP的时候,建议直接连接Collector,而不是Agent。因为Agent使用的UDP接受数据,而非HTTP,并且是grpc的方式,数据结构是protobuffer, 所以对于Web或者mobile的tracing数据,适合用HTTP协议,所以可以发给Jaeger-collector,或者使用一个log service做转发。 2

1
2
# 14250是给Jaeger-agent用的grpc端口,4318是标准的OTLP的HTTP端口。
./jaeger-collector

Jagerger使用的是Opentracing协议,目前已经不维护了,Opentracing协议已经被OpenTelemetry协议取代了。所以不要继续使用Jager的SDK,而应该使用OpenTelemetry的SDK。

2.3 Jaeger-query

Jaeger-query负责查询,可以查询span,也可以查询traces。它是连接后端的存储服务,如ES。它的前端是用React写的SPA,后端是用go写的。然后把前端build并且压缩后,和后端代码一起打包成一个二进制文件,然后启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
# Jager-ui源码根目录
# 修改React代码后打包
yarn build
# 复制package/jaeger-ui/build下的static文件夹和index.html到jaeger-ui/cmd/query/app/ui/actual中

# Jaeger源码路根目录
# 压缩和加后缀
find cmd/query/app/ui/actual -type f | grep -v .gitignore | xargs gzip --no-name
# 运行,注意必须要带-tags ui,不然用的是query/app/ui/placeholder下的文件。
go run -tags ui ./cmd/query
# 打包
go build -tags ui ./cmd/query
# 找到单体程序query即可

参考资料