Jaeger 后端本身是一个分布式系统,由不同的组件组成,可能运行在多台主机上。其中某个运动部件可能无法正常工作,导致 Span 无法被处理或存储。当出现问题时,请确保检查此处列出的项目。
如果你在管道中使用了 OpenTelemetry Collector,请确保查阅其自身的故障排查指南。
验证采样策略
在做其他事情之前,首先确认正在使用的采样策略。对于开发目的或低流量场景,对每条链路追踪进行采样是有用的。在生产环境中,你可能希望使用较低的采样率。在诊断为什么后端没有接收到 Span 时,请确保将 SDK 配置为_采样每条链路追踪_。通常,可以通过环境变量设置采样策略。
OpenTelemetry SDK
如果你使用的是 OpenTelemetry SDK,它们默认使用 parentbased_always_on 采样器,实际上是以 100% 的比例进行采样。可以通过 OTEL_TRACES_SAMPLER 环境变量进行更改(参见文档)。
使用 stdout 导出器
OpenTelemetry SDK 可以配置一个将记录的 Span 打印到 stdout 的导出器。启用它可以让你验证 Span 是否确实被记录。
远程采样
Jaeger 后端支持远程采样,即集中配置采样策略并使其可供 SDK 使用。部分(但非全部)OpenTelemetry SDK 支持远程采样,通常通过扩展实现(详情请参阅迁移到 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 后端。
增加日志详细程度
Jaeger 在日志级别设置为 debug 时会提供有用的调试信息。有关增加日志详细程度的更多详细信息,请参阅监控。
检查 /metrics 端点
对于无法或不希望增加日志详细程度的情况,可以使用 /metrics 端点来检查 Jaeger 如何接收和处理链路追踪数据。有关配置指标生成的更多详细信息,请参阅监控。以下是获取指标的 curl 调用示例:
curl -s http://jaeger-collector:8888/metrics
如果 Jaeger 能够接收链路追踪数据,计数器 otelcol_receiver_accepted_spans 应该在增长。如果它能够成功将链路追踪数据写入存储,计数器 otelcol_exporter_sent_spans 也应该以相同的速率增长。
服务网格:缺失的 Span
当你将应用程序作为服务网格(如 Istio)的一部分进行部署时,运动部件的数量会显著增加,可能会影响 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}",
}
]
}