乌克兰国旗 我们与在乌克兰的朋友和同事站在一起。如需支持乌克兰度过难关,请访问此页面

故障排除

解决常见问题

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

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

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

验证采样策略

在其他一切之前,请务必确认正在使用的采样策略。对于开发目的或低流量场景,采样所有跟踪很有用。在生产环境中,您可能希望使用较低的采样率。当诊断后端为何未收到 Span 时,请务必将 SDK 配置为*采样所有跟踪*。通常,采样策略可以通过环境变量设置。

OpenTelemetry SDKs

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

使用标准输出导出器

OpenTelemetry SDKs 可以配置一个将记录的 Span 打印到 `stdout` 的导出器。启用它可以让您验证 Span 是否实际被记录。

远程采样

Jaeger 后端支持远程采样,即集中配置采样策略并使其可供 SDK 使用。一些(但并非所有)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 后端组件作为容器运行时,常见的错误包括:

  • 未将适当的端口暴露到容器外部。例如,收集器可能正在容器网络命名空间内部的 `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 的调试镜像,其中包括编译时禁用优化且包含 delve 调试器外部链接 - Jaeger 分布式追踪平台 的 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}",
        }
    ]
}