及时性校验

及时性校验关注数据是否按时可用:分区产出时间与承诺时间(SLA)比较、最新分区滞后天数、下游开始时间是否早于上游完成时间;及时性问题通常要治调度而不是治数据。

及时性校验是什么

及时性(新鲜度)校验看数据是否按时可用,而不看内容是否正确:分区产出时间与承诺 SLA 的比较、最新分区相对今天的滞后天数、下游开始时间是否早于上游完成时间。及时性问题的根因通常在调度依赖、资源竞争或上游延迟,因此多数情况下要治调度而不是治数据。

基本信息

核心指标产出时间、滞后天数、SLA 达成率、依赖倒挂次数
数据来源调度平台任务结束时间、数仓表最近更新时间、元数据
判定方式超过承诺时间未产出即告警,并要求责任人可追溯
常见根因上游延迟、集群资源竞争、长事务锁、数据量激增
落地位置稽核结果表 + 监控看板,与质量规则共用一套告警通道

典型使用场景

  • 早间报表保障:确认核心表在承诺时间前产出,避免业务侧空等
  • 依赖倒挂排查:下游已开始运行但上游分区还没生成
  • SLA 月度结算:统计各表达成率,识别长期拖尾的任务
  • 容量预警:产出时间持续后移通常预示数据量或资源问题
  • 故障定位辅助:多个表同时延迟往往是集群或公共上游问题

产出滞后检查

产出滞后检查
-- 最新分区与今天相差几天,>0 即存在空缺
SELECT MAX(dt) AS latest_dt,
       DATEDIFF(CURRENT_DATE, MAX(dt)) AS lag_days
FROM dwd_trade_order_detail_di;

-- 分区缺失明细:近 7 天应每天一行,少于 7 行说明有断档
SELECT dt, COUNT(1) AS rows_cnt, MAX(etl_time) AS etl_time
FROM dwd_trade_order_detail_di
WHERE dt >= DATE_SUB(CURRENT_DATE, 7)
GROUP BY dt
ORDER BY dt;

SLA 达成率统计

SLA 达成率统计
-- ready_time 取数仓侧产出时间,promise_time 为承诺时间
SELECT dt,
       COUNT(1) AS task_cnt,
       SUM(CASE WHEN ready_time <= promise_time THEN 1 ELSE 0 END) AS ok_cnt,
       ROUND(SUM(CASE WHEN ready_time <= promise_time THEN 1 ELSE 0 END) / COUNT(1), 4) AS sla_rate,
       ROUND(AVG(TIMESTAMPDIFF(MINUTE, promise_time, ready_time)), 1) AS avg_delay_min
FROM etl_task_ready_log
WHERE dt >= '2026-10-01'
GROUP BY dt
ORDER BY dt;

指标读法

指标含义异常表现
lag_days最新分区距今天数大于 0 说明有分区未产出
ready_time分区可用时间晚于承诺时间即 SLA 未达成
sla_rate按天达成比例连续低于目标说明根因未解决
avg_delay_min平均延后分钟数逐步扩大预示容量或依赖问题
依赖倒挂次数下游先于上游运行大于 0 会出现读空或读旧数据
及时性告警必须区分「还没到点」和「已超时」:按调度计划时间判断,否则凌晨会收到大量无意义提醒,真正超时的那条反而被淹没。
只监控任务失败是不够的:任务成功但产出 0 行、或只写了空分区同样会导致报表读空,及时性校验要同时看产出时间和产出行数。

易错点

  • 只在任务失败时告警,任务成功但没产出数据的情况漏警,报表照样空
  • SLA 只统计任务结束时间而不统计产出可用时间,任务写完元数据还没刷新,报表仍读不到
  • 告警阈值定死在固定时刻,遇到节假日调度调整后大量误报,团队逐渐忽略告警
  • 用查表方式判断新鲜度但不做分区裁剪,大表全扫反而给集群加压
  • 发现延迟只靠人工补跑,不修依赖与资源,同样的问题每天重演

数据来源与参考

  • Apache Airflow 官方文档:SLA 配置
  • 行业数据 SLA 实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌