故障排除
解决常见问题
Jaeger 后端本身是一个分布式系统,由不同的组件组成,可能运行在多台主机上。其中一个可移动部件可能无法正常工作,导致 Span 未被处理或存储。当出现问题时,请务必检查此处列出的项目。
如果您在管道中使用 OpenTelemetry Collector,请务必查看其故障排除指南 。
验证采样策略
在其他一切之前,请务必确认正在使用的采样策略。对于开发目的或低流量场景,采样所有跟踪很有用。在生产环境中,您可能希望使用较低的采样率。当诊断后端为何未收到 Span 时,请务必将 SDK 配置为*采样所有跟踪*。通常,采样策略可以通过环境变量设置。
OpenTelemetry SDKs
如果您正在使用 OpenTelemetry SDKs,它们应默认使用 `parentbased_always_on` 采样器,这实际上是 100% 采样。它可以通过 `OTEL_TRACES_SAMPLER` 环境变量进行更改(参阅文档 )。
使用标准输出导出器
OpenTelemetry SDKs 可以配置一个将记录的 Span 打印到 `stdout` 的导出器。启用它可以让您验证 Span 是否实际被记录。
远程采样
Jaeger 后端支持远程采样,即集中配置采样策略并使其可供 SDK 使用。一些(但并非所有)OpenTelemetry SDKs 支持远程采样,通常通过扩展实现(有关详细信息,请参阅迁移到 OpenTelemetry)。
如果您怀疑远程采样工作不正常,请尝试以下步骤
$ 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 的调试镜像,其中包括编译时禁用优化且包含 delve 调试器 的 Jaeger 二进制文件。运行这些镜像时,delve 会触发 Jaeger 作为其子进程执行,并立即附加到它,以开始新的调试会话并监听 TCP 端口 12345 以进行远程连接。然后,您可以使用像 Visual Studio Code 或 GoLand 等 IDE 连接到此端口并远程附加,通过添加断点执行调试 。
对于 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}",
}
]
}