做数仓这一行,数据质量监控这个话题,聊起来人人都说重要,做起来却很容易跑偏。我见过不少团队,一开始热情高涨,在监控平台上一口气配了几百条规则,结果上线第一周就被告警轰炸到麻木,一个月后默默把大部分规则都停掉了,只留下几个表记录数的检查,算是给领导有个交代。这个系列前面几篇,我们聊了数据质量的标准怎么定、评估框架怎么搭、监控平台怎么选,这一篇我打算换个视角,不聊平台功能清单,就聊监控任务本身怎么设计、怎么写、怎么调,才能让这套东西真正在数仓里长期站住脚。
这篇文章适合下面这些朋友:正在搭建数据质量监控体系,但感觉网上教程都偏概念化、落到细节就含糊的;已经配了一些监控规则,但天天被误报和漏报折磨的;还有负责数据运维、每天要处理一堆数据问题单,想从“救火”状态里跳出来的人。我会把监控任务拆成三层设计讲清楚,然后给出可以直接抄的SQL写法、阈值算法、调度配置和告警降噪方案,再加上我踩过的坑。
1. 数据质量监控的定位与顶层设计
1.1 先想清楚:监控到底要兜住什么
很多团队在开始做数据质量监控的时候,第一个动作就是急着去写规则,这其实是本末倒置。监控这个东西,本质上是数仓的兜底网,不是奖状墙。它的核心目标不是证明“我们有很多规则”,而是在数据出问题的时候,尽量在业务方发现之前、在错误数据扩散之前,把问题拦住或者把人叫醒。
所以设计监控体系之前,先要做一件事:把数仓的表盘一遍,分出哪些是核心链路。我通常按这个逻辑来分优先级:第一档是直接支撑业务报表、财务对账、经营管理分析的表,这些表出问题,轻则领导看板数据对不上,重则经营决策被错误数据带偏;第二档是给下游数据产品提供基础数据宽表,出问题会导致连锁反应,波及面广但还有缓冲时间;第三档是底层明细表和中间层加工表,虽然业务不直接感知,但它们的质量决定了上面所有层级的质量。如果监控资源有限,就先咬住第一档和第二档,底层的表通过上游血缘关系间接覆盖。
另外要明确一个边界:数据质量监控不是数据稽核。稽核是事后追究责任、核对账实,监控是事前拦截和事中报警。这两件事目标不同,工具和时间窗口也不同。监控讲究快,最好在数据产出后几分钟内发现问题;稽核讲究全,可以按天甚至按周跑批。把这两个目标混在一起,往往会导致监控任务重量不重质,接口越做越重,最后变成每天凌晨跑一大堆对账任务,却对真正的数据突变毫无感知。
1.2 三层架构:规则层、调度层、通知层
我习惯把监控体系拆成三个独立的层面来设计,这样各层可以独立演进,不会互相拖累。
规则层解决的是“检查什么、怎么判断好坏”的问题。这一层本质上是把质量维度的理论翻译成可以执行的SQL或脚本。完整性、准确性、一致性、及时性,每个维度都要落成具体的检查表达式。规则层要有独立的元数据管理能力,每一条规则都要有明确的归属表、字段、业务口径和责任人。
调度层解决的是“什么时候跑、多久跑一次”的问题。数据监控的调度必须跟数据加工任务的调度联动起来。最基础的要求是:监控任务得在它对应的数据表产出之后再触发,否则就会产生大量无意义的告警。这里要注意一个细节:这里说的数据表产出,指的是“数据可用的时间点”,不是任务结束时间。因为有些任务虽然跑完了,但因为重试、补数等原因,数据在短时间内并不稳定,监控跑了也是白跑。
通知层解决的是“出了问题让谁知道、怎么让ta知道”的问题。这一层最容易被低估,很多团队把通知做成了简单的“发一条消息”,结果就是消息发出去没人看,或者看到了也不知道该找谁。通知层要包含接收人、升级策略、消息模板、工单系统对接这几个要素。通知不是终点,响应才是。
1.3 阻塞型与告警型:监控规则的分级策略
在落地规则之前,先把规则分成两类,这会直接影响后面的调度设计。一类是阻塞型规则,一类是告警型规则。
阻塞型规则的意思是:如果这条规则校验不通过,后续依赖这张表的下游任务不应该继续跑。这类规则通常用在核心链路的强约束上,比如财务相关的金额一致性检查、主键唯一性检查、关键分区是否产出。实现方式一般是在调度系统里配置“数据检查通过才放行下游”的依赖关系,或者用类似“任务间依赖+数据质量事件”的机制来实现。好处是能真正阻断脏数据扩散,代价是如果规则本身有缺陷,会把整条链路卡死。
告警型规则则是只管通知,不阻断流程。这类规则覆盖范围可以做得比较大,比如数据量波动、空值率异常、值域分布变化等。它们反映的是数据健康度的变化趋势,不一定是错误,但值得关注。告警型规则适合做成非阻塞的,因为在数据量波动这类场景里,很多波动本身就是正常的业务变化,一刀切去阻断上游任务反而会造成更大事故。
我的建议是,规则上线初期,宁可多设计成“观察型”,跑一段时间积累基线数据后,再把那些真正能命中问题的规则升级为“阻塞型”。这个节奏很重要,一上来就配置大量阻塞型规则的团队,大概率会在两周内因为天天的告警和阻断把自己逼疯。
2. 落地监控规则:从表级到业务语义级
2.1 表级监控:产出、规模、时效三条线
表级监控是最基础也是最不能缺的监控。哪怕其他规则都没配,表级监控至少要做到位。我习惯在表级监控里拉三条线。
第一条线是产出完整性。对于一个分区表,每天必须产出的分区是否存在,是否重复,是否有空分区。这条线最朴素也最有效,能拦住绝大多数“数据没出来”的问题。检查方式很简单,就是查这张表当天的分区数据量。
第二条线是规模稳定性。每天的数据量不能出现忽高忽低的剧烈波动。这里不建议用死板的方式设定数据量阈值,因为数据量本身会受业务自然增长、活动拉新、渠道投放等影响呈趋势性变化。所以波动检测算法远比固定阈值重要,后面我会详细展开。
第三条线是产出时效。每天的数据必须在规定的时间点之前加工完成。这个监控不能靠SQL完成,一般是在调度平台里配置任务完成时间上限,或者在数据资产管理平台里配置“最晚可用时间”的元数据。时效监控的意义在于,即使数据最终是完整的,如果产出太晚,会影响下游的报表发布和决策节奏。
表级监控不追求一次配全,但每配一条,你都要知道这条规则它对应的SLA是什么。没有SLA的表级监控,早晚会变成评估表收集器,一堆数据摆在那里,没人知道是好是坏。
2.2 字段级监控:空值、唯一性、格式、值域
字段级的校验,要从四个维度去拆解。第一个是空值率。这里要特别注意,空值的定义要跟业务口径对齐。有些场景里空字符串和NULL应当等价处理,有些场景里则不能用空字符串填充来规避NULL。检查空值率不能只看有没有空值,要看空值率是否超过了业务的容忍上限。
第二个是唯一性。对于有主键或业务键的表,检查是否出现重复是最重要的规则之一。但这里有个容易被忽略的坑:唯一性的定义要区分表级唯一和分区级唯一。有些表允许跨分区出现相同业务键,但有些表是整表唯一,如果你用分区内group by来判断唯一性,就会漏掉跨分区的重复问题。
第三个是格式合法性。手机号位数、身份证号校验位、日期字段格式、邮箱格式,这些都属于格式校验。格式校验的SQL看起来简单,但要注意兼容历史脏数据。有些历史分区里混进了格式不规范的数据,如果格式规则是全表扫描的,每次跑监控都会报警,时间长了就会形成告警疲劳。
第四个是值域合理性。这个维度最有业务味道。比如订单金额不允许为负、折扣字段只能在0到1之间、年龄段字段的取值范围,这些约束可以直接用约束条件来检查,也可以通过统计分析来发现异常漂移。
字段级监控要配合数据字典来管理。如果一个字段没有在数据字典里定义清晰的业务含义和标准口径,那字段级监控也很难做准确。所以做字段级监控之前,先把表的字段清单和口径梳理一遍,宁可少配规则,也不能把规则配在口径模糊的字段上。
2.3 跨表与业务规则监控
跨表一致性是很多人容易忽略的一块。在数仓里,同一个业务事实经常会在多个表中被冗余存储,比如订单汇总表、明细表、宽表里的金额字段,由于加工口径不同,可能在不同的时间点出现不一致。跨表校验就是把这些表之间的逻辑关系写成比对规则。
一个典型的场景是:日报表里的昨日销售额,应该等于订单明细表里昨日的订单金额加总。两个数对不上,要么是口径有问题,要么是数据漏算或重复计算了。这类规则属于“业务语义级”的监控,价值比纯表级、字段级监控高得多,但成本也高,需要业务方和数仓团队一起把口径定义清楚。
还有一类业务规则是枚举值分布监控。比如订单状态,正常情况下各状态的比例相对稳定。如果某一天“已支付”占比突然大幅下降,而“待支付”占比飙升,这可能意味着支付链路上出了问题。通过频率分布的变化来发现异常,远比等业务方报“数据看着不对”要来得早。
业务规则监控切忌贪多。我见过一个团队给一张表配了30多条业务规则,结果每次跑批光监控时间比加工时间还长。数据质量监控要追求的是每条规则都有明确的故障探测价值,让规则的数量配得上业务的重要性,而不是让规则成为技术债的一部分。
2.4 规则沉淀:从临时排查变成标准模板
数据质量监控有一个容易被忽视的正反馈机制:新规则往往诞生于故障排查。某个早晨业务方反馈报表数据不对,数据组花了两个小时定位到是某张表的某个字段在某种条件下会异常。这个案子处理完之后,真正有价值的动作是把这个排查过程固化成一条监控规则,把临时的事后排查转化为永久的事前预防。
我建议团队建立一套规则模板库,把常见的检查模式沉淀下来,分为几条主线:空值率类、唯一性类、波动类、值域类、跨表一致性类。新接手的同学可以直接从模板库复制,只需修改表名、字段名和阈值参数,不需要从零写SQL。模板库的好处是:监控规则本身的写法有统一的风格和参数规范,后续维护成本大幅降低。
规则模板库的治理也要有节奏。每半年做一次规则健康度评审,把长期没有触发过告警的规则和反复误报的规则都拿出来重新审视。规矩不是写完就完了,规则本身也需要被运营。
3. 监控任务的实现细节与代码示例
3.1 一个标准监控SQL的写法
监控SQL和普通查询SQL有一个很大的区别:监控SQL的结果不是一个数据集合,而是一个判定结论。所以写监控SQL的思路,和写分析的思路完全不一样。我建议每个监控SQL都遵循一个标准结构:先算出当前值,再算出参照值,最后输出一个PASS、WARN、FAIL的判定结果。这样后续无论接监控平台还是做告警脚本,逻辑都很简洁。
以最常见的“表产出分区存在性”检查为例:
WITH check_data AS ( SELECT COUNT(1) AS cnt FROM dwd.dws_order_di WHERE dt = '${biz_date}' ) SELECT CASE WHEN cnt = 0 THEN 'FAIL' WHEN cnt < ${min_threshold} THEN 'FAIL' ELSE 'PASS' END AS check_result, cnt AS current_value FROM check_data;这里有个经验:把阈值参数化,不要硬编码在SQL里。参数化之后,同一个SQL可以被不同的表复用,只需要在监控配置中传不同的参数。这样做的好处很明显,当业务量级变化时,调整阈值不需要改SQL,只需要改配置。
再看一个空值率检查:
SELECT COUNT(1) AS total_cnt, SUM(CASE WHEN user_id IS NULL OR TRIM(user_id) = '' THEN 1 ELSE 0 END) AS null_cnt, ROUND(SUM(CASE WHEN user_id IS NULL OR TRIM(user_id) = '' THEN 1 ELSE 0 END) / COUNT(1), 4) AS null_rate FROM dwd.dws_order_di WHERE dt = '${biz_date}';空值率监控的执行逻辑放在外面判断,比如null_rate大于0.01就FAIL。有些团队习惯把判断逻辑直接写在SQL里,这也可以,但我个人偏好把“计算”和“判定”分离,因为判定的阈值更容易变化,而计算逻辑相对稳定。
3.2 波动检测到底怎么算才不天天误报
数据量波动检测是误报重灾区。很多团队一开始用固定阈值,比如“数据量低于100万就报警”,这在一段时间内可能有效,但业务一旦增长,基数变了,阈值就得频繁调整。还有一种做法是跟昨天的数据量对比,但这碰到周末、月末、节假日就很容易误报。
我实际用过、稳定性比较好的方案是:与近28天的历史同期均值做偏离率比较。核心逻辑是计算当天的数据量和前28天的平均数据量之间的偏离百分比,超过一定阈值就告警。
WITH today AS ( SELECT COUNT(1) AS cnt FROM dwd.dws_order_di WHERE dt = '${biz_date}' ), history AS ( SELECT AVG(cnt) AS avg_cnt FROM ( SELECT dt, COUNT(1) AS cnt FROM dwd.dws_order_di WHERE dt >= date_add('${biz_date}', -28) AND dt < '${biz_date}' GROUP BY dt ) t ) SELECT CASE WHEN today.cnt = 0 THEN 'FAIL' WHEN ABS(today.cnt - history.avg_cnt) / history.avg_cnt > ${warn_rate} THEN 'WARN' ELSE 'PASS' END AS check_result, today.cnt AS current_cnt, ROUND(history.avg_cnt, 2) AS avg_cnt FROM today, history;这个SQL有个需要注意的地方:如果今天是某大型促销活动后的第二天,数据量可能显著低于平时,这时候基于历史均值会误判。所以对于有明显周期性、活动性的业务,要在算法之上再加一个“业务日历”的概念。比如维护一个特殊日期表,标记大促日、节假日、收假后的第一天等,这些日期的监控阈值可以单独设置或直接放宽。
28天窗口的选择也是经验值。太短,比如7天,没法覆盖一个完整的业务周期;太长,比如90天,对近期业务变化的响应会变慢。我一般建议28天起步,可以根据业务节奏调整,但尽量不要短于两周。
3.3 调度编排与告警接收人的配置
调度编排是监控真正落地的关键环节。监控任务的调度不能一刀切地指定“每天几点跑”,而是要依赖上游加工任务的完成事件。具体来说,监控任务需要等待对应表的数据产出任务成功结束后再触发。这一步如果没做对,最常见的结果就是凌晨两点数据还没出来,监控任务三点跑,扫了个空表,报一堆无意义的分区缺失告警。
我常采用的配置方式是:在调度平台里,把监控任务作为数据加工任务的下游节点挂在DAG上,让平台自动处理依赖关系。同时给监控任务设置一个强制超时时间,避免上游任务一直不结束导致监控永远不跑。这个超时机制很简单,比如每天凌晨6点之前必须跑完,超时未执行就自动触发一次检查,确认数据是否真的没产出来。
告警接收人的配置,需要遵循一个原则:告警必须落到人,而不是落到群。群消息容易被刷屏淹没,而且责任不明确。我建议每条规则配置一个主负责人和一个备份负责人。主负责人负责响应处置,备份负责人负责在主负责人失联时兜底。所有通知都要在消息里带上规则负责人和处理入口,让收到告警的人能直接定位到该找谁,而不是在群里来回艾特。
告警消息里还需要包含必要的上下文:规则ID、表名、分区日期、检查结果、当前值、阈值、触发时间。这些信息要一次性给全,不要让人再去后台查。多想一想接收人的体验,如果一条告警消息还要让人去翻文档才能理解是什么意思,那这个告警系统的效率是及格的底线都不到的。
3.4 新规则上线前一定要做的验证
新规则上线前不验证,相当于埋雷。验证分三步,缺一不可。
第一步是历史回放。把要上的规则对过去30天的分区跑一遍,看看它每天会给出什么结果。如果历史回放显示这条规则在过去30天里有10天都在报警,那你就要问自己:是真的数据质量这么差需要立即治理,还是规则阈值设置得太敏感?如果阈值过紧,就调整阈值之后重新回放,直到历史报警率处在合理水平。
第二步是模拟丢弃。挑选一个已经确认出现过数据问题的历史分区,用这个分区去跑规则,确认规则能正确识别出问题。否则就会出现一条规则上线三个月从没报警过,直到某次故障复盘才发现,这条规则在当时其实已经被触发了,只是因为判定逻辑写错了,把异常吞掉了。
第三步是灰度观察。新规则先设置成观察模式,只记录结果不发送告警,观察一周左右,确认规则输出稳定了,再正式开启告警。这一步成本很低,但能避免很多“上线即误报”的尴尬。
4. 告警收敛、降噪与响应机制
4.1 告警不响和告警轰炸之间的平衡
告警系统的两个极端都是灾难。告警不响意味着监控形同虚设,问题发生了你还在睡大觉。告警轰炸同样致命,因为当一个人一天收到两百条告警的时候,他就不会再认真看任何一条了,真正的问题就混在海量信息里溜走了。这个平衡,是所有做数据质量监控的人每天都需要面对的核心难题。
告警降噪要从几个层面同时下手。第一层是源头控制,规则阈值要合理,不要为了显得严格而把阈值压得太低。第二层是聚合降噪,同一个任务、同一个表、同一个数据链路的告警,在短时间内触发多次时只发一次通知,后续告警只有在状态变化时才再次发送。第三层是频率控制,同一规则在30分钟内不重复告警,避免“数据一直异常,消息一直刷屏”的恶性循环。
还要提一个比较反直觉的经验:不是所有规则都需要每分钟跑一次。有些规则,比如空值率、数据量波动,一天跑一次就够了。因为这类问题即使晚几个小时发现,影响也不会立即爆炸。而时效类监控必须在任务完成后几分钟内跑完,否则就失去意义。监控频率不是越密越好,要根据数据问题的“可容忍时长”来设计。
4.2 升级机制与值班SLA
告警发出去之后,并不意味着监控任务结束了。真正负责任的监控体系,必须包含升级机制。我建议把告警分成三个级别:P0、P1、P2。
P0是紧急阻断级,比如核心报表表未产出、金额对不上、线上表数据被清空。这类告警需要立即响应,5分钟内确认,30分钟内给出处置方案。P1是严重级,比如非核心表产出延迟、重要指标波动超预期,15分钟内确认,2小时内处置。P2是一般级,比如某些字段空值率略有上升、边缘报表的数据异常,当天确认即可。
升级策略要自动化。比如P0告警发出后,如果10分钟内没有人确认,自动升级给数据组负责人;再过15分钟如果还没有处理动作,升级给技术总监。很多团队把升级机制做成“人肉”的,出问题了靠打电话逐个找人,这在大规模体系里完全不可持续。
值班SLA要配套一个统一的告警看板。值班同学的手机上装一个APP或者拉一个企微群,所有P0、P1的告警都可以在移动端处理。我在实际实践中发现,值班同学看到一个告警后,大多数情况下第一反应是找一份“处理手册”来指导操作。所以告警系统里最好维护一个知识库,把常见的告警应对步骤、处理SQL、回滚方案都沉淀下来。
4.3 告警文本与复盘流程的标准化
告警文本的标准化程度,直接影响响应效率。我见过很多团队的告警文案写得像天书,比如“check_dws_order_di_result=1”,接收人完全摸不着头脑,还得先去系统里查这条规则是什么。告警文案至少要有下面这些要素:规则名称、检查维度、表名、分区、期望值、实际值、可能影响都可能影响哪些下游、联系人。
举一个我常用的告警消息模板:
【数据质量告警】【P1】 规则: DWD订单宽表-主键唯一性校验 表名: dwd.dws_order_di 分区: 2025-01-20 检查结果: FAIL 期望: 订单ID唯一 实际: 总行数1024,去重行数1023,存在1个重复ID 可能影响: 下游订单汇总报表、经营分析看板 负责人: 数据负责人 处理指引: 先确认是否有重复写入,检查上游同步任务,必要时回刷分区除了告警本身的标准化,还要有告警处置后的复盘机制。每周抽一个固定的时间,把这一周触发过的所有告警过一遍,分成几类:有效告警(确实发现了问题)、误报(阈值或规则有问题)、无效告警(没有产生实际影响的噪音)。通过复盘,持续优化规则的有效性和告警的准确率。这一条,如果坚持做,三个月后你会发现告警数量大幅下降,但命中率显著提升。
5. 常见问题与排查技巧实录
5.1 假告警频发的真实原因
有一条假告警的根源,很多人排查了半天都没想到:上游数据源的业务系统本身在变更。比如业务系统把线下渠道的订单切到新系统时,当天的订单数据量统计口径发生了变化,或者源系统的某个字段维度从“必填”变成了“选填”,导致下游数仓表的空值率瞬间飙升。这种问题的根源不在数仓,却在数仓的监控规则上暴露出来了。
对策是,监控规则要有“数据源变更联动”的机制。当上游业务系统发生版本变更、字段变更、渠道切换时,数据组要能提前收到通知,然后对相关的监控规则做一次回顾和调整。这个联动在很多公司做得很薄弱,业务系统发版跟数仓团队割裂,等到监控开始报警才发现,线已经烧到了眉睫。
还有一种假告警来源于多环境冲突。测试环境的同步任务误写到生产表,或者某一批历史数据被回刷,都会导致监控结果异常。排查这类问题,最有效的工具就是血缘关系分析,从告警表出发,向上游追溯到源系统,一层层确认问题来源。血缘越清爽,排障效率越高。
我整理了一张排查速查表,供参考:
| 现象 | 可能原因 | 排查思路 | 解决对策 |
|---|---|---|---|
| 数据量为0但无告警 | 分区字段被改或写入方式变更 | 核对任务代码和分区字段配置 | 补充“分区必须产出”的强规则 |
| 告警风暴同时十几条告警 | 上游核心任务失败 | 优先看上游依赖和任务状态 | 配置上游聚合监控,避免每条表各自报警 |
| 频繁误报指标波动 | 阈值与业务周期不匹配 | 拉近30天数据分布,看周规律 | 窗口均值+分位数动态阈值替代固定阈值 |
| 规则不生效 | 规则配置时间晚于任务产出 | 查看规则版本发布时间 | 规则灰度验证后再发布,避免线上带病运行 |
5.2 监控任务自己挂了怎么办
监控任务本身也是任务,也会挂。比较扎心的事实是:监控任务挂了往往比数据任务挂了更可怕,因为数据任务挂了至少调度系统会发任务失败告警,而监控任务挂了,可能压根没人在意。尤其是那些配置了“静默模式”或“观察模式”的规则,一旦挂了,可能就是几个月无人问津,数据质量已经悄然崩坏却没有任何提醒。
要解决这个问题,需要给监控任务本身加一层监护。首先是监控任务的成功率统计,任意监控任务连续失败两次自动发告警给数据运维。其次是定期巡检,每天扫一遍监控规则的健康状态,检查最近一周有没有执行记录,执行耗时是否有明显变化,结果分布是否出现异常偏移。
还有一个容易被忽略的细节:监控任务的运行时间要分散,不要全部挤在同一分钟去跑。否则某个波峰时段计算资源紧张,一批监控任务排队超时,也会造成大量假告警。这种做法本质上是给自己的系统制造噪声,是完全可以避免的。
5.3 数据回刷后监控状态如何处理
数据回刷是数仓里的日常。业务口径调整了要回刷,发现历史数据算错了要回刷,补数也要回刷。数据回刷本身不难,难的是回刷之后,监控的状态要怎么处理。如果回刷后的数据推翻了之前监控的结论,那监控平台上的历史告警记录就失真了。
我建议数据回刷和监控平台之间建立联动。回刷前,先暂停受影响表上的监控规则;回刷完成后,重新对回刷涉及的分区跑一遍监控检查,用新的结果覆盖旧的监控记录。否则月底复盘的时候,你会看到一条告警记录着“空值率异常”,但数据实际已经被修正了,这条记录既不能说明历史问题,也不能说明当前状态,只会让人困惑。
这里有个小技巧:回刷后重新跑监控时,不要只是看“现在是不是PASS”,最好把回刷前的FAIL和回刷后的PASS做成一条完整的时间线记录。这样,复盘的时候就能完整看到“什么时候发现问题—什么时候回刷修复—回刷后验证通过”的全过程,对沉淀经验很有价值。
5.4 规则太多管不过来怎么办
监控规则的数量随着时间推移会不断膨胀,因为每次故障都会新增几条规则。这本身是好事,但如果不加治理,规则库会变得越来越重。我见过一个折中的状态:有团队配了上千条监控规则,但每天真正在触发的只有几十条,其余几百条既不报警也不工作,就只是安静地躺在平台里,占据着计算资源,制造着维护压力。
对规则做瘦身,可以按几个维度来。规则健康度:过去90天从未告警过的规则,要么是保护得很好,要么是已经失效,应该人工审核一遍,确定保留还是下线。规则利用率:每条规则在故障排查中被引用过几次,如果从来没有帮助任何一次排查定位过问题,那它的价值就需要打个问号。规则时效性:有些规则是针对临时项目配置的,项目结束后规则就应该跟着下线。
规则治理的最终目标,是让每条规则都有明确的存在理由。规则少不是坏消息,规则多但每一条都有用才是理想状态。定期为规则库做减法,跟定期做资产盘点一样,是负责任的数据团队应该有的习惯。
6. 写在最后:我做质量监控的一些体会
做数据质量监控这几年,我最大的体会是:这个工作的难点不在技术,而在判断。技术层面的SQL写法、调度配置、告警接入,都有成熟的方案可以学,真正的困难是你要不断在“监控太严导致阻塞”和“监控太松形同虚设”之间找那个微妙的平衡点,而且这个平衡点会随着业务阶段的变化而移动。
另一个深刻的体会是:数据质量监控没有“上线即完成”的时刻,它更像是一种持续运营的能力。新表上线要补规则,业务口径调整要改规则,数据链路重构要迁移规则,规则池需要定期做健康度评审,告警的准确率和响应时效要持续跟踪。这些工作琐碎、重复、没有光环,但正是这些不起眼的日常积累,决定了一个数仓在下游出问题的时候,能不能在业务方发现之前把火扑灭。
最后分享一个让我受益很久的小技巧:每次处理完一个数据故障,我都会强制自己多问一句“这条故障如果早一点被发现,哪个监控规则或哪个环节能拦住它?”然后把答案落成一条新的规则或一个流程改进。这样做几轮之后,你会发现团队从“到处救火”逐渐变成了“火还没烧起来就被浇灭”,那才是数据质量监控真正发挥价值的状态。
路是一步一步走的,数据质量的底线也是一条规则一条规则夯实起来的。希望你不用把我踩过的坑再踩一遍,也希望你的监控报表里,每天都能多点PASS,少点FAIL。