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 中。

Jaeger All-in-One 架构与数据流 微服务 A (gateway-service) 微服务 B (order-service) 微服务 C (payment-service) OpenTelemetry SDK Jaeger Agent UDP 6831/6832 Jaeger Collector HTTP 14268 / gRPC 14250 Storage Badger / 内存 Query + UI HTTP 16686 采样策略配置文件 probabilistic / rate_limiting / const 说明:应用通过 OpenTelemetry SDK 生成 Span, 经 Agent 或直接发送至 Collector,最终存储并展示。

4.5 接入验证与常见问题

完成部署与接入后,执行以下验证步骤确保链路数据正常上报:

  1. 检查服务列表:在 Jaeger UI 的 Service 下拉框中确认所有接入服务均已出现。
  2. 执行测试请求:调用一次完整的业务链路(如创建订单 -> 支付)。
  3. 查找 Trace:在 UI 中按服务名或标签搜索,确认能查到对应的 Trace 记录。
  4. 检查 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 分钟,便于快速定位实时故障。