乌克兰国旗 我们与我们在乌克兰的朋友和同事站在一起。如需在乌克兰需要帮助时提供支持,请访问此页面。

故障排除

解决常见问题

版本  2.6 最新 前往最新的 1.x 版本

Jaeger 后端本身是一个分布式系统,由不同的组件组成,可能运行在许多主机上。有时其中一个活动部分可能无法正常工作,导致 Span 未能处理或存储。如果出现问题,请务必检查此处列出的各项内容。

如果您正在使用 OpenTelemetry Collector 作为管道的一部分,请务必查看其自身的故障排除指南外部链接 - Jaeger 分布式追踪平台

验证采样策略

首先,请务必确认正在使用哪种采样策略。对于开发目的或低流量场景,采样所有 Trace 非常有用。在生产环境中,您可能希望使用较低的采样率。在诊断后端未收到 Span 的原因时,请务必将 SDK 配置为采样所有 Trace。通常,采样策略可以通过环境变量设置。

OpenTelemetry SDKs

如果您正在使用 OpenTelemetry SDKs,它们应默认使用 parentbased_always_on 采样器,这实际上是 100% 采样。可以通过 OTEL_TRACES_SAMPLER 环境变量更改(请参阅文档外部链接 - Jaeger 分布式追踪平台)。

使用 stdout Exporter

OpenTelemetry SDKs 可以配置一个 Exporter,将记录的 Span 打印到标准输出。启用它允许您验证 Span 是否实际被记录。

远程采样

Jaeger 后端支持远程采样,即集中配置采样策略并使其对 SDKs 可用。部分(而非全部)OpenTelemetry SDKs 支持远程采样,通常通过扩展实现(详情请参阅迁移到 OpenTelemetry)。

如果您怀疑远程采样工作不正常,请尝试以下步骤

  1. 确保 SDK 实际已配置为使用远程采样,指向正确的采样服务地址(请参阅API),并且该地址可从您应用程序的网络命名空间访问。
  2. 验证服务器是否为您的服务返回了适当的采样策略
    $ curl "jaeger-collector:14268/api/sampling?service=foobar"
    {"strategyType":"PROBABILISTIC","probabilisticSampling":{"samplingRate":0.001}}

绕过中间采集器

如果您的应用程序没有直接发送数据到 Jaeger,而是发送到中间层,例如作为主机代理运行的 OpenTelemetry Collector,请尝试将 SDK 配置为直接发送数据到 Jaeger,以缩小问题范围。

网络连接

如果您的 Jaeger 后端仍然无法接收 Span(请参阅以下章节了解如何检查日志和指标),则问题很可能出在您的网络命名空间配置上。将 Jaeger 后端组件作为容器运行时,典型的错误包括

  • 未将适当的端口暴露在容器外部。例如,Collector 可能在容器网络命名空间内部监听 :4317 端口,但该端口无法从外部访问。
  • 使用 localhost 作为服务器端点的主机名。在裸机上运行时,localhost 没有问题,但在容器中建议监听 0.0.0.0
  • 未从应用程序的网络命名空间使 Jaeger 的主机名可见。例如,如果您在 Docker 中将应用程序和 Jaeger 后端作为单独的容器运行,它们要么需要在同一命名空间内,要么需要使用 docker 命令的 --link 选项赋予应用程序容器访问 Jaeger 后端的权限。

提高日志详细程度

当日志级别设置为 debug 时,Jaeger 提供有用的调试信息。请参阅监控以了解提高日志详细程度的更多信息。

检查 /metrics 端点

在无法或不希望提高日志详细程度的情况下,可以使用 /metrics 端点检查 Jaeger 如何接收和处理跟踪数据。请参阅监控以了解配置指标生成的更多详细信息。以下是获取指标的示例 curl 调用

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

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

服务网格:缺失的 Span

将应用程序作为 Istio 等服务网格的一部分进行部署时,活动部分的数量会显著增加,并可能影响 Span 的报告方式(以及哪些 Span 被报告)。如果您期望看到服务网格生成的 Span,但它们在 Jaeger UI 中不可见,请检查您正在使用的服务网格的故障排除指南。例如,在Istio 的网站上外部链接 - Jaeger 分布式追踪平台

运行后端组件的调试镜像

我们提供 Jaeger 的调试镜像,其中包括禁用优化编译的 Jaeger 二进制文件和 delve 调试器外部链接 - Jaeger 分布式追踪平台。运行这些镜像时,delve 会触发 Jaeger 作为其子进程执行,并立即附加到它,以开始新的调试会话并开始监听 TCP 端口 12345 以进行远程连接。然后,您可以使用 Visual Studio Code外部链接 - Jaeger 分布式追踪平台GoLand外部链接 - Jaeger 分布式追踪平台 等 IDE 连接到此端口并远程附加,通过添加断点进行调试外部链接 - Jaeger 分布式追踪平台

对于 Visual Studio Code,您需要在本地克隆的 Jaeger 源代码根目录下包含以下配置

$ cat .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch remote",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "remotePath": "",
            "port": 12345,
            "host": "127.0.0.1",
            "cwd": "${workspaceRoot}",
        }
    ]
}