一、链路追踪分析和 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 的使用能帮助我们更好地开发和运维应用,提高应用的性能和稳定性。