订阅更新

数据质量出问题业务先发现——指标的监控告警和SLA怎么定?

指标管理手册 第 16 题 约 9 分钟读完

本文目录
  1. 先说结论
  2. 业务场景:业务先发现的连续3次事故
  3. 方法一:3层监控架构
  4. 方法二:可达性监控(最基础)
  5. 方法三:完整性监控(量级异常)
  6. 方法四:合理性监控(业务规则)
  7. 方法五:分级SLA + 值班机制
  8. 面试高频追问
  9. 实战踩坑:告警群5000条消息淹没真正告警
  10. 总结

先说结论

监控的3个层次:①数据可达性(数据来没来)②数据完整性(量对不对)③数据合理性(值合不合理)。三层依次递进,缺一不可。

SLA要分级,告警要分人:P0(北极星指标)→ 5分钟告警+值班On-call、P1(核心业务指标)→ 30分钟告警+Owner通知、P2(一般指标)→ 4小时告警+邮件。分级才能让真正重要的告警被看见。

最关键是「基线告警」而不是「固定阈值」。DAU今天800万、明天850万都正常,但突然变成500万就异常。固定阈值会噪声爆炸,必须用历史基线(同比、环比、3-sigma)。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

「这个数怎么是0?」「DAU怎么变成负数?」——业务方在BI上发现问题、然后发邮件骂数据团队,是最丢人的工作模式。这道题考的是主动发现问题的能力——从指标监控、SLA定义、告警分级到值班响应。我在某出海硬件品牌做指标治理时建立了一套完整的监控告警体系,把"业务先发现"事故从月均5起降到0,下面拆给你看。

业务场景:业务先发现的连续3次事故

出海硬件品牌V0时期连续3周发生「业务先发现」事故:

Markdown

## 事故复盘
 
| 周次 | 现象 | 根因 | 业务影响 |
| --- | --- | --- | --- |
| W1 | 印度GMV显示0 | 上游印度库连接断开6小时 | 周报数据缺失 |
| W2 | DAU跳到原来3倍 | 测试账号没过滤上线 | CEO误判 |
| W3 | 客单价为负 | 退款金额没限制取整 | BI报表崩溃 |
 
## 共性:数据团队全部是被业务投诉后才知道

CDO直接拍桌:"再有下次,整个团队OKR降级"。从那以后我把监控告警建成了P0项目,3个月把事故清零。

方法一:3层监控架构

数据质量监控分3层,每层都不能少:

层级校验内容技术实现触发频率
可达性数据是否按时到达扫表分区+ETL任务状态ETL完成时检查
完整性数据量是否符合预期行数同比/环比+空值率T+1每日
合理性数值是否在合理区间3-sigma+业务规则T+1每日

方法二:可达性监控(最基础)

数据没到 = 数据是错的。先解决这层。我用Airflow Sensor + 自研Watchdog两套机制:

# 1. 分区到达检查(每张核心表必须有)
@task
def check_partition_arrival(table, dt, expected_time):
    if not partition_exists(table, dt):
        elapsed = now() - expected_time
        if elapsed > timedelta(hours=2):
            send_alert(level='P0', table=table,
                       message=f'{table}/{dt} 已延迟2小时')
        elif elapsed > timedelta(minutes=30):
            send_alert(level='P1', ...)
        return False
    return True
 
# 2. ETL任务状态监控
for task in core_etl_tasks:
    if task.status == 'failed':
        send_alert(level='P0', task=task)
    elif task.duration > task.sla * 1.5:
        send_alert(level='P1', task=task, message='SLA即将违规')

出海硬件品牌每张核心表都接了这套监控,可达性问题从W1事故的6小时盲区,缩短到平均10分钟内告警+值班介入。

方法三:完整性监控(量级异常)

行数突变是最常见的数据问题。基线告警公式:

-- 行数同比/环比双重检查
WITH today AS (
  SELECT COUNT(*) AS cnt FROM dwd_order_pay WHERE dt='${today}'
), yesterday AS (
  SELECT COUNT(*) AS cnt FROM dwd_order_pay WHERE dt=DATE_SUB('${today}',1)
), last_week AS (
  SELECT COUNT(*) AS cnt FROM dwd_order_pay WHERE dt=DATE_SUB('${today}',7)
)
SELECT
  today.cnt AS today_cnt,
  (today.cnt - yesterday.cnt) * 1.0 / yesterday.cnt AS dod_rate,  -- 环比
  (today.cnt - last_week.cnt) * 1.0 / last_week.cnt AS wow_rate   -- 同比
FROM today, yesterday, last_week;
 
-- 告警条件:环比变化>30% 且 同比变化>20% (双确认)
-- 单一维度变化容易误报(比如周末环比一定下降),双确认才靠谱

这套"环比+同比双确认"机制把误报率从40%降到5%以下。出海硬件品牌完整性告警的精确率(真异常/总告警)从30%提到85%。

方法四:合理性监控(业务规则)

最难的一层。每个核心指标必须有业务规则约束:

-- 业务规则示例(每条都要写到DQC平台)
 
-- 规则1:DAU不能为0(业务永远有用户)
ASSERT dau > 0;
 
-- 规则2:DAU不能超过MAU(基础逻辑)
ASSERT dau <= mau;
 
-- 规则3:客单价合理区间(基于历史3-sigma)
ASSERT avg_order_value BETWEEN 
  (SELECT AVG(aov) - 3*STDDEV(aov) FROM history_30d) AND
  (SELECT AVG(aov) + 3*STDDEV(aov) FROM history_30d);
 
-- 规则4:金额必须>=0(防退款金额变成正数)
ASSERT pay_amount >= 0 AND refund_amount >= 0;
 
-- 规则5:指标间一致性(GMV ≈ AOV × 订单数)
ASSERT ABS(gmv - aov * order_cnt) / gmv < 0.01;

出海硬件品牌每个核心指标平均挂了8-12条业务规则。开始觉得繁琐,跑3个月后发现这些规则救命无数次。

方法五:分级SLA + 值班机制

光监控不响应没用。SLA分级+值班机制:

级别对应指标告警时效响应时间通知渠道
P0北极星指标、对外披露5分钟内30分钟内电话+短信+IM+邮件
P1核心业务指标30分钟内2小时内短信+IM+邮件
P2一般指标4小时内工作日24h邮件
P3实验性指标T+1工作日48h邮件

On-call值班轮值,每周轮换。值班手册里写明每类告警的处理SOP。出海硬件品牌实施后P0平均响应时间稳定在20分钟内。

面试高频追问

追问一:3-sigma基线告警有什么坑?

3个坑:①数据不服从正态分布时(如付费转化率是长尾)3-sigma会漏掉异常 ②历史窗口选短了(如7天)容易把渐变趋势识别成正常 ③节假日/大促等周期性变化无法用3-sigma描述。改进做法:①对长尾分布用分位数(P5-P95)替代3-sigma ②历史窗口用90天 ③特殊日期独立建模(如"双11特定日")。出海硬件品牌还试过Prophet/LSTM做时序预测,效果不错但复杂度高,最后P0用Prophet、P1用3-sigma的组合。

追问二:误报多了怎么办?

两层治理:①规则层——每条告警规则跑1个月精确率(真异常/总告警),<60%的规则强制重写或下线。②机制层——告警合并(同一根因的多个告警合并发一条)+ 告警抑制(已知问题30分钟内不再告警)+ 告警升级(P2连续3次升P1)。出海硬件品牌的告警噪声从每天200+降到20-30,值班同学的体验完全不同。

追问三:怎么衡量监控体系做得好不好?

4个核心指标:①故障发现源(业务先发现/数据团队主动发现 比例,目标0%业务先发现)②MTTD平均故障发现时间(目标<10分钟)③MTTR平均恢复时间(目标<2小时)④告警精确率(目标>80%)。出海硬件品牌做到业务先发现0%、MTTD 8分钟、MTTR 1.2小时、精确率87%——这套数字直接决定数据团队的Reputation。

实战踩坑:告警群5000条消息淹没真正告警

出海硬件品牌V1的告警体系上线第一周,告警群一天发出5000+条告警——值班同学的IM被刷爆,真正P0告警淹没在噪声里,反而漏掉了一次P0。第二天我连夜重构了告警机制:①告警合并(同根因聚合)②告警分级路由(P0+P1才发IM,P2+P3只发邮件)③告警抑制(30分钟去重)④告警精确率监控(每周清理低质量规则)。

教训:告警系统的KPI不是「告警数」,是「真正被人看到并处理的告警比例」。"all alert is no alert"——告警太多等于没告警。这是监控系统设计的核心philosophy,做监控前一定要先想清楚。

总结

回答这道题的高分结构:先讲3层监控(可达性/完整性/合理性)→ 给基线告警(同比+环比双确认、3-sigma)→ 给SLA分级+值班 → 给治理(误报降噪、精确率监控)→ 给量化(业务先发现0%、MTTD 8分钟)。强调"all alert is no alert"——能讲出这层philosophy就是Senior+。

下一篇聊一个偏业务的话题:指标值突然异动30%——同环比异常归因到底怎么做?

你们公司告警精确率多少?P0告警平均多久响应?评论区聊聊~

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器