一、链路追踪分析和 Jaeger UI 简介
在咱们开发和运维的工作里,应用程序就像一个大迷宫,很多服务相互调用,一旦出了问题,要找到问题根源就像大海捞针。链路追踪分析就是解决这个问题的好帮手,它能记录每个请求在各个服务间的调用过程,让我们清楚看到请求的来龙去脉。
Jaeger 是一款开源的链路追踪工具,而 Jaeger UI 就是它的可视化界面。通过 Jaeger UI,我们可以直观地查看调用链、分析性能瓶颈。比如说,一个电商应用,用户下单涉及到商品服务、订单服务、支付服务等多个服务的调用,Jaeger UI 就能把这些调用关系清晰地展示出来。
二、Kubernetes 中 Jaeger 的部署
2.1 前提条件
在 Kubernetes 里部署 Jaeger,得先有一个正常运行的 Kubernetes 集群。可以是本地的 Minikube 集群,也可以是云服务商提供的 Kubernetes 服务。另外,还得有一定的权限来创建和管理 Kubernetes 资源。
2.2 部署步骤
这里以 Helm 来部署 Jaeger 为例(Helm 是 Kubernetes 的包管理工具,就像手机里的应用商店,能方便地安装和管理应用)。
# 技术栈:Kubernetes
# 添加 Jaeger 的 Helm 仓库
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
# 更新 Helm 仓库
helm repo update
# 创建一个命名空间
kubectl create namespace jaeger
# 使用 Helm 安装 Jaeger
helm install jaeger jaegertracing/jaeger -n jaeger
上面的代码里,首先添加了 Jaeger 的 Helm 仓库,这样就能从这个仓库获取 Jaeger 的安装包。然后更新仓库,保证获取到最新的包。接着创建了一个名为 jaeger 的命名空间,把 Jaeger 安装在这个命名空间里,避免和其他应用冲突。
三、Jaeger UI 的使用
3.1 访问 Jaeger UI
部署好 Jaeger 后,要访问 Jaeger UI。可以通过端口转发的方式,让本地能访问到集群里的 Jaeger UI 服务。
# 技术栈:Kubernetes
# 端口转发
kubectl port-forward -n jaeger svc/jaeger-query 16686:16686
执行上面的命令后,在浏览器里打开 http://localhost:16686 就能看到 Jaeger UI 界面了。
3.2 查找追踪数据
在 Jaeger UI 界面,有个搜索框。可以根据服务名、操作名、时间范围等条件来查找追踪数据。比如,在电商应用里,想查看订单服务的调用情况,就在搜索框里输入订单服务的名称,然后选择合适的时间范围,点击搜索按钮,就能看到相关的追踪数据。
3.3 查看调用链
搜索到追踪数据后,会看到一个调用链列表。点击其中一个调用链,就能看到详细的调用链信息。调用链就像一棵树,从根节点开始,每个节点代表一个服务的调用。比如,用户下单请求从前端服务开始,然后调用订单服务,订单服务又调用商品服务和支付服务,在 Jaeger UI 里就能清晰地看到这个调用过程。
四、调用链排查示例
4.1 问题描述
假设在一个微服务架构的应用里,用户反馈下单后很久都没有收到订单确认信息。我们要通过 Jaeger UI 来排查问题。
4.2 排查步骤
4.2.1 确定问题时间范围
根据用户反馈的时间,在 Jaeger UI 里设置合适的时间范围,这样能缩小排查范围。
4.2.2 查找相关调用链
在搜索框里输入订单服务的名称,搜索这个时间范围内的调用链。
4.2.3 分析调用链
找到相关调用链后,查看每个服务的调用时间。比如,发现订单服务调用支付服务的时间特别长,那就重点排查支付服务。
{
"traceId": "1234567890abcdef",
"spans": [
{
"spanId": "abcdef1234567890",
"operationName": "orderService",
"startTime": 1630492800000,
"duration": 1000
},
{
"spanId": "0987654321fedcba",
"operationName": "paymentService",
"startTime": 1630492801000,
"duration": 5000
}
]
}
从上面的示例可以看到,订单服务调用时间是 1 秒,而支付服务调用时间是 5 秒,明显支付服务有问题。
4.2.4 深入排查
进一步查看支付服务的详细信息,可能发现是支付服务连接数据库的时间过长,或者是支付接口响应慢等问题。
五、应用场景
5.1 性能优化
通过 Jaeger UI 分析调用链,可以找出性能瓶颈。比如,在一个视频流应用里,发现视频转码服务调用时间长,就可以对转码算法进行优化,或者增加转码服务器的资源。
5.2 故障排查
当应用出现故障时,Jaeger UI 能快速定位问题所在。比如,在一个社交应用里,用户反馈无法发布动态,通过 Jaeger UI 查看调用链,发现是动态服务和存储服务之间的调用出了问题。
5.3 服务依赖分析
可以清晰地看到各个服务之间的依赖关系。在一个金融应用里,通过 Jaeger UI 可以知道账户服务依赖于用户服务和交易服务,这样在进行服务升级或维护时,就能提前做好准备。
六、技术优缺点
6.1 优点
- 可视化强:Jaeger UI 能把复杂的调用链以直观的图形方式展示出来,即使是没有太多技术背景的人员也能看懂。
- 分布式支持:在分布式系统里,能很好地追踪请求在各个服务间的调用过程。
- 开源免费:可以自由使用和修改代码,降低了使用成本。
6.2 缺点
- 数据存储压力:随着业务量的增加,追踪数据会越来越多,对存储的要求也会提高。
- 配置复杂:在大规模的集群里,部署和配置 Jaeger 可能会比较复杂。
七、注意事项
7.1 数据采样
为了减少数据存储压力,可以对追踪数据进行采样。比如,只采集 10% 的请求数据。在 Jaeger 里可以通过配置采样策略来实现。
# 技术栈:Kubernetes
sampling:
type: probabilistic
param: 0.1
上面的配置表示采用概率采样,采样率是 10%。
7.2 存储选择
要根据业务需求选择合适的存储方式。比如,如果对查询性能要求高,可以选择 Elasticsearch 作为存储;如果对成本比较敏感,可以选择 Cassandra。
7.3 性能影响
在应用里添加链路追踪代码会对性能有一定影响,要合理控制追踪的范围和频率。
八、文章总结
链路追踪分析在现代的微服务架构里非常重要,而 Jaeger UI 是一款强大的链路追踪可视化工具。通过在 Kubernetes 里部署 Jaeger,我们可以方便地使用 Jaeger UI 来查看调用链、排查问题。在使用过程中,要注意数据采样、存储选择和性能影响等问题。总之,掌握 Jaeger UI 的使用能帮助我们更好地开发和运维应用,提高应用的性能和稳定性。
评论