Jaeger 分布式追踪:从安装到应用实践
1. 追踪采样
理解追踪采样至关重要,因为不同的采样类型具有不同的特点,且会影响应用程序中捕获的追踪数量。Jaeger 提供了以下几种采样选项:
| 采样类型 | 描述 | 示例 |
| — | — | — |
| 常量采样(Constant) | 对每个可能的追踪始终做出相同的决策。设置为 1 时采样所有追踪,设置为 0 时忽略所有追踪。 | 大多数演示应用使用值为 1 的常量采样器来捕获所有追踪。在生产环境中,仅适用于请求不多的应用。 |
| 概率采样(Probabilistic) | 使用权重来确定采样追踪的可能性。 | 给定值为 0.2 时,大约每 10 个追踪中会采样 2 个。 |
| 速率限制采样(Rate limiting) | 确保以恒定速率采样追踪。 | 值为 4.0 表示 Jaeger 每秒采样 4 个请求。 |
| 远程采样(Remote) | 如果未设置其他配置,则为默认采样类型。Jaeger 代理根据 Jaeger 后端的配置远程提供采样类型。 | - |
2. 设置 Minikube 环境
为后续的追踪示例做准备,需要设置 Minikube 环境,包含 Apache Kafka、PostgreSQL 数据库、账户服务和透支服务。具体步骤如下:
minikube start --memory 4096
kubectl create namespace kafka
kubectl apply -f 'strimzi-cluster-operator-0.25.0.yaml' -n kafka
kubectl apply -f kafka_cluster.yml -n kafka
kubectl wait kafka/my-cluster --for=condition=Ready --timeout=300s -n kafka
kubectl apply -f kafka_topics.yml -n kafka
kubectl apply -f postgresql_kubernetes.yml
3. 安装 Jaeger
在 Minikube 中使用 Jaeger 操作符来安装 Jaeger,具体步骤如下:
1. 创建命名空间:
kubectl create namespace observability
- 安装自定义资源定义(CRDs):
kubectl create -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/crds/jaegertracing.io_jaegers_crd.yaml
- 创建 Jaeger 操作符相关资源:
kubectl create -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/service_account.yaml
kubectl create -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/role.yaml
kubectl create -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/role_binding.yaml
kubectl create -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/operator.yaml
- 验证 Jaeger 操作符是否就绪:
kubectl get deployment jaeger-operator -n observability
要使 jaeger - operator 就绪,其 READY 状态应为 1/1。
5. 安装 Minikube 的 ingress 插件:
minikube addons enable ingress
- 使用一体化镜像部署 Jaeger:
kubectl apply -n observability -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simplest
EOF
使用以下命令查看 Jaeger 组件是否成功启动:
kubectl get pods -n observability
注意 :一体化镜像不建议用于生产环境。
- 获取 Jaeger 控制台的 URL:
kubectl get -n observability ingress
打开浏览器访问该 URL 即可看到 Jaeger 控制台。
4. 使用 Jaeger 进行微服务追踪
部署所有微服务以查看追踪情况:
eval $(minikube -p minikube docker-env)
/chapter11/account-service> mvn verify -Dquarkus.kubernetes.deploy=true
/chapter11/overdraft-service> mvn verify -Dquarkus.kubernetes.deploy=true
/chapter11/transaction-service> mvn verify -Dquarkus.kubernetes.deploy=true
在进行追踪之前,验证三个服务是否正常运行:
kubectl get pods
当服务就绪后,从账户中取款使账户透支:
TRANSACTION_URL=`minikube service --url transaction-service`
curl -H "Content-Type: application/json" -X PUT -d "600.00" ${TRANSACTION_URL}/transactions/123456789/withdrawal
刷新 Jaeger 控制台页面,从服务下拉菜单中选择服务并点击“Find Traces”进行追踪搜索。
以下是 Jaeger UI 的搜索参数说明:
| 参数 | 描述 |
| — | — |
| 服务下拉菜单(Service) | 选择要搜索追踪的服务。 |
| 操作名称(Operation name) | 用于筛选特定操作的追踪。 |
| 追踪标签(Tags) | 根据追踪上的标签进行筛选。 |
| 搜索时间段 | 指定搜索追踪的时间范围。 |
| 最小持续时间(Min Duration)和最大持续时间(Max Duration) | 帮助查找执行时间过长的有问题的追踪。 |
| 结果限制(Limit Results) | 将结果限制为特定数量的追踪。 |
点击追踪结果可查看更多详细信息,包括追踪的方法、开始时间、总持续时间、服务数量、追踪深度和跨度数量等。每个跨度以水平条表示,其长度表示完成时间,位置表示开始和结束时间,颜色表示所属服务。
5. 追踪规范
5.1 OpenTracing
OpenTracing 由 API 规范以及为各种语言实现该规范的框架和库组成。它不是官方标准,是云原生计算基金会(CNCF)的一部分。其目标是使应用程序和框架开发人员能够在项目中包含追踪工具,而无需绑定到特定的追踪供应商。Jaeger 是可以接受使用 OpenTracing 创建的追踪的后端之一。
5.2 MicroProfile OpenTracing
MicroProfile OpenTracing 基于 OpenTracing 构建,不定义自己的 API。它支持 OpenTracing 支持的任何追踪格式,并且无需开发人员在应用程序代码中进行交互即可实现追踪的捕获和传播。它通过从传入的 JAX - RS 请求中提取 SpanContext 信息来实现无代码追踪传播,默认情况下会对每个 JAX - RS 端点进行追踪。还提供了
@Traced
注解,可用于指定特定方法或类的所有方法创建跨度,并且可以修改默认的跨度名称。
5.3 OpenTelemetry
2019 年 3 月,OpenTracing 和 OpenCensus 社区合并为 OpenTelemetry 项目。OpenTracing 实现追踪 API,OpenCensus 有用于指标的 API,合并后旨在将应用程序的可观测性作为现代应用的内置功能。2021 年初,OpenTelemetry 发布了通用可用的追踪 API,截至 2021 年 8 月,指标功能接近完成,日志功能预计在 2022 年完成。MicroProfile 社区正在探索 OpenTelemetry 对现有指标和 OpenTracing 规范的影响。
6. 自定义应用程序追踪
使用
@Traced
注解可以自定义跨度名称,为名称赋予更多含义。例如,修改
AccountResource
的
withdrawal
方法:
@Traced(operationName = "withdraw-from-account")
重新部署账户服务:
mvn verify -Dquarkus.kubernetes.deploy=true
进行取款操作:
curl -H "Content-Type: application/json" -X PUT -d "2500.00" ${TRANSACTION_URL}/transactions/111222333/withdrawal
刷新 Jaeger 控制台页面,搜索账户服务的追踪,点击最新的追踪结果并展开账户服务的跨度部分,即可看到跨度名称已变为
withdraw_from_account
。
通过以上步骤,我们可以全面了解 Jaeger 的安装、配置、使用以及如何进行自定义追踪,从而更好地监控和优化微服务应用程序。
Jaeger 分布式追踪:从安装到应用实践
7. 追踪采样总结
为了更清晰地对比不同的追踪采样类型,我们将其关键信息汇总成如下表格:
| 采样类型 | 特点 | 适用场景 | 示例配置 |
| — | — | — | — |
| 常量采样(Constant) | 决策固定,设置 1 采样所有追踪,设置 0 忽略所有追踪 | 演示应用或请求量少的生产应用 |
quarkus.jaeger.sampler-type=const
,
quarkus.jaeger.sampler-param=1
|
| 概率采样(Probabilistic) | 使用权重确定采样可能性 | 按一定比例采样追踪 |
quarkus.jaeger.sampler-type=probabilistic
,
quarkus.jaeger.sampler-param=0.2
|
| 速率限制采样(Rate limiting) | 以恒定速率采样追踪 | 控制采样速率 |
quarkus.jaeger.sampler-type=rate-limiting
,
quarkus.jaeger.sampler-param=4.0
|
| 远程采样(Remote) | 由 Jaeger 代理根据后端配置远程提供采样类型 | 默认配置情况 | - |
8. 微服务追踪流程梳理
下面通过 mermaid 格式的流程图来梳理使用 Jaeger 进行微服务追踪的整体流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(设置 Minikube 环境):::process
B --> C(安装 Jaeger):::process
C --> D(部署微服务):::process
D --> E{服务是否就绪?}:::decision
E -->|是| F(进行取款操作):::process
E -->|否| D
F --> G(刷新 Jaeger 控制台):::process
G --> H(选择服务并搜索追踪):::process
H --> I(查看追踪详细信息):::process
I --> J([结束]):::startend
9. 追踪规范对比
为了更好地理解不同的追踪规范,我们将 OpenTracing、MicroProfile OpenTracing 和 OpenTelemetry 进行对比,如下表所示:
| 规范名称 | 所属组织 | 核心功能 | 特点 |
| — | — | — | — |
| OpenTracing | 云原生计算基金会(CNCF) | 提供 API 规范及多语言实现库 | 不绑定特定供应商,促进追踪工具的通用性 |
| MicroProfile OpenTracing | - | 基于 OpenTracing,支持追踪捕获和传播 | 无代码追踪传播,提供
@Traced
注解自定义 |
| OpenTelemetry | - | 合并 OpenTracing 和 OpenCensus,统一应用可观测性 | 整合追踪和指标功能,未来将支持日志 |
10. 自定义追踪的优势
使用
@Traced
注解自定义跨度名称具有以下优势:
-
提高可读性
:自定义的跨度名称能够更清晰地表达操作的含义,方便开发人员和运维人员理解追踪信息。
-
便于调试
:在查找问题时,更具描述性的跨度名称可以帮助快速定位到具体的操作,提高调试效率。
-
优化监控
:通过自定义跨度名称,可以更精准地对特定操作进行监控和分析,从而优化微服务的性能。
11. 生产环境注意事项
在生产环境中使用 Jaeger 进行微服务追踪时,需要注意以下几点:
1.
避免使用一体化镜像
:一体化镜像不适合生产环境,需要根据实际需求配置存储、收集器和查询组件。
2.
合理选择采样类型
:根据应用的请求量和业务需求,选择合适的采样类型,避免存储过多不必要的追踪数据。
3.
确保配置正确
:在每个服务中正确配置 Jaeger 的相关参数,特别是
service-name
,避免追踪信息混淆。
4.
监控资源使用
:追踪会消耗一定的系统资源,需要监控资源使用情况,确保不会对应用性能产生过大影响。
12. 总结
通过本文的介绍,我们详细了解了 Jaeger 的追踪采样、安装部署、微服务追踪以及追踪规范等内容。掌握这些知识可以帮助我们更好地使用 Jaeger 对微服务进行追踪和监控,及时发现和解决问题,提高微服务应用的稳定性和性能。同时,在实际应用中要根据不同的场景和需求,合理选择和配置相关参数,确保追踪系统的有效性和可靠性。
希望本文能为你在微服务追踪方面提供有价值的参考,让你在使用 Jaeger 时更加得心应手。
超级会员免费看
1016

被折叠的 条评论
为什么被折叠?



