3. 数据采集策略与工具链

问题排查的起点是现象识别,但真正让现象“开口说话”的是精准的数据采集。本章围绕排查流程中的数据采集环节,讲解如何根据现象特征选择正确的指标、日志、分布式追踪或性能剖析工具,并构建可复用的采集策略。

数据采集黄金法则:宁可多采一个无用量,不可漏采一个关键量。采集阶段应保持“宽口径”,在后续分析阶段再剪枝。

3.1 现象识别与采集策略映射

不同现象类型对应不同的数据采集优先级,如下表所示。建议在出现问题时,先按表快速匹配初始采集方向。

现象特征首选采集手段辅助采集手段
响应延迟、超时分布式追踪(Trace)系统指标(CPU/网络)
内存溢出、CPU飙升Profiling(CPU/内存)系统指标(内存/CPU)
磁盘IO高、吞吐下降系统指标(IO)日志(错误/慢查询)
业务逻辑错误、异常堆栈日志采集(结构化日志)Trace(上下文关联)
偶发性能抖动系统指标(持续监测)+ ProfilingTrace(采样)

3.2 系统指标采集 — 资源级“心电图”

系统指标是所有排查的基础层数据。常用工具有 node_exporter + Prometheus、Telegraf、collectd。关键采集项包括:

  • CPU:利用率、上下文切换、运行队列长度
  • 内存:可用/总量、交换分区使用率、OOM次数
  • 磁盘:IOPS、吞吐量、await、%util
  • 网络:带宽利用率、重传率、连接队列溢出

典型采集配置示例(Prometheus + node_exporter):

# /etc/prometheus/prometheus.yml 片段
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
    scrape_interval: 15s
    metrics_path: '/metrics'

3.3 日志采集 — 多维度的“黑匣子”

结构化日志(JSON/Protobuf)是诊断业务逻辑错误的利器。推荐工具链:

  • 采集:Filebeat / Fluentd / Vector
  • 传输:Kafka / 直接写入ES
  • 存储检索:Elasticsearch + Kibana / Loki + Grafana

日志字段应包含:timestamp、level、service、trace_id、message、error_stack。以下是一个标准JSON日志行:

{
  "timestamp": "2025-04-07T10:32:15.123Z",
  "level": "ERROR",
  "service": "payment-api",
  "trace_id": "abc123def456",
  "message": "支付超时,商户ID: 8876",
  "error_stack": "com.example.PaymentException: timeout\n  at ..."
}

3.4 Trace采集 — 分布式请求的全路径回放

在微服务架构中,Trace(链路追踪)是定位延迟和错误传递的关键。主流工具:

  • OpenTelemetry(标准SDK+协议)
  • Jaeger(存储+UI)
  • Zipkin(轻量级替代)

采集策略建议:

  1. 固定采样率:生产环境建议10%头部采样,结合错误标签100%采样。
  2. 尾部采样:对已完成请求按规则过滤(如耗时>P99)保留完整Trace。
  3. 分布式上下文传播:必须统一W3C TraceContext协议。

3.5 Profiling工具选型 — 代码级“手术刀”

当系统指标和日志无法解释CPU或内存异常时,需要借助Profiling进行代码级分析。常见类型对比:

Profiling类型适用场景常用工具采集开销
CPU采样高CPU / 热点函数pprof、async-profiler低(~1%-3%)
内存堆转储内存泄漏 / 大对象jmap、heap profiler (go tool pprof)中(临时停顿)
Wall-clock采样锁竞争 / Blockingasync-profiler、perf中
IO/网络栈磁盘延迟、网络瓶颈ioprof、bpftrace低-中
生产环境Profiling注意事项:
1. 务必在预发或低峰期先验证工具对应用延迟的影响。
2. 对Java应用,建议使用 async-profiler 替代jstack,避免Safepoint偏差。
3. 持续Profiling(如Phlare、Parca)可保留历史火焰图,适合排查偶发性能问题。

3.6 采集决策树:从现象到工具链

下图为问题排查中数据采集工具的选择逻辑。当新现象出现时,按直觉回答决策点问题,快速定位最有效的采集手段。

数据采集策略决策树 问题现象已识别 涉及分布式调用或跨服务延迟? 分布式追踪 (Trace) Jaeger / Zipkin / OTel CPU/内存/IO指标异常? 性能剖析 (Profiling) pprof / async-profiler / perf 资源利用率接近上限? 系统指标采集 Prometheus + node_exporter / Telegraf 日志采集 Filebeat / Fluentd → ES / Loki 决策说明 • “分布式调用”指跨服务、跨进程请求;若单体应用首选日志+系统指标。 • “CPU/内存异常”指持续高利用率或OOM,此时Profiling提供最直接证据。 • 若所有指标正常但业务依然报错,日志采集往往是最后一道防线。

3.7 采集策略与后续环节衔接

完成数据采集后,进入原因定位阶段。注意以下衔接要点:

  • 保留原始上下文:采集到的指标、日志、Trace必须携带实例标识和环境标签,方便聚合分析。
  • 避免过度采集:高频指标(如1s间隔)持续存储成本高,生产环境建议将原始数据保留7天,降采样后保留30天。
  • 自动化触发:配置告警规则,当指标或日志出现特定模式时自动拉起Profiling或Trace全量采样(例如:CPU>90%持续5分钟触发5分钟持续Profiling)。
实战技巧: 在Kubernetes环境中,可以利用 kubectl top pod 快速获取实时指标,结合 kubectl exec 进入容器运行 top、perf 等命令进行单点排查。但大规模场景仍建议使用集中式采集工具链。