故障排除
解决常见问题
Jaeger 后端本身是一个分布式系统,由不同的组件组成,可能运行在许多主机上。有时其中一个活动部分可能无法正常工作,导致 Span 未能处理或存储。如果出现问题,请务必检查此处列出的各项内容。
如果您正在使用 OpenTelemetry Collector 作为管道的一部分,请务必查看其自身的故障排除指南 。
验证采样策略
首先,请务必确认正在使用哪种采样策略。对于开发目的或低流量场景,采样所有 Trace 非常有用。在生产环境中,您可能希望使用较低的采样率。在诊断后端未收到 Span 的原因时,请务必将 SDK 配置为采样所有 Trace。通常,采样策略可以通过环境变量设置。
OpenTelemetry SDKs
如果您正在使用 OpenTelemetry SDKs,它们应默认使用 parentbased_always_on
采样器,这实际上是 100% 采样。可以通过 OTEL_TRACES_SAMPLER
环境变量更改(请参阅文档 )。
使用 stdout Exporter
OpenTelemetry SDKs 可以配置一个 Exporter,将记录的 Span 打印到标准输出。启用它允许您验证 Span 是否实际被记录。
远程采样
Jaeger 后端支持远程采样,即集中配置采样策略并使其对 SDKs 可用。部分(而非全部)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 后端组件作为容器运行时,典型的错误包括
- 未将适当的端口暴露在容器外部。例如,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 二进制文件和 delve 调试器 。运行这些镜像时,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}",
}
]
}