4. 故障排查前置准备:部署 Jaeger All-in-One 环境、配置采样策略、接入微服务应用
在变更冻结闸口触发告警后,快速定位故障根因的前提是具备完整的分布式追踪数据采集能力。本节将指导你完成 Jaeger 环境的搭建、采样策略的配置以及微服务应用的链路接入,为后续的故障排查奠定数据基础。
4.1 Jaeger All-in-One 环境部署
All-in-One 模式将 Jaeger 的五大核心组件(Agent、Collector、Query、UI、Storage)打包为单一进程,适用于开发测试、小规模演示以及故障排查的临时环境。生产环境建议使用微服务部署模式,但 All-in-One 足以支撑本章的闸口故障模拟场景。
| 组件 | 功能 | All-in-One 中的角色 |
|---|---|---|
| jaeger-agent | 接收应用端 UDP 数据,批量转发至 Collector | 内嵌,监听端口 6831/6832 |
| jaeger-collector | 接收并校验 Span 数据,写入存储后端 | 内嵌,监听端口 14268/14250 |
| jaeger-query | 提供 API 与 UI 查询接口 | 内嵌,监听端口 16686 |
| jaeger-ui | Web 可视化界面,用于链路搜索与 Trace 详情查看 | 内嵌,通过 Query 端口访问 |
| Storage | 持久化 Span 数据(内存/ES/Cassandra) | 默认使用内存存储(Badger) |
部署步骤(Docker 方式,推荐用于快速搭建):
# 拉取 Jaeger All-in-One 镜像
docker pull jaegertracing/all-in-one:1.60
# 启动容器,暴露 UI 端口 16686 和 Agent 端口 6831
docker run -d --name jaeger \
-p 16686:16686 \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 14268:14268 \
jaegertracing/all-in-one:1.60
# 验证部署:访问 http://localhost:16686 应看到 Jaeger UI 界面
排查提示: 若 UI 无法访问,请检查 Docker 容器日志:
docker logs jaeger。常见问题包括端口冲突或内存不足导致 Badger 存储启动失败。
4.2 采样策略配置
在变更冻结闸口场景中,我们需要确保关键业务链路的采样率足够高,以捕获偶发故障。Jaeger 支持三种采样模式:头采样(Head-based)、尾采样(Tail-based) 和 自适应采样。对于故障排查前置准备,我们采用头采样中的概率采样与速率限制采样组合策略。
采样策略配置方式:
- 环境变量方式:启动 Collector 或 Agent 时通过
--sampling.strategies-file指定 JSON 配置文件。 - API 动态下发:Collector 提供
/api/sampling端点,Agent 定期拉取策略。
推荐策略配置(JSON 格式):
{
"service_strategies": [
{
"service": "gateway-service",
"type": "probabilistic",
"param": 1.0
},
{
"service": "order-service",
"type": "rate_limiting",
"param": 100
},
{
"service": "payment-service",
"type": "probabilistic",
"param": 0.5
}
],
"default_strategy": {
"type": "probabilistic",
"param": 0.1
}
}
| 策略类型 | 参数含义 | 适用场景 |
|---|---|---|
| probabilistic | param=0.5 表示 50% 的请求被采样 | 高流量服务,按比例采样 |
| rate_limiting | param=100 表示每秒最多采集 100 个 Span | 关键服务,保证固定采样速率 |
| const | param=1 全部采样,param=0 全部不采样 | 调试或全量审计场景 |
变更冻结闸口特别提醒: 对于被闸口拦截的请求(即返回 503 或自定义错误码的请求),建议在应用层强制标记采样,确保故障链路 100% 被记录。可通过 Jaeger 的
sampling.priority Tag 实现。
4.3 微服务应用接入 Jaeger
应用接入 Jaeger 的核心是集成 OpenTelemetry SDK,通过 Tracer 创建 Span 并注入上下文。以下以 Java 和 Go 两种语言为例,展示如何将微服务接入 Jaeger 链路追踪。
Java 应用接入(使用 OpenTelemetry Java Agent):
# 下载 OpenTelemetry Java Agent
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
# 启动应用时附加 Agent,并指定 Jaeger 导出器
java -javaagent:opentelemetry-javaagent.jar \
-Dotel.traces.exporter=jaeger \
-Dotel.exporter.jaeger.endpoint=http://localhost:14250 \
-Dotel.resource.attributes=service.name=order-service \
-jar order-service.jar
Go 应用接入(使用 OpenTelemetry Go SDK):
import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/sdk/resource"
"go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
)
func initTracer() (*trace.TracerProvider, error) {
// 创建 Jaeger Exporter
exp, err := jaeger.New(jaeger.WithCollectorEndpoint(
jaeger.WithEndpoint("http://localhost:14250"),
))
if err != nil {
return nil, err
}
// 配置 TracerProvider
tp := trace.NewTracerProvider(
trace.WithBatcher(exp),
trace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String("payment-service"),
)),
)
otel.SetTracerProvider(tp)
return tp, nil
}
接入验证: 启动应用后,访问 Jaeger UI(http://localhost:16686),在 Service 下拉框中应能看到
order-service 和 payment-service。执行一次业务请求,等待 10-30 秒(Span 批量上报延迟),点击 Find Traces 即可看到链路数据。
4.4 整体架构与数据流
下图展示了 Jaeger All-in-One 环境、采样策略配置以及微服务应用接入后的完整数据流。应用通过 OpenTelemetry SDK 生成 Span,经 Agent 或直接发送至 Collector,最终存储并展示在 UI 中。
4.5 接入验证与常见问题
完成部署与接入后,执行以下验证步骤确保链路数据正常上报:
- 检查服务列表:在 Jaeger UI 的 Service 下拉框中确认所有接入服务均已出现。
- 执行测试请求:调用一次完整的业务链路(如创建订单 -> 支付)。
- 查找 Trace:在 UI 中按服务名或标签搜索,确认能查到对应的 Trace 记录。
- 检查 Span 详情:点击 Trace 查看 Span 列表,确认包含预期的操作名称和标签。
| 常见问题 | 可能原因 | 解决方案 |
|---|---|---|
| UI 中看不到服务 | Agent 或 Collector 端口不通 | 检查防火墙规则,确认 telnet localhost 6831 可通 |
| Span 上报延迟高 | Batch 间隔配置过长 | 调整 OTEL_BSP_SCHEDULE_DELAY 为 1000ms |
| 采样率未生效 | 策略文件未正确加载 | 查看 Collector 日志中 sampling strategies loaded 信息 |
| 内存存储溢出 | All-in-One 默认内存限制 | 增加 Docker 内存限制或切换为 Elasticsearch 存储 |
最佳实践: 在变更冻结闸口场景中,建议为每个微服务配置独立的采样策略,并对闸口拦截的请求设置
sampling.priority=1 标签,确保故障链路不丢失。同时,将 Jaeger UI 的查询时间范围设置为最近 15 分钟,便于快速定位实时故障。