

跨语言分布式追踪系统Jaeger使用介绍和案例【PHP Hprose Go】
source link: https://studygolang.com/articles/11412?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

原文:跨语言分布式追踪系统Jaeger使用介绍和案例【PHP Hprose Go】
随着公司的发展,业务不断增加,模块不断拆分,系统间业务调用变得越复杂,对定位线上故障带来很大困难。整个调用链不透明,犹如系统被蒙上一块黑纱,当线上遇到故障时,整个技术部就陷入痛苦的漩涡。这时候分布式追踪系统应运而生,如揭开了黑纱,让阳光照进黑暗。
分布式系统调用过程
opentracing 协议
opentracing是一套分布式追踪协议,与平台,语言无关,统一接口,方便开发接入不同的分布式追踪系统。
简单理解opentracing
一个完整的opentracing调用链包含 Trace + span + 无限极分类
- Trace:追踪对象,一个Trace代表了一个服务或者流程在系统中的执行过程,如:test.com,redis,mysql等执行过程。一个Trace由多个span组成
- span:记录Trace在执行过程中的信息,如:查询的sql,请求的HTTP地址,RPC调用,开始、结束、间隔时间等。
- 无限极分类:服务与服务之间使用无限极分类的方式,通过HTTP头部或者请求地址传输到最低层,从而把整个调用链串起来。
分布式追踪系统Jaeger
Jaeger是Uber开发的一套分布式追踪系统,已在Uber大规模使用。并在2017-9-13 加入CNCF 开源组织。使用Jaeger可以非常直观的展示整个分布式系统的调用链,由此可以很好发现和解决问题:
- 分布式环境下信息传播
- 分布式交易监控
- 展示跨进程调用链
- 使用udp传输数据,相对于HTTP,优点在于,不用担心Jaeger服务宕机或者网络传输有问题而影响正常的业务。缺点就是丢包,影响了整条调用链。
- 数据通过Thrift进行序列化,和json对比
接口 | Thrift/byte | json/byte | 节省 |
---|---|---|---|
接口1 | 987 | 2396 | 约1.5倍 |
接口2 | 1212 | 2916 | 约1.4倍 |
接口3 | 12830 | 18893 | 约40% |
接口4 | 17158 | 22465 | 约24% |
接口5 | 11025 | 14282 | 约23% |
从中可以看出thrift相对json减少了不少空间。在我们采集公司接口的数据大小都集中在10~20k,所以使用thrift会更有优势。
Jaeger 官方提供了多种采集策略,使用者可以按需选择使用
- ConstSampler,全量采集
- ProbabilisticSampler ,概率采集,默认万份之一
- RateLimitingSampler ,限速采集,每秒只能采集一定量的数据
- RemotelyControlledSampler ,一种动态采集策略,根据当前系统的访问量调节采集策略
官方提供了 go,java,node,python客户端,其他客户端还在开放中,php客户端为个人开发【欢迎start】
快速部署 ------ 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的后台
官方提供的使用例子,需要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 浏览器打开查看
cassandra + docker 部署,单机模式
docker run -itd \
--name=cassandra -p9042:9042 \
-v /data/cassandra:/var/lib/cassandra \
cassandra
进入容器建立表空间
按照官方脚本整理了一份建表语句jaeger_tables,进入cassandra,执行语句即可创建所需的表。
keyspaces:jaeger_v1_dc
运行 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/
运行 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
运行 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
跨语言调用案例
- Hprose
- Go【beego】
beego
- install beego
go get github.com/astaxie/beego
- Download trace_example
git clone [email protected]:jukylin/trace_example.git
cd trace_example
bee run trace_example
- install jaeger-php
- Run Hprose.php
cd vendor/jukylin/jaeger-php/example
php Hprose.php
Trace Result View
- 优步分布式追踪技术再度精进
- Jaeger还在发展中,官方也希望得到社区的支持。
- Jaeger和Jaeger-php,在公司测试环境运行了1个多月,于2017-10-18发布上线。
- 选择好采集策略,日志数据会爆炸性增长。
有疑问加站长微信联系(非本文作者)

Recommend
-
582
很多情况, trace 是分布在不同的应用中的,最常用的远程调用方式就是 Http 。 在这种情况下,我们通常通过增加额外的 Http Header 传递Trace信息,然后将其组织起来。 本...
-
2
欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容:所有原创文章分...
-
10
Envoy 集成 Jaeger 实现分布式链路跟踪2022-01-1425 29 min.当我们的应用架构,从单体系统演变为微服务时,一个永远不可能回避的现实是,业务逻辑会被拆分到不同的服务中。因此,微服务实际就是不同服务间的互相请求和调用。更重要的是,...
-
9
如果你是初次接触服务网格和Envoy,我这里有一篇文章可以帮助你入门。 在微服务架构中,可观测性变得越加重要。我认为这是选...
-
3
Jaeger:Uber不断发展的分布式跟踪 评分: 5.0 作者: Ryan Lu 类别: golang
-
4
使用OpenTelemetry、Spring Cloud Sleuth、Kafka和Jaeger实现分布式跟踪...
-
9
分布式链路追踪Jaeger + Spring Cloud Pig在Rainbond上的实践分享 原创 随着微服务架构的流行,客户端发起的一次请求可能需要涉及到多...
-
5
分布式链路追踪Jaeger + 微服务Pig在Rainbond上的实践分享 ...
-
7
Jaeger-分布式链路追踪系统 - 麦奇 麦奇
-
4
Istio 支持通过 Envoy 代理进行分布式追踪,代理自动为其应用程序生成追踪 span,只需要应用程序转发适当的请求上下文即可。Istio 支持很多追踪系统,包括 Zipkin, Jaeger,Lightstep 和 Datadog,其中 Jaeger 目前已经成为 Istio 默认的分布...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK