OpenTelemetry (OTel) 是一个开源项目,旨在为分布式系统(如微服务架构)中的遥测数据收集、处理和导出提供供应商中立的标准。它帮助开发者更轻松地分析软件的性能和行为,从而促进应用问题的诊断和解决。
术语 | 说明 |
---|---|
Trace | 提交给 OTel Server 的数据,是一组相关事件或操作的集合,用于跟踪分布式系统中请求的流转;每个 Trace 由多个 Span 组成。 |
Span | Trace 中的独立操作或事件,包含开始时间、持续时间及其他相关信息。 |
OTel Server | 能够接收和存储 Trace 数据的 OTel 服务器,如 Jaeger、Prometheus 等。 |
Jaeger | 一个开源的分布式追踪系统,用于监控和排查微服务架构,支持与 OpenTelemetry 集成。 |
Attributes | 附加在 Trace 或 Span 上的键值对,用于提供额外的上下文信息,包括 Resource Attributes 和 Span Attributes;详见 Attributes。 |
Sampler | 决定是否采样并上报 Trace 的策略组件。可配置不同的采样策略,如全采样、比例采样等。 |
ALB (Another Load Balancer) | 在集群中分发网络请求到可用节点的软件或硬件设备;平台中使用的负载均衡器(ALB)是七层软件负载均衡器,可配置为通过 OTel 监控流量。ALB 支持将 Trace 提交到指定的 Collector,并允许不同采样策略;还支持配置是否在 Ingress 级别提交 Trace。 |
FT (Frontend) | ALB 的端口配置,指定端口级别的配置。 |
Rule | 端口(FT)上的路由规则,用于匹配特定路由。 |
HotROD (Rides on Demand) | Jaeger 提供的示例应用,用于演示分布式追踪的使用;详情参见 Hot R.O.D. - Rides on Demand。 |
hotrod-with-proxy | 通过环境变量指定 HotROD 内部微服务地址;详情参见 hotrod-with-proxy。 |
确保存在可用的 ALB:创建或使用已有的 ALB,本文档中 ALB 名称用 <otel-alb>
代替。有关创建 ALB 的操作步骤,请参见 Deploy ALB。
确保存在 OTel 数据上报服务器地址:该地址以下称为 <jaeger-server>
。
在集群的 Master 节点,使用 CLI 工具执行以下命令编辑 ALB 配置。
在 spec.config
部分添加以下字段。
完成后的示例配置:
执行以下命令保存更新。更新后,ALB 默认启用 OpenTelemetry,所有请求的 Trace 信息将上报到 Jaeger Server。
启用或禁用 Ingress 上的 OTel
通过配置是否启用 Ingress 上的 OTel,可以更好地监控和调试应用的请求流,追踪请求在不同服务间的传播,识别性能瓶颈或错误。
操作步骤
在 Ingress 的 metadata.annotations 字段下添加如下配置:
参数说明:
true
表示 Ingress 控制器在处理该 Ingress 的请求时启用 OpenTelemetry 功能,即会收集并上报请求的 Trace 信息。设置为 false
或移除此注解则表示不收集或上报请求 Trace 信息。启用或禁用 Ingress 上的 OTel Trust
OTel Trust 决定 Ingress 是否信任并使用来自请求的 Trace 信息(如 trace ID)。
操作步骤
在 Ingress 的 metadata.annotations 字段下添加如下配置:
参数说明:
true
时,Ingress 会继续使用已有的 Trace 信息,有助于保持跨服务追踪的一致性,使整个请求链路能在分布式追踪系统中完整追踪和分析。设置为 false
时,会为请求生成新的追踪信息,可能导致请求进入 Ingress 后被视为新的追踪链,打断跨服务追踪的连续性。在 Ingress 上添加不同的 OTel 配置
该配置允许针对不同的 Ingress 资源自定义 OTel 的行为和数据导出方式,实现对各服务追踪策略或目标的精细化控制。
操作步骤
在 Ingress 的 metadata.annotations 字段下添加如下配置:
参数说明:
以下配置展示了完整的 OTel 配置结构,可用于定义如何在应用中启用和使用 OTel 功能。
在集群 Master 节点,使用 CLI 工具执行以下命令获取完整的 OTel 配置结构。
回显结果:
参数说明:
参数 | 说明 |
---|---|
otel.enable | 是否启用 OTel 功能。 |
exporter.collector.address | OTel 数据上报服务器地址,支持 http/https 协议及域名。 |
flags.hide_upstream_attrs | 是否上报上游规则相关信息。 |
flag.notrust_incoming_span | 是否信任并使用来自请求的 OTel Trace 信息(如 trace ID)。 |
flags.report_http_request_header | 是否上报请求头。 |
flags.report_http_response_header | 是否上报响应头。 |
sampler.name | 采样策略名称;详情见 Sampling Strategies。 |
sampler.options.fraction | 采样率。 |
sampler.options.parent_name | parent_base 采样策略的父策略。 |
默认情况下,如果 ALB 配置了某些 OTel 参数且 FT 未配置,则 FT 会继承 ALB 的参数作为自身配置;即 FT 继承 ALB 配置,而 Rule 可以继承 ALB 和 FT 的配置。
ALB:ALB 上的配置通常是全局和默认的,可配置全局参数如 Collector 地址,供下层 FT 和 Rule 继承。
FT:FT 可以继承 ALB 的配置,未配置的 OTel 参数将使用 ALB 配置。但 FT 也可进一步细化,例如选择性地启用或禁用 FT 上的 OTel,不影响其他 FT 或 ALB 的全局设置。
Rule:Rule 可继承 ALB 和 FT 的配置,也可进一步细化,例如某条 Rule 可选择不信任传入的 OTel Trace 信息,或调整采样策略。
操作步骤
通过在 ALB、FT 和 Rule 的 YAML 文件中配置 spec.config.otel
字段,即可添加 OTel 相关配置。
参数 | 说明 |
---|---|
always on | 始终上报所有追踪数据。 |
always off | 从不上报追踪数据。 |
traceid-ratio | 根据 traceid 决定是否上报。traceparent 格式为 xx-traceid-xx-flag ,其中 traceid 的前 16 个字符代表一个 32 位十六进制整数。若该整数小于 fraction 乘以 4294967295(即 (2^32-1)),则上报。 |
parent-base | 根据请求中 traceparent 的 flag 部分决定是否上报。flag 为 01 时上报,例如:curl -v "http://$ALB_IP/" -H 'traceparent: 00-xx-xx-01' ;flag 为 02 时不上报,例如:curl -v "http://$ALB_IP/" -H 'traceparent: 00-xx-xx-02' 。 |
资源属性(Resource Attributes)
这些属性默认上报。
参数 | 说明 |
---|---|
hostname | ALB Pod 的主机名 |
service.name | ALB 名称 |
service.namespace | ALB 所在命名空间 |
service.type | 默认为 ALB |
service.instance.id | ALB Pod 名称 |
Span 属性
默认上报的属性:
参数 | 说明 |
---|---|
http.status_code | 状态码 |
http.request.resend_count | 重试次数 |
alb.rule.rule_name | 本次请求匹配的规则名称 |
alb.rule.source_type | 本次请求匹配的规则类型,当前仅支持 Ingress |
alb.rule.source_name | Ingress 名称 |
alb.rule.source_ns | Ingress 所在命名空间 |
默认上报但可通过修改 flag.hide_upstream_attrs 字段排除的属性:
参数 | 说明 |
---|---|
alb.upstream.svc_name | 流量转发的 Service(内网路由)名称 |
alb.upstream.svc_ns | 被转发的 Service(内网路由)所在命名空间 |
alb.upstream.peer | 被转发 Pod 的 IP 地址和端口 |
默认不上报但可通过修改 flag.report_http_request_header 字段上报的属性:
参数 | 说明 |
---|---|
**http.request.header.<header>** | 请求头 |
默认不上报但可通过修改 flag.report_http_response_header 字段上报的属性:
参数 | 说明 |
---|---|
**http.response.header.<header>** | 响应头 |
以下 YAML 配置部署一个 ALB,使用 Jaeger 作为 OTel 服务器,Hotrod-proxy 作为示范后端。通过配置 Ingress 规则,当客户端请求 ALB 时,流量将转发到 HotROD。同时,HotROD 内部微服务间的通信也通过 ALB 路由。
将以下 YAML 保存为名为 all.yaml 的文件。
在 CLI 工具中执行以下命令,部署 Jaeger、ALB、HotROD 及所有测试所需的 CR。
执行以下命令获取 Jaeger 的访问地址。
执行以下命令获取 otel-alb 的访问地址。
执行以下命令通过 ALB 向 HotROD 发送请求,此时 ALB 会将 Trace 上报到 Jaeger。
打开第 3 步 获取的 Jaeger 访问地址查看结果。