数据质量出问题业务先发现——指标的监控告警和SLA怎么定?
本文目录
先说结论
监控的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年大数据老兵,聊技术、聊职场、聊成长