当前位置: 首页 > 工具软件 > Jaeger > 使用案例 >

Uber 分布式追踪系统 Jaeger 使用介绍和案例【PHP Hprose Go】

农星华
2023-12-01

Uber 分布式追踪系统 Jaeger 使用介绍和案例【PHP Hprose Go】

原文: Uber 分布式追踪系统 Jaeger 使用介绍和案例【PHP Hprose Go】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tcUAYQFH-1670571853655)(https://hjs-1251193177.cos.ap-shanghai.myqcloud.com/ops/ops-jaeger-ui-1.png)]

1. 前言

  随着公司的发展, 业务不断的增加, 模块的不断拆分, 系统间业务调用就变得越复杂, 对定位线上故障带来很大困难。整个调用链不透明, 犹如系统被蒙上一块黑纱, 当线上遇到故障时, 整个技术部就陷入痛苦的漩涡。这时候分布式追踪系统应运而生, 如揭开了黑纱, 让阳光照进黑暗。

2. 分布式系统调用过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rlceXnvO-1670571853655)(https://hjs-1251193177.cos.ap-shanghai.myqcloud.com/ops/ops-jaeger-ui-2.png)]

3. opentracing 协议

 opentracing 是一套分布式追踪协议, 与平台, 语言无关, 统一接口, 方便开发接入不同的分布式追踪系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y9mGhdRE-1670571853656)(https://hjs-1251193177.cos.ap-shanghai.myqcloud.com/ops/ops-jaeger-ui-3.png)]

3.1. 简单理解 opentracing

一个完整的 opentracing 调用链包含 Trace + span + 无限极分类

  • Trace: 追踪对象, 一个 Trace 代表了一个服务或者流程在系统中的执行过程, 如: test.com, redis, mysql 等执行过程。一个 Trace 由多个 span 组成
  • span: 记录 Trace 在执行过程中的信息, 如: 查询的 sql, 请求的 HTTP 地址, RPC 调用, 开始、结束、间隔时间等。
  • 无限极分类: 服务与服务之间使用无限极分类的方式, 通过 HTTP 头部或者请求地址传输到最低层, 从而把整个调用链串起来。

3.2. 相关文档

4. 分布式追踪系统 Jaeger

Jaeger 是 Uber 开发的一套分布式追踪系统, 已在 Uber 大规模使用。并在 2017-9-13 加入 CNCF 开源组织。使用 Jaeger 可以非常直观的展示整个分布式系统的调用链, 由此可以很好发现和解决问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uB18vsyN-1670571853656)(https://hjs-1251193177.cos.ap-shanghai.myqcloud.com/ops/ops-jaeger-ui-4.png)]

4.1. 作用

  • 分布式环境下信息传播
  • 分布式交易监控
  • 展示跨进程调用链
  • 性能优化
  • 定位问题

4.2. 特性

  • 使用 udp 传输数据, 相对于 HTTP, 优点在于, 不用担心 Jaeger 服务宕机或者网络传输有问题而影响正常的业务。缺点就是丢包, 影响了整条调用链。
  • 数据通过 Thrift 进行序列化, 和 json 对比
接口Thrift/bytejson/byte节省
接口 19872396约 1.5 倍
接口 212122916约 1.4 倍
接口 31283018893约 40%
接口 41715822465约 24%
接口 51102514282约 23%

  从中可以看出 thrift 相对 json 减少了不少空间。在我们采集公司接口的数据大小都集中在 10~20k, 所以使用 thrift 会更有优势。

  • 采集策略

Jaeger 官方提供了多种采集策略, 使用者可以按需选择使用

  1. ConstSampler, 全量采集
  2. ProbabilisticSampler , 概率采集, 默认万份之一
  3. RateLimitingSampler , 限速采集, 每秒只能采集一定量的数据
  4. RemotelyControlledSampler , 一种动态采集策略, 根据当前系统的访问量调节采集策略
  1. Go
  2. Java
  3. node
  4. python
  5. php

官方提供了 go, java, node, python 客户端, 其他客户端还在开放中, php 客户端 为个人开发【欢迎 start】

4.3. 部署

4.3.1. 快速部署 ------ All in one Docker image

 all-in-one 是 Uber 官方打包好的镜像, 可以直接部署使用, 但是只能用于测试环境, 不能用于线上, 因为它把数据放入了内存。

docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp \
  -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest

通过 http://localhost:16686 可以在浏览器查看 Jaeger 的后台

4.3.2. 官方提供的使用例子, 需要 go 环境

go get github.com/uber/jaeger
cd $GOPATH/src/github.com/uber/jaeger
make install_examples
cd examples/hotrod
go run ./main.go all

http://localhost:8080 浏览器打开查看

4.3.3. cassandra + docker 部署, 单机模式

docker run -itd
–name=cassandra -p9042:9042
-v /data/cassandra:/var/lib/cassandra
cassandra

4.3.4. 进入容器建立表空间

按照官方 脚本 整理了一份建表语句 jaeger_tables, 进入 cassandra, 执行语句即可创建所需的表。

keyspaces: jaeger_v1_dc

4.4. 运行 jaeger-query

docker run -itd --network=bridge
–name=jaeger-query
-p16686:16686
jaegertracing/jaeger-query
/go/bin/query-linux
–span-storage.type=cassandra
–cassandra.keyspace=jaeger_v1_dc
–cassandra.servers={{ cassandra }}:9042
–query.static-files=/go/jaeger-ui/

4.5. 运行 jaeger-collector

docker run -itd --network=bridge
–name=jaeger-collector
-p14267:14267
-p14268:14268
-p9411:9411
jaegertracing/jaeger-collector
/go/bin/collector-linux
–span-storage.type=cassandra
–cassandra.keyspace=jaeger_v1_dc
–cassandra.servers={{ cassandra }}:9042

4.6. 运行 jaeger-agent

docker run
-itd --network=bridge
–name=jaeger-agent
-p5775:5775/udp
-p6831:6831/udp
-p6832:6832/udp
-p5778:5778/tcp
jaegertracing/jaeger-agent
/go/bin/agent-linux --collector.host-port={{ jaeger-collector }}:14267

5. 跨语言调用案例

  • php
  • Hprose
  • Go【beego】

5.1. beego

  • install beego
go get github.com/astaxie/beego
  • Download trace_example
git clone git@github.com:jukylin/trace_example.git
cd  trace_example
bee run trace_example

5.2. PHP

cd vendor/jukylin/jaeger-php/example
php Hprose.php

5.3. Trace Result View

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IES8W8fI-1670571853656)(https://hjs-1251193177.cos.ap-shanghai.myqcloud.com/ops/ops-jaeger-ui-5.png)]

5.4. PS

 类似资料: