去年年底,我负责的一条数据服务链路在凌晨巡检时被抓出一个隐蔽问题:服务进程活着、接口响应正常,但当天凌晨ETL跑完的结果比源系统少了两个分区的数据,下游报表和接口拿到的全是旧值。这类问题在数据中台里太常见了——传统监控体系死死盯着CPU、内存、磁盘,却盯不住“数据对不对”“数据有没有按时流到下游”“服务对外承诺的SLA有没有破”。数据中台中的数据服务监控,说白了就是给中台里所有数据流动和服务承诺装上一套可量化的契约管理,从可用性到性能,从时效性到数据质量,一条都别漏。
这篇文章我想围绕数据服务监控聊聊我从零搭体系、踩坑、反复调整的经验:到底监控什么、指标怎么定、异构系统整合阶段怎么设基线、采集告警链路怎么落地,以及监控结果怎么反哺治理。无论你是数据中台的建设者、数据平台负责人,还是刚接手数据服务运维的工程师,这份内容应该能帮你少走不少弯路。
1. 数据服务监控为什么不是普通监控加一层壳
很多人一开始的思路是:中台不就是一堆服务和任务吗,拿现成的监控工具挂上去不就行了?真这么干的人后面基本都后悔了。数据中台里的服务形态,和常规的业务系统接口有本质区别,先把这个边界划清楚才有后面的体系。
1.1 数据中台里到底有哪几类“数据服务”
咱们得先明确监控对象。我在实际项目里把数据中台里的服务归成四类:
- API数据服务:对外提供数据查询、指标结果、标签画像,典型的是查询接口、指标开放接口,这类服务的形态最接近普通Web服务,监控经验可以直接复用。
- 数据同步与迁移任务:把异构源系统的数据搬到中台,比如Oracle存量数据全量抽取、MySQL分片库增量同步、FTP文件解析入库。这类任务是“一次性+长期”并存的,迁移阶段要盯全量进度,稳定期要盯增量时延。
- 加工计算任务:ETL、SQL批处理、指标计算、特征加工,跑在调度系统里,形态是分布式作业。
- 数据开放与分发服务:定时推送数据集、生成报表、同步到下游数仓或业务库。
这四类的监控难点完全不同。API服务可以用传统的接口监控思路,但任务类服务往往是“进程活着但结果没产出”的典型高发区,加工类服务则要看重跑、依赖和输出正确性。如果只用一套现成平台监控“服务器和端口”,那中台的数据服务等于裸奔。
1.2 普通监控盯“机器活没活”,数据服务监控盯“承诺兑现没兑现”
传统IT监控的核心是:进程存活、端口通不通、CPU高不高、磁盘满没满。这些指标对中台当然有用,但它们回答不了三个致命问题:
- 数据跑完了吗?跑完了对不对?
- 数据按约定的时间送到了吗?如果用P95响应时间看任务,根本没意义,要看到点交付率。
- 下游拿到的数据是最新的吗?还是接口被调用了十次,十次都在返回昨天的缓存?
我用一个比较生活化的类比:普通监控像检查餐馆厨房的煤气灶有没有起火,数据服务监控则关注这桌菜有没有按客人点的菜单、在承诺的时间内端上桌。厨房火再旺,上错菜、少一道菜,在客人那儿就是事故。中台数据服务的“客人”是下游应用、分析师和各类业务决策,他们不关心你中间跑了多少次重试,只关心拿到手的东西对不对、及时不及时。
1.3 为什么这件事不能直接塞进别人家的监控体系
还有一个现实原因:数据服务的问题域是跨层的。接口返回慢,根源可能是上游源系统的数据没到位、加工任务排队、数据模型出错,甚至源端数据库的参数配错,任何一个环节出问题最终都可能表现为“服务异常”。如果监控体系只覆盖最后一层API,你只会收到一个“响应超时”的告警,然后陷入谁都不认账的循环:应用团队说底层数据不对,中台团队说任务跑完了,运维团队说机器一切正常。
这也是我坚持把“数据服务监控”单独拿出来做体系的原因:它需要把数据血缘、任务状态、数据质量、接口性能串成一条线,而不是零散地在各层各挂一块大屏。监控的不是某一个系统,而是从源端到中台到消费者的整个数据供给链路。
基于这个判断,我在设计时会优先考虑“能串联起来”的指标,而不是单个数字漂不漂亮。这一原则贯穿后面所有章节。
2. 指标清单:数据服务到底盯哪些数字才算盯住了
指标是监控的底座。设计指标体系的思路不是拿起监控工具的默认面板,而是从数据服务的生命周期追问:这个服务值不值得信任?信任崩塌了会先体现在哪个数字上?
2.1 五类核心指标:可用性、性能、时效性、质量、成本
这是我在多次迭代后最终固定下来的核心框架:
| 指标类别 | 监控对象 | 核心数字 | 说明 |
|---|---|---|---|
| 可用性 | API服务/任务 | 请求成功率、任务成功率、服务存活率 | 不等于进程存活,要按业务口径算成功率 |
| 性能 | API服务/计算任务 | P95/P99响应时间、并发量、任务耗时 | 对应到任务就是跑批时长 |
| 时效性 | 同步/加工/分发 | 增量延迟、任务完成时点、数据新鲜度 | 数据服务最特殊的一类指标 |
| 质量 | 同步/加工结果 | 行数偏差、主键冲突、空值率、一致性校验结果 | 直接决定下游信任 |
| 成本 | 全部服务 | 调用量、计算资源消耗、存储占用 | 中台要有账单意识,否则服务会失控扩张 |
我特别想强调时效性指标。很多团队监控响应时间盯得很死,P99超500毫秒就告警,但增量同步延迟半小时反而没人管。这是没想明白中台数据的消费方式:大多数API查询背后是一张T+1或者准实时的结果表,真正的体验瓶颈是这张表有没有按时刷新,而不是查询本身多快。查询再快,数据是昨天的,对实时决策的团队来说就是事故。
2.2 指标不能只有一层,要能顺着链路下钻定位
每个服务我只在仪表盘上放一个综合健康分,但这背后必须能往下钻三层。
- 服务层:SLA达成率、健康分、调用方视野。
- 作业层:任务实例状态、重试次数、运行时长、等待依赖的时间。
- 资源与数据层:数据量波动、资源消耗、产出表分区状态。
比如一个指标查询API的健康分从99跌到80,我先看服务层的成功率,发现失败集中在某个报表查询;下钻到作业层,看到对应的模型任务在昨天零点后一直处于等待状态;再看资源与数据层,发现任务根本原因是源端上游数据晚上10点才送达,触发时间却定在晚上9点。定位链条就是这么走的。体系没有分层,你就永远只看到最顶层那个数字,不知道往哪儿查。
2.3 SLO、SLA别混着用,监控要有燃烧率视角
这个值得单独说。SLA是对外签的承诺,通常很宽松,措辞谨慎、涉及赔偿的条款写得非常保守;SLO是团队内部定的严格目标,要比SLA更紧,这样对外才留有余地。比如对外SLA承诺99.5%的请求成功率,内部SLO就得定99.8%甚至更高。
监控系统里只跟SLA比有个问题:SLA是按月统计的,月初破了一次你觉得没事,到月底累计一算才发现早就破了,根本来不及补救。所以我会给关键服务做SLO燃烧率:比如一个服务月度SLO是99.5%可用性,一个月按30天算总共43200分钟,允许的故障时长是216分钟,折算到每一天大约7.2分钟。如果当天已经消耗了20分钟的不可用时长,燃烧率就明显超出均匀消耗节奏,系统立刻告警“按这个速度月底必破SLA”,而不是等到月底开盲盒。这个思路对P0服务很重要,告警从“事后总结”变成了“事前预警”。
3. 异构系统整合场景下,监控基线怎么搭才不翻车
数据中台建设绕不开异构系统整合:Oracle老核心、MySQL分片库、第三方FTP文件、Hadoop历史数据,全都得汇到中台来。这个阶段监控做得不好,后面每一个服务上线都在踩雷。
3.1 异构整合为什么天然是监控失效的高发区
先泼一盆冷水。异构系统里,同样的“客户数”,Oracle那边是按签约合同数统计的,MySQL那边按客户主档当前有效数统计,FTP文件里还混着测试环境的记录。数据进了中台,第一件事是统一口径,但监控基线怎么设?
最容易犯的错是拿“目标系统过去三个月平均水位”直接拍一套阈值。源系统口径都不同,迁移后第一天数据量出现20%的波动,可能是正常的口径归并,结果监控一顿误报,告警群直接轰炸,最后大家麻木了,真出问题时反而没人看。这就是监控最危险的时刻:狼来了喊太多次。
3.2 迁移任务本身就是第一批需要监控的数据服务
异构整合通常分两个阶段,监控策略完全不同。
迁移执行阶段要盯的是全量跑批的进度与正确性:大表抽取耗时、断点续传是否生效、目标端写入QPS、源端抽取对线上业务的影响。这时候很多团队只看任务成功状态,忽略“任务成功但漏了一批”。所以必须有对账动作:每一批全量迁移完成后,源端与目标端的核心表主键去重计数必须一致,不一致直接挂起任务并告警,而不是带着窟窿往下跑。
稳定运行阶段要盯的是增量同步的健康度:同步时延、拉取日志的位点是否在推进、消息积压量。特别要注意时区、时钟漂移和夏令时这类问题。我有一个真实案例:迁移后第一天数据一致性校验通过了,但第二天凌晨调度器因为宿主机时钟漂移,把同步任务从0点延到了3点,业务早上8点查数时数据还没补齐。要不是增量时延监控在3点半告警,这个问题大概率要等业务投诉才暴露。
3.3 基线自学习:别拍脑袋定阈值,让系统自适应
异构建模后的数据规律和单一系统完全不一样,初期根本没有足够的历史数据做统计基线。我现在的做法是分三步走:
- 第一天到第一周:只监控硬性规则。比如任务失败、连通性失败、主键计数对不上,这些不看历史也知道是错的,先保证不出大乱子。
- 第一周到两周:积累数据量的历史分布,使用滑动窗口的方式建立上下基线,比如按“均值加减数倍标准差”计算异常水位,同时避开节假日这种波动期。
- 两周以后:逐步放开质量指标类告警,比如空值率、枚举值分布漂移,这时候规则才有统计意义。
这套做法避免了我一开头说的“拍阈值导致告警刷屏”问题。用系统自身的历史数据去学习,比拍脑袋定那个所谓经验值靠谱得多。
4. 从采集到告警的完整链路:我的落地方案与工具选型
指标定好之后,接着是怎么采、怎么存、怎么告、怎么看。这一节给出一套中等团队可以直接照搬的落地组合。
4.1 四层链路设计
我把监控链路拆成采集、传输、存储、消费四段:
- 采集层:服务埋点(Prometheus Client、日志采集)、探针(黑盒探测)、任务状态回调(调度系统Webhook)、数据质量校验任务。
- 传输层:指标走Prometheus拉取或Remote Write,日志走Loki/ELK,任务状态事件走消息队列。
- 存储层:时序库扛指标,文档库扛日志,关系库扛告警记录和SLO预算计算。
- 消费层:Grafana看板、Alertmanager告警路由、自动化执行回调(重新调度、熔断等)。
这个结构很常规,但重点是每一层都要有人负责,否则链路中间断一截没人知道。我见过很多团队的时序库有数据、日志也有数据,但告警规则写了一半就没人维护了。
4.2 API数据服务监控的埋点与探测
API服务监控分两个手段:主动探针和真实流量埋点,两手都要有。
主动探针解决“没人调用我就不知道服务挂没挂”的问题。我有一批黑盒探针,按固定周期从外部网络请求关键API的专设探查端点,判断服务能否正常返回。这个端点必须绕过缓存层直查数据,否则探针每次都在打缓存,SLA达成率再漂亮也是自欺欺人。
真实流量埋点解决口径问题。对每个API,我计算经典的RED三兄弟:Request速率、Errors错误率、Duration时延,同时统计业务结果成功率。后者很关键:接口HTTP 200不一定代表成功,可能返回了空数据或错误码。我会在网关层把响应码和业务返回码统一捞出来,按业务成功口径重新算成功率。
4.3 任务与调度监控的接入方式
API监控的思路对任务类不适用,任务是“批处理”,必须通过调度系统接入。在DolphinScheduler、Airflow这类工具上,我做三件事:
- 订阅任务实例的状态变更事件,失败、重试、超时直接进告警队列。
- 采集任务运行时长,和同任务历史平均时长做对比检测。比如平时跑20分钟的任务今天跑了45分钟,即使成功也要提示性能劣化。
- 记录关键产出表的就绪时间戳。表生成后写一条元数据事件,这个事件的时间减上游任务触发时间,就是端到端的数据时效性。
这里有个独门技巧:我从来不只监控“任务失败”。大量事故是“任务成功了但产出异常”,比如增量源头根本没数据,任务空跑也算成功。所以每个加工任务我都会配一个“产出登记校验”,任务跑完先看产出表行数和分区完整性,确认合格再置为成功。这样才真正把监控重心从“跑没跑”转到“出没出对结果”。
4.4 工具选型对比:哪些适合数据服务监控
| 环节 | 常用工具 | 数据服务监控中的角色 |
|---|---|---|
| 指标采集 | Prometheus、Spring Boot Actuator、Telegraf | 标准指标收集,适合API服务较多的情况 |
| 日志采集 | Loki、ELK、Filebeat | 任务运行日志与异常堆栈 |
| 时序存储 | Prometheus、Mimir、VictoriaMetrics | 指标存储与查询,注意长期存储成本 |
| 任务调度 | DolphinScheduler、Airflow、DAG平台 | 任务运行底座,要接第二层监控 |
| 告警 | Alertmanager、Grafana Alerting | 路由、分组、静默,避免告警爆炸 |
| 数据质量 | Great Expectations、dbt tests、自研校验 | 校验产出表质量,这是中台监控的特色 |
工具选型我最想提醒的一点:不要被“监控全家桶”带跑偏。中小团队用三五款开源组件就够用了,关键是采集逻辑要对,指标口径要和业务对齐。工具能省则省,但“产出登记校验”这类业务逻辑一定要有,工具替代不了。
4.5 告警降噪:没有抑制机制的告警迟早变成背景噪音
告警规则刚上线那阵,我们一天能收到几百条通知,问了一圈全是同一个根因触发的连带告警。后来我在Alertmanager里做了三件事才把噪音压下来:
- 分组:同一个任务、同一个应用、同一段链路产生的告警合并成一条,避免一个故障触发几十条通知。
- 抑制:如果已知P0故障发生,相关的次要告警自动静默一段时间,让值班人员先聚焦核心问题。
- 分级:所有告警分成P0/P1/P2三个级别,只有P0和部分P1才真正发短信、打电话,P2只进企业微信或工单队列。
这套机制落地后,同样的故障量,告警条数下降了八成以上,但真正损坏的故障一条没漏。告警的目标不是追求声响大,是让人在正确的时间注意到正确的问题。
5. 监控结果如何回流治理闭环,而不是躺在告警群里
监控做出来如果只用来晚上给人发告警,价值就只发挥了一半。中台的监控结果应该喂回治理体系,形成闭环。
5.1 异常自动处理:能自动止血的就别等人工
数据服务的故障有一个特点:很多异常是暂态的、可自动恢复的。比如下游源系统短暂不可用,重试三次就通了;再比如增量同步任务因为前序任务跑太慢导致晚点,追平后时效性恢复正常。我在告警动作里配了分级自动处理:
- P0级:整个服务不可用或SLO高危,通知值班长,同时自动熔断依赖的消费方。
- P1级:某个任务失败,先自动重试一次,失败则进入人工队列。
- P2级:数据量偏差、性能劣化,只记录和通知,不自动执行重跑——无脑自动重跑可能把错误数据放大一遍,反而更糟。
自动重跑铺开前必须确认任务的幂等性。清空目标分区重写、还是追加不冲突,两种模型对同一个重试动作的结果完全不同。没确认幂等就开启自动重跑,事故现场容易从一处变成两处。
5.2 让监控数据成为数据资产的一部分
我在落地中台治理时,把每个数据服务打上了三张评分卡:可用性分、质量分、成本分。可用性分来自SLO达成率和燃烧率;质量分来自对账校验和空值检测;成本分来自调用量和计算资源消费。三类分数合并成一个服务健康度,纳入中台的资产目录。
这样做的好处很实际:服务负责人打开资产目录就能看到,自己负责的数据服务这周健康分从92掉到80,是因为质量分掉分,具体是哪个校验规则连续三天报警。不需要任何人去解释“为什么下游反馈数据不对”,评分卡已经把根因链指出来。
5.3 一条真实闭环:从延时告警到源系统整改
我可以给一个完整链路示例。某个核心指标API连续出现早上7点前数据不刷新的情况,告警触发后,监控下钻先定位到模型任务直到7点15分才产出。回溯后发现,该任务依赖一个同步任务,同步任务的源端是第三方数据服务,对方系统每天凌晨6点50才把前一日报文推送过来,导致中台侧任务触发时间被顺延。
这个根因最后不在中台内部,而是源系统的交付承诺太晚。靠一次告警断不了这个案。我当时的处理是:把这条链路的SLO拆分清楚,中台侧承诺9点前开放数据,但同步任务的交付线定到7点,如果第三方来不到7点,该服务直接标记为外部依赖风险,并在评分卡中单独标注。这样每月的SLA回顾会议就不需要吵架,数据说话,责任在谁一目了然。
6. 踩坑两年,我觉得最值的几点体会
这部分是我做数据服务监控两年多沉淀下来的几个教训,不按大道理讲,就说实际操作中最影响成败的细节。
先说第一条:指标口径必须开会拉齐。同一套成功率,运维算HTTP 5xx率,应用算业务失败码率,中台算任务失败率,三方看同一块大屏说的却是三个事。上线第一天必须先花半天时间过一遍所有核心指标的公式,确认成功率、数据新鲜度、任务延迟的统计口径。口径不一致的监控是灾难,看得越多越混乱。
第二条:告警价值的核心在于信息量和关联性。单条告警“接口响应超时”毫无意义,得带上调用方、影响范围、关联的任务ID、最近一次成功样本对比,让人打开就能往下查。我后期每条告警都做成一张小型诊断卡,而不是一行干巴巴的文字,值班技术支持定位的时间直接少了一半。
第三条:别追求告警数量,追求检修率。把告警阈值调严很容易,但噪声多了大家就不看了。我在团队里立了个规矩:每个季度统计一次告警的有效检修率,低于5%的规则直接下线或改阈值。这不是指标KPI,是要防止告警群的“狼来了”效应,让真正的大事发生时有人认真响应。
第四条:监控建设要跟着中台的成熟度走。没上线时别急着铺几百条告警规则,先在迁移期做硬性规则,稳定运行期再慢慢加入基线和质量告警。一上来就大而全的结果,就是告警群从第一天开始就没人敢看。老老实实从“错了能发现”开始,再做到“变化能感知”,最后才谈“风险可预测”。
最后再分享一个小技巧:数据服务监控的告警接收人,一定要写“服务负责人”而不是“值班机器人”。负责人收到告警后,回复一个简短原因,比如“源端延迟、任务重启中”,这条记录会自动归档到服务的历史事件库。积累一年以后,哪个服务反复故障、什么原因、修过几次,一查便知。这是用时间换来的最靠谱的监控资产。