2. 核心指标采集:数据流水线延迟、吞吐量、错误率、数据质量与资源利用率

监控系统建好了,接下来就是往里面填东西——采集哪些指标?

说实话,我见过不少团队一上来就铺几百个指标,结果告警风暴天天炸,真正出问题时反而被淹没了。我个人习惯是:先抓五个核心维度,把这五个看住了,流水线基本不会翻车。

五个核心维度速览

  • 延迟 —— 数据从源头到目标花了多久
  • 吞吐量 —— 单位时间处理了多少数据
  • 错误率 —— 失败任务/记录的比例
  • 数据质量 —— 空值率、异常值等
  • 资源利用率 —— CPU、内存、IO
数据流水线核心指标采集体系 数据流水线核心指标采集体系 核心指标采集 延迟 吞吐量 错误率 数据质量 资源利用率 端到端延迟 · 队列等待 记录/秒 · 字节/秒 失败率 · 重试次数 空值率 · 异常值 CPU · 内存 · IO 💡 采集原则 • 每个维度至少采集 2-3 个子指标,避免单一指标误判 • 延迟和吞吐量要配合看:延迟高不一定有问题,吞吐量也高说明正常 • 错误率 + 数据质量是“双保险”,一个看系统,一个看数据

2.1 延迟:数据到底卡在哪了?

延迟是流水线最直观的健康指标。说白了,就是数据从源头到目标花了多久。

我一般把延迟拆成三个层次来采集:

  • 端到端延迟:从数据产生到写入目标存储的总耗时。比如 Kafka 生产时间戳到 Hive 分区写入时间戳的差值。
  • 阶段延迟:每个处理环节的耗时。比如 Extract 阶段、Transform 阶段、Load 阶段各花了多少秒。
  • 队列等待时间:数据在缓冲区或消息队列里排队的时间。这个指标特别容易被忽略。

我的经验:有一次流水线延迟从 5 分钟飙到 30 分钟,端到端告警响了。我一看阶段延迟,发现 Extract 只慢了 2 秒,但队列等待时间从 10 秒变成了 25 分钟——原来是下游消费能力跟不上。如果只看端到端,你根本不知道问题出在哪。

采集方式很简单,在关键节点埋时间戳:

# 伪代码示例:在数据记录中埋入时间戳
def process_record(record):
    record['_ingest_ts'] = int(time.time() * 1000)  # 入口时间
    # ... 处理逻辑 ...
    record['_output_ts'] = int(time.time() * 1000)  # 出口时间
    record['latency_ms'] = record['_output_ts'] - record['_ingest_ts']
    return record

2.2 吞吐量:流水线到底能扛多少?

吞吐量衡量的是单位时间内处理的数据量。我常用两个口径:

  • 记录数/秒:适合行式数据,比如 MySQL CDC 的变更事件数。
  • 字节数/秒:适合批量或流式场景,比如 Kafka Topic 的字节流入速率。

为什么要两个都看?举个例子:

有一次我发现记录数/秒没变,但字节数/秒翻了一倍。排查后发现上游某个表新增了一个大文本字段,单条记录从 200 字节变成了 2KB。记录数没涨,但网络和磁盘 IO 压力已经上来了。如果只看记录数,你根本意识不到问题。

注意:吞吐量采集要区分“瞬时值”和“平均值”。瞬时值用于发现毛刺,平均值用于容量规划。我个人习惯两个都采,但告警阈值只设瞬时值。

2.3 错误率:别等数据丢了才发现

错误率是流水线的“疼痛指数”。我把它分成两类:

错误类型 示例 采集方式
任务级错误 Spark Job 失败、SQL 执行超时 任务调度系统 API + 日志解析
记录级错误 数据格式不匹配、字段截断 处理逻辑中 try-catch 计数

任务级错误通常直接触发告警,记录级错误则容易被忽略。我曾经遇到过一个场景:每天有 0.1% 的记录因为日期格式问题被丢弃,任务本身是成功的,但业务方发现数据对不上了。从那以后,我坚持在每条流水线里加一个“脏数据计数器”。

# 记录级错误采集示例
error_count = 0
total_count = 0
for record in batch:
    total_count += 1
    try:
        process(record)
    except Exception as e:
        error_count += 1
        log_error(record, e)

# 上报指标
emit_gauge('pipeline.error_rate', error_count / total_count)

2.4 数据质量:空值率和异常值

数据质量是流水线监控里最容易被忽视的维度。系统跑得再稳,数据是脏的,一切白搭。

我主要关注两个指标:

  • 空值率:关键字段(比如订单 ID、用户 ID)的空值比例。突然升高通常意味着上游 schema 变更或数据源异常。
  • 异常值:数值字段的分布异常。比如金额字段出现负数,或者年龄字段出现 200 岁。

采集方式:在 Transform 阶段增加数据质量检查算子,对每个字段做规则校验。规则可以简单到“非空检查”,也可以复杂到“均值 ± 3σ 范围检查”。

举个例子,我曾经维护过一个用户画像流水线。某天年龄字段的空值率从 2% 突然跳到 15%。排查后发现上游数据源新增了一个渠道,该渠道不采集年龄信息。如果没有空值率监控,这个问题可能要等到业务方反馈才会被发现——那时候已经影响了好几天的模型训练。

2.5 资源利用率:别让基础设施拖后腿

最后一个是基础设施层面的指标。CPU、内存、IO 这三个是标配。

资源 关键子指标 常见问题
CPU 使用率、平均负载、iowait CPU 打满导致任务排队
内存 使用率、Swap 使用量、GC 频率 OOM 导致任务被 kill
IO 磁盘读写速率、IOPS、延迟 磁盘瓶颈导致吞吐量下降

这里我想强调一点:资源利用率要和流水线指标联动看。比如 CPU 使用率 90% 不一定有问题,但如果同时吞吐量下降、延迟上升,那说明资源已经成了瓶颈。

避坑指南:我曾经在监控系统里只采集了 CPU 使用率,没采集 iowait。有一次磁盘坏了,iowait 飙到 80%,但 CPU 使用率只有 30%。我盯着 CPU 看了一下午,愣是没发现问题。后来加了 iowait 指标,这种坑再也没踩过。

2.6 指标采集的落地建议

说了这么多,最后给几个落地建议:

  1. 先少后多:刚开始只采上面五个维度的核心子指标,跑通后再逐步细化。
  2. 统一采集代理:用 Telegraf、Prometheus Node Exporter 或自研 Agent 统一采集,避免每个组件各自为政。
  3. 打标签:每个指标带上流水线名称、阶段、主机等标签,方便后续聚合和过滤。
  4. 设置基线:运行一周后自动计算基线,用基线代替固定阈值做告警。

嗯,核心指标采集就这些。把这五个维度看住了,你的流水线监控就有了骨架。剩下的就是根据业务场景往里填肉了。