故障排除
解决常见问题
Jaeger 后端本身是一个分布式系统,由不同的组件组成,可能运行在许多主机上。其中一个活动部件可能无法正常工作,导致 Span 未能处理或存储。当出现问题时,请务必检查此处列出的各项。
如果您在管道中使用 OpenTelemetry Collector,请务必查阅其故障排除指南 。
验证采样策略
在其他所有操作之前,请务必确认正在使用的采样策略。对于开发目的或低流量场景,采样所有跟踪非常有用。在生产环境中,您可能希望使用较低的采样率。诊断后端未接收到 Span 的原因时,请务必将 SDK 配置为采样所有跟踪。通常,采样策略可以通过环境变量设置。
OpenTelemetry SDKs
如果您使用 OpenTelemetry SDK,它们应默认为 `parentbased_always_on` 采样器,这实际上是 100% 采样。这可以通过 `OTEL_TRACES_SAMPLER` 环境变量更改(请参阅文档 )。
使用标准输出导出器
OpenTelemetry SDK 可以配置一个导出器,将记录的 Span 打印到 `stdout`。启用它可以让您验证 Span 是否确实被记录。
Jaeger SDK(已弃用)
如果您正在使用其中一个 Jaeger SDK,它们默认为概率采样策略,跟踪被记录的概率为 `1/1000`。可以通过设置这些环境变量来更改策略
JAEGER_SAMPLER_TYPE=const
JAEGER_SAMPLER_PARAM=1
例如,当使用适用于 Java 的 Jaeger SDK 时,策略通常在创建追踪器时通过受检测应用程序提供的日志记录工具打印出来
2018-12-10 16:41:25 INFO Configuration:236 - Initialized tracer=JaegerTracer(..., sampler=ConstSampler(decision=true, tags={sampler.type=const, sampler.param=true}), ...)
远程采样
Jaeger 后端支持远程采样,即集中配置采样策略并将其提供给 SDK。部分(但非全部)OpenTelemetry SDK 支持远程采样,通常通过扩展(详情请参阅迁移到 OpenTelemetry)。
如果您怀疑远程采样未能正常工作,请尝试以下步骤
$ curl "jaeger-collector:14268/api/sampling?service=foobar"
{"strategyType":"PROBABILISTIC","probabilisticSampling":{"samplingRate":0.001}}
网络命名空间
如果您的 Jaeger 后端仍然无法接收 Span(请参阅以下关于如何检查日志和指标的部分),那么问题很可能出在您的网络命名空间配置上。当将 Jaeger 后端组件作为 Docker 容器运行时,常见的错误包括:
- 未将适当的端口暴露到容器外部。例如,收集器可能在容器网络命名空间内监听 `:4317`,但该端口从外部无法访问。
- 未将 jaeger-collector 的主机名从应用程序的网络命名空间可见。例如,如果您在 Docker 中将应用程序和 Jaeger 后端运行在不同的容器中,它们要么需要在同一个命名空间中,要么应用程序容器需要使用 `docker` 命令的 `--link` 选项来访问 Jaeger 后端。
增加后端组件的日志记录级别
当日志级别设置为 `debug` 时,Jaeger 提供有用的调试信息。jaeger-collector 会记录其接收到的每个批次以及存储在持久存储中的每个 Span 的信息。
在 jaeger-collector 方面,当指定 `--log-level=debug` 标志时,这些是预期的日志条目
{"level":"debug","ts":1544458854.5406284,"caller":"app/span_handler.go:90","msg":"Span batch processed by the collector.","ok":true}
{"level":"debug","ts":1544458854.5406587,"caller":"app/span_processor.go:105","msg":"Span written to the storage by the collector","trace-id":"e66dc77b8a1e813b","span-id":"6b39b9c18f8ef082"}
{"level":"debug","ts":1544458854.54068,"caller":"app/span_processor.go:105","msg":"Span written to the storage by the collector","trace-id":"e66dc77b8a1e813b","span-id":"d92976b6055e6779"}
{"level":"debug","ts":1544458854.5406942,"caller":"app/span_processor.go:105","msg":"Span written to the storage by the collector","trace-id":"e66dc77b8a1e813b","span-id":"a56f41e38ca449a4"}
检查 /metrics 端点
对于无法或不希望增加 Jaeger 后端日志记录级别的情况,可以使用 `/metrics` 端点来检查是否正在接收特定服务的 Span。`/metrics` 端点由管理端口提供,该端口对于每个二进制文件都不同(请参阅部署)。假设 jaeger-collector 在名为 `jaeger-collector` 的主机下可用,以下是获取指标的示例 `curl` 调用
curl http://jaeger-collector:14269/metrics
以下指标尤为重要
jaeger_collector_spans_received
jaeger_collector_spans_saved_by_svc
jaeger_collector_traces_received
jaeger_collector_traces_saved_by_svc
前两个指标对于同一服务应该具有相似的值。同样,两个 `traces` 指标也应该具有相似的值。例如,这是一个按预期工作的设置示例
jaeger_collector_spans_received{debug="false",format="jaeger",svc="order"} 8
jaeger_collector_spans_saved_by_svc{debug="false",result="ok",svc="order"} 8
jaeger_collector_traces_received{debug="false",format="jaeger",svc="order"} 1
jaeger_collector_traces_saved_by_svc{debug="false",result="ok",svc="order"} 1
Istio:Span 丢失
当您将应用程序作为 Istio 等服务网格的一部分进行部署时,活动部件的数量会显著增加,并可能影响 Span 的报告方式(以及哪些 Span 被报告)。如果您期望看到 Istio 生成的 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}",
}
]
}