故障排查

Jaeger 后端本身就是一个分布式系统,由不同的组件组成,可能运行在多台主机上。可能其中某个环节没有正常工作,导致 span 无法被处理或存储。出现问题时,请务必检查此处列出的项。

如果你在流水线中使用 OpenTelemetry Collector,请务必查看它自己的 故障排查指南

验证采样策略

在做其他事情之前,首先要确认正在使用哪种采样策略。对于开发场景或低流量场景,采样每个 trace 是很有用的。在生产环境中,你可能希望使用更低的采样率。在诊断为什么后端没有接收到 span 时,请务必将 SDK 配置为 采样每个 trace。通常,采样策略可以通过环境变量设置。

OpenTelemetry SDKs

如果你使用的是 OpenTelemetry SDKs,它们默认应使用 parentbased_always_on 采样器,这实际上等同于 100% 采样。可以通过 OTEL_TRACES_SAMPLER 环境变量进行更改(参见文档)。

使用 debug Exporter

可以为 OpenTelemetry SDKs 配置一个 debug exporter,将记录到的 span 打印到控制台日志中。启用它后,你可以验证这些 span 是否 वास्तव际被记录了。

绕过中间收集器

如果你的应用没有直接将数据发送到 Jaeger,而是发送到中间层,例如运行在主机智能体上的 OpenTelemetry Collector,可以尝试将 SDK 配置为直接向 Jaeger 发送数据,以缩小问题范围。

网络连通性

如果你的 Jaeger 后端仍然无法接收 span(请参见下面有关如何检查日志和指标的部分),那么问题很可能出在网络命名空间配置上。当将 Jaeger 后端组件作为容器运行时,常见错误有:

  • 没有将适当的端口暴露到容器外部。例如,collector 可能在容器网络命名空间内监听 :4317,但该端口无法从外部访问。
  • localhost 用作服务器端点的主机名。在裸金属上运行时,localhost 没问题,但在容器中,建议改为监听 0.0.0.0
  • 没有让 Jaeger 的主机名在应用的网络命名空间中可见。例如,如果你将应用和 Jaeger 后端分别运行在由 containerd 管理的独立容器中,它们要么需要处于同一个网络命名空间,要么应用容器需要使用 nerdctl network connect 连接到与 Jaeger 后端相同的网络。

提高日志详细程度

当日志级别设置为 debug 时,Jaeger 会提供有用的调试信息。

apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
spec:
  service:
    telemetry:
      logs:
        level: debug

检查 /metrics 端点

对于无法或不宜提高日志详细程度的情况,可以使用 /metrics 端点来检查 Jaeger 接收和处理 trace 数据的方式。有关配置指标生成的更多细节,请参见 Configuring the Jaeger Metrics。下面是一个用于获取指标的 curl 示例:

curl -s http://jaeger-collector:8888/metrics

如果 Jaeger 能够接收 trace,计数器 otelcol_receiver_accepted_spans 应该会持续增加。如果它能够成功将 trace 写入存储,计数器 otelcol_exporter_sent_spans 也应以相同的速率增加。

Service Mesh:缺少 span

当将应用部署为 Istio 等 service mesh 的一部分时,涉及的环节会显著增多,并且可能影响 span 的上报方式(以及上报哪些 span)。如果你期望看到由 service mesh 生成的 span,但它们在 Jaeger UI 中不可见,请检查你所使用的 service mesh 的故障排查指南。例如,可参考 Istio's website