链路追踪之Jaeger安装与使用

官方给出的特性介绍:

分布式上下文传递
分布式事务监控
根本原因分析
服务依赖分析
性能、延迟优化
可扩展性

Jaeger的后端为无单点故障设计,可随时根据需要进行扩展;uber每天使用它处理几十亿级别的span。

span,表示一个逻辑工作单元,包含有操作名称、起始时间以及操作耗时。span之间可以存在嵌套和并排关系,span之间也有顺序。
1
原生支持OpenTracing

通过span引用以有向无环图表示trace
支持强类型的span tag和结构化日志
通过baggage支持分布式的上下文传递
Jaeger的后端,webUI,以及相关的框架适配库的设计实现都是支持OpenTracing标准的;
另外,开头提到的OpenTelemetry也是兼容OpenTracing的,所以博主推荐直接使用OpenTelemetry的API,点击这里查看OpenTelemetry对各家语言和框架的SDK和适配库(英文称Instrumentation)。

云原生部署

官方已将Jaeger后端打包为docker镜像发布;
二进制文件支持CLI选项、ENV、配置文件方式三种方式加载配置;
K8s部署, 参考Kubernetes operator, Kubernetes templates and a Helm chart.
可观测性
Jaeger后端组件均支持暴露指标到Prometheus(其他监控后端也支持);
Log是通过第三日志库zap写到stdout

向后兼容Zipkin client
如果你已经使用Zipkin作为trace平台,并且希望迁移到Jaeger,不用太担心;
无需重写client代码,Jaeger后端支持Zipkin格式的span,只需要将数据的转发目的地指向Jaeger后端就行。

其创造者发布了一本书Mastering Distributed Tracing,其中涵盖了Jaeger的设计和操作的方方面面,以及常见的分布式链路追踪。

关于两者的选择,也是见仁见智吧;我个人的看法,如果你或你的团队主要使用Go语言开发,我仍然建议使用Jaeger,这样在使用过程中遇到库方面的问题后,你能够方便的查询client源码或Jaeger源码来定位问题,甚至也许你可以自己解决问题,或者也能够在Github上高效的反馈bug或提问;
另外,可以方便我们阅读源码学习其中的设计之道。

3. 安装
为方便演示,使用官方推荐的Docker快速启动方式:
docker run -d --name=jaeger -p6831:6831/udp -p16686:16686 jaegertracing/all-in-one:latest

浏览器Web UI: http://localhost:16686/

注意:这个docker镜像封装的jaeger是把数据放在内存中的,仅用于测试,正式使用需指定后端存储。


4. 使用
现在需要一点数据让我们把页面操作起来。

4.1 启动一个应用
这个应用是Jaeger仓库中的一个示例
这里我通过源码启动:

git clone git@github.com:jaegertracing/jaeger.git jaeger
cd jaeger/examples/hotrod
go run ./main.go all
1
2
3
同样提供了docker镜像启动方式,参考示例链接。

访问hotrod的webUI:http://127.0.0.1:8080

大坑:博主在第一次访问这个页面的时候,速度极慢,点击按钮无反应,花费一两个小时才找到问题所在,简单来说,你本地必须要能够*才可以正确访问这个页面,因为页面加载时会加载一个外网地址的js文件,这个你通过F12可以看到。(这里我真的吐了,开了单子给他们,我想不明白一个本地的示例为啥要去公网加载一个js文件,不能放到本地?)
2020-08-20更新:repo主已经合并博主提交的修复此坑的PR,但请注意,这个页面还会加载一个线上的js和css文件,不过这两不需要*就可以访问。

吐槽完了还得继续,下面是正确加载后的页面,左上角有个id,每次刷新都会生成一个新的;
四个按钮分别代表四个客户,点击一个按钮就会给他下单一辆车并送过去,就是一个下单请求,响应数据是车牌号以及预计到达时间。


4.2 发送请求
点击一个按钮,发送下单请求,效果见下图

分别是车牌号,预计到达时间,请求序列号,请求耗时。

4.2 Jaeger查看服务架构
切换到Jaeger webUI,点击上面的System Architecture --> DAG (directed acyclic graph,有向无环图)

这就是我们启动的hotrod的微服务架构图,可以看到有几个服务,依赖关系如何。
首先,这里有四个服务(真实的),两个存储(组件模拟的),其中的数字就是请求调用次数,图中展示了redis调用的次数最多,有点纳闷,回到Jaeger 主页面看看。

4.3 查看一个trace

通过前面的架构图可以指定,frontend是最上层服务,通过它应该可以查询到所有的调用记录。

上一篇:极简!一个注解就能创建Jaeger的Span


下一篇:Centos7——目录与路径