
这年头搞技术的人几乎没人不知道“监控”两个字但真正把监控做好的团队少之又少。很多项目从搭建到上线日志、指标、告警全都有可一到出事儿就是鸡飞狗跳任务凌晨两点挂了没人知道早上八点业务方来问数据怎么没出才慌慌张张去翻日志。这种“秋后算账”式的运维方式本质上就是开着车不看仪表盘非等发动机冒烟了才停下来检查。我之前在一个数据团队里吃过大亏之后花了大力气把整套过程监控体系搭起来才真正体会到“随时看仪表盘”这几个字的分量。这篇就当是系列里专门聊过程监控的一篇把为什么做、怎么做、踩过哪些坑一次说清楚。适合正在搭监控体系的开发、运维、数据工程师也适合那些天天被业务方追着问数据为什么延迟的同学看完了你至少能知道监控不是装个工具就完事儿它是一套从指标定义到告警恢复的完整闭环。1. 为什么说过程监控是“仪表盘”而不是“后视镜”——先想明白监控的本质1.1 秋后算账式的被动救火到底输在哪里先说一个我亲身经历的场景。那时候我们有一个跑批任务每天凌晨两点定时执行处理全量用户行为数据算完再供下游十几个报表使用。表面上看一切正常直到有一天早上10点业务方在群里喊昨天的转化率数据怎么是空的我们才开始查。从任务日志看凌晨两点零三分任务就报错了错误原因是上游数据源少了一个分区。但当时没有任何告警监控面板上那个任务的状态显示的是“等待重试”——因为调度平台默认会重试三次每次失败之后隔十分钟再拉起三次都失败之后不就再也不跑了也没有人收到通知。我们硬生生从早上10点排查到中午12点把上游、中游、下游挨个捋了一遍最后才定位到源头。数据补跑完成已经是下午两点半。业务那边当天的决策直接受影响晚上复盘的时候我总结了一个让人很难受的结论整个过程里其实凌晨两点零三分监控系统就已经“知道”出错了但没有任何一个环节把“知道”变成“被看见”。这就是典型的秋后算账式运维。问题不在你有没有监控工具而在于监控的链路是被动的等用户反馈、等业务投诉、等领导问起来才开始排查。这种模式天然有三大成本你躲不掉。时间成本的浪费最直观。故障从发生到被发现之间隔着一段巨大的时间窗口半夜挂的任务往往等到第二天早上才被人发现这个窗口越长修复越晚数据修复的链路就越长——源端修正之后下游一个任务接一个任务重新跑每一步都要时间。信任成本更隐蔽业务方一旦形成“你的数据不可靠”的印象以后每次看到数字先问一句“这个数准不准”这种信任损失远比一次故障本身严重。排查成本也是连锁反应时间隔得越长现场被掩盖的可能性越大要看的历史日志越多要问的人越多明明十分钟能解决的问题拖成两小时。所以过程监控的核心目的不是让你在出事之后更快把事情查清楚而是让你根本不要陷入“事后查”的境地。它把防线前移让问题在发生的那一分钟就被看到、被响应。1.2 过程监控的真正价值让“异常”在业务受影响之前暴露你可以把过程监控理解成汽车仪表盘。开车的时候你不会等到撞了墙才看方向盘你会一直盯着车速、油量、水温——这些就是过程指标它们帮你判断车子现在处于什么状态以及接下来有没有潜在风险。过程监控做的事儿本质上一样把系统运行过程里的关键状态暴露出来让你随时知道“现在一切是否正常”。这里我必须讲一个容易混淆的点监控不等于告警。很多团队把监控做成了“出了事儿发条消息”这其实是把过程监控降级成了结果监控。真正合格的过程监控讲究的是一句话在异常真正影响到业务之前看到苗头。举个例子。你的核心任务每天跑批需要30分钟这半年以来一直很稳定。这一天它跑了40分钟还没结束虽然没有报错但这就是一个典型的“过程异常”。如果没有过程监控你要么等到任务最后超时要么等到下游空等才会发现问题。但如果有一套能观察运行趋势的仪表盘你就能看到运行时长曲线在最近三天逐日上涨从30分钟到34分钟再到38分钟这时候你就应该去查了大概率是上游数据量涨了或者某段SQL退化趁还没挂提前处理掉。数据领域有一句我非常认同的话没有可观测性的系统就像一个蒙着眼开车的人。可观测性强调的不是“能否拿到数据”而是“能否在不做额外工作的情况下随时回答关于系统状态的问题”。你随便指一个任务问我它现在跑得顺不顺我不用临时写命令、不用翻日志打开仪表盘就能告诉你。这个就叫随时看仪表盘。所以这篇文章要讲的过程监控你可以理解成三个层面的建设第一层是把系统运行状态变成可见的数字第二层是把数字按人的感知习惯组织成仪表盘第三层是在数字背后建立告警响应闭环。三者缺一不可。2. 监控体系怎么搭先定指标再谈工具2.1 指标分三层基础设施层、应用任务层、业务结果层很多人在搭监控的时候上来就问“用什么工具”其实工具永远不是第一步第一步一定是定义指标。指标定错了工具再好都是花架子。我在实际落地中习惯把指标分成三层每一层解决一类问题缺一层都不完整。第一层是基础设施层。这一层监控的是机器和环境的状态CPU使用率、内存占用、磁盘剩余空间、网络进出流量、Load平均值等等。为什么要先看这一层因为很多任务失败、延迟的根因不在应用代码本身而在底层资源出问题了。我遇到过太多次任务突然变慢最后查到是磁盘快满了导致写入变慢或者同一台机器上别的应用把CPU吃满。这一层的特点是通用性强基本上所有系统都需要指标口径也相对标准化采集起来不费劲。注意基础设施层面的指标要“看趋势”单个时刻的CPU冲到90%不一定代表有问题但如果它持续在90%以上并伴随任务延迟上涨那就是强相关信号了。第二层是应用任务层。这一层直接对应你跑的每个具体任务、每个接口、每个作业任务状态是成功还是失败运行时长是多少有没有在重试重试了几次数据产出时间是否在承诺的SLA之内当前堆积了多少待处理任务。这一层是过程监控的主战场因为它直接反映“工作流本身健不健康”。举例来说调度平台里一个天级任务正常产出时间是每天8点之前那我们就应该把“8点是否产出”当成一个过程指标来监控而不是等8点半业务方来问。这一层的指标往往跟具体业务场景强相关没有统一标准必须由熟悉业务的同学一个个梳理。第三层是业务结果层。这一层关注的是“数据到底对不对”关键报表的当日数据量是否正常核心指标的日环比波动是否在合理范围新增用户数、订单金额这些业务数字有没有出现陡升或陡降。很多人会忽略这一层理由是“我只管数据能跑出来跑出来对不对不归我管”。这是大坑。任务跑成功了不代表数据是对的。上游字段变了、业务逻辑调整了、数据源里混进脏数据都可能导致任务正常结束但产出数据是错的。如果只盯着任务状态你根本发现不了这类问题直到业务方用着用着觉得数字不对劲。业务结果层的监控本质上就是数据质量监控它才真正守住了最后一公里。三层指标要打通看不能割裂。我再举一个联动的例子某天凌晨基础设施层显示某台机器磁盘IO延迟升高应用任务层随即出现该机器上三个任务运行时长翻倍再往下业务结果层当天某个报表数据量下降5%。如果你只看某一层你可能只会看到一个孤立现象而三层放在一起看你有机会非常快地收敛到一个判断磁盘IO影响了任务运行进而导致部分数据未产出。这种从底层到业务的链路分析是过程监控特别有价值的体现。2.2 阈值、趋势、告警分级——别让告警变成“狼来了”指标定好了接下来的问题是什么情况下说明“异常”这里最容易踩的坑是把阈值写死。举个例子给任务运行时长设一个固定阈值60分钟凡是超过60分钟就告警。听上去没什么问题但实际跑起来你会发现正常任务大多数时候只要40分钟但你给它留了20分钟的缓冲真的有问题的时候它涨到50分钟你根本不会收到任何消息等你收到消息时已经是故障发生了。反过来有些波动本身就很大任务固定阈值稍微紧一点天天告警大家很快就麻了。我的建议是阈值设定要基于历史基线而不是拍脑袋。具体做法是取过去30天的运行数据计算每天的运行时长得到P50、P75、P90、P95这些百分位。以告警阈值举例如果P95是35分钟P99是50分钟那你把告警线定在55到60分钟之间就比较合理。这意味着即使在最差的5%场景下也不会轻易误报而一旦越过这条线说明出现了历史95%情况下都没出现过的状态那大概率是真异常了。每个团队的容忍度不一样可以根据SLA和业务影响去调节但方法论是一致的让数据告诉你什么是正常才能准确判断什么是不正常。比固定阈值更进一步的是趋势类监控。这类监控不设绝对阈值而是看指标相对于自身历史的变化幅度。比如“今日产出数据量与历史7天均值相比下降超过20%”就是一个典型的趋势告警。数据量这个东西跟业务淡旺季关系很大绝对阈值很难设但趋势类告警能很好地捕捉“突然变化”。再比如任务重试次数如果昨天重试了10次今天重试了50次即便绝对次数看起来不多趋势上已经翻倍了也值得看一眼。告警分级这件事我强烈建议从上线的第一天就做。我的习惯是分P0、P1、P2三级。P0是核心链路挂了直接影响业务产出或者线上服务需要立即响应哪怕是凌晨三点也要拉人。P1是比较重要的任务失败或延迟但还有缓冲时间比如SLA是8点出数据现在7点发现任务卡住了这种要在30分钟内响应。P2是边缘任务异常不影响核心交付可以工作日白天处理。分级不是为了给告警贴标签好看而是为了让每一条告警背后都有明确的响应预期不然值班的人每条都觉得紧急每条都疲于应付最后就变成狼来了。3. 仪表盘实操从零搭一套看得懂、用得上的监控看板3.1 第一步明确监控对象和数据采集方式指标想清楚了接下来才是工具和采集的事。我们团队当时的组合是调度平台用DolphinScheduler监控展示用Grafana数据采集一部分靠调度平台自带的API一部分靠我们自己写的采集脚本往Prometheus里推指标数据质量相关的规则校验结果则是写入MySQL再由Grafana直连查询。这个组合好处是每个环节都足够通用不绑定某一家商业产品换团队、换项目都能快速复制。你完全可以根据自己已有的技术栈替换比如用Airflow、用自研调度平台展示端用Kibana也行核心思路都是通用的。先说采集哪些数据。对调度平台里的每一个任务实例我们要采集这样几类核心信息任务名称、所属工作流、计划调度时间、实际开始时间、实际结束时间、运行状态成功/失败/取消/等待、重试次数、运行节点、日志地址。除此之外还要把工作流级别的信息存下来比如一个工作流里总共多少个任务、成功几个、失败几个、当前是第几轮调度。有了这些原始数据才有可能去算那些有意义的指标比如“今天所有任务的成功率”“某个工作流从开始到全部结束的总耗时”“某任务平均重试次数”。采集方式上有两个容易踩的坑我必须提醒一下。第一重试逻辑要单独记录不能把一次失败然后重试成功后简单标记为“成功”否则你永远不知道这个任务其实不稳定。我们当时专门加了一个字段叫“是否有重试”标记为是的话即使最终成功也会在仪表盘上有个黄色标识让值班同学知道这个任务今天波折过。第二时区问题。调度平台里任务触发时间、数据的时间分区、业务上说的“今天”经常因为时区或者命名习惯不一致对不上采集的时候一定要统一成服务器本地时区并且把调度逻辑里“计划时间”和“实际执行时间”分开存不然后面排查问题时会怀疑人生。3.2 第二步用可视化组件把指标“摆上桌面”数据采集上来之后就要考虑怎么展示了。这一步是整个过程监控项目中最容易被忽视的部分因为大家总觉得“有数据就行”但说实话我在搭第一版仪表盘时也犯过这个错误把几十个图表堆在一个页面上最后没人看。后来我才总结出仪表盘设计的核心原则不同的人看不同的页每一页只讲一个主题。我当时把看板拆成了三层。最上面一层是值班总览页给一线值班同学用。这一页的布局非常固定第一行放KPI卡片今日任务总数、成功总数、失败总数、重试率、核心工作流SLA达成率、待处理告警数。每张卡片不只是显示数字还要有颜色绿色正常、黄色有波动、红色有问题眼睛一扫就能知道今天整体状况。第二行放的是核心工作流的状态列表用一个表格展示每个工作流的开始时间、结束时间、当前状态如果有失败的任务直接在表格里标红点进去看到失败原因和日志链接。第二层是链路分析页给技术负责人用。这一页主要放趋势图过去7天任务成功率趋势、运行时长趋势、某个核心任务的耗时P50/P90/P95曲线。这一页核心价值不是看“当下出事了没”而是看“最近有没有在悄悄变差”。我印象非常深的一次就是靠运行时长曲线的缓慢抬升提前三天发现了一个SQL性能退化问题当时上游数据量涨了30%某个join的耗时倍数增长数据趋势一直向上但我们提前介入重构了SQL硬是没让任务挂掉。第三层是业务数据质量页给数据owner用。这一页放着每个核心报表的数据量日环比波动、空值率、字段枚举异常等指标用柱状图和表格展示配上波动率阈值线。业务方问“数据对不对”的时候不用临时跑数打开这页直接给结论。关于可视化组件本身我的经验是要克制。颜色最多用三到四种语义明确绿色代表正常黄色代表关注红色代表异常灰色代表无数据。图表类型不要花哨趋势用折线图、对比用柱状图、分布用热力图就够了。仪表盘不是设计作品展是生产工具所有设计都要服务于“能不能一眼看出问题”。每个面板加一个标题说明“这个图在表达什么”以及“如果异常应该找谁”这看起来是小事但实战中非常救命值班同学不需要问别人就能理解每个面板的含义。3.3 第三步告警通知与值班响应闭环仪表盘是被动看的——需要有人打开它才能发现问题。但凌晨三点不会有人主动打开仪表盘所以必须靠告警主动找人。这一步是整个闭环里最关键的一环也是我之前吃过大亏后补得最狠的一块。告警通知渠道我们用了飞书机器人因为当时团队都在飞书上你也可以用钉钉、企业微信、邮件原则只有一个告警必须到达具体的人而不是发到一个没人看的群。实现方式是在告警规则触发时由告警模块调用飞书群机器人Webhook往指定群里推送一条结构化消息。消息内容不能只写“任务失败”至少得包含以下信息任务名、工作流名、计划调度时间、失败时间、失败原因摘要、影响范围、日志链接、当前值班人。再加一个“是否已认领”按钮点了之后就表示有人在处理了这条告警会从“待处理”变成“处理中”避免一群人都在看但没人动手。告警配置上要处理好几个细节。第一个是静默期。凌晨的重试型任务可能在短时间内连续发出多条相同告警如果不做聚合和去重值班手机能在一分钟内被震成马达。我们在告警模块里做了同类告警聚合同一个任务同一类型的问题在10分钟内只发第一条后续更新通过“已更新N次”体现。第二个是升级策略。P0告警发出后如果15分钟没人认领就自动升级到技术负责人再30分钟没人认领直接电话联系绝不允许告警发出去就石沉大海。第三个是非工作时段策略。白天和凌晨的响应时效可以不同凌晨P0告警才需要立即处理P1可以到早上再处理这个策略写清楚值班的人才知道优先级。告警之后的流程同样重要。我们当时定了一个简单的规则任何P0/P1告警处理完之后必须填一个复盘记录包括根因、影响时长、修复动作、后续改进项。不需要很长几条要点就行但这个习惯帮助我们积累了大量的“历史故障档案”。后来排查问题的时候我们经常先翻历史故障档案看看以前有没有类似的案例效率提升非常明显。这就是把单次救火变成组织经验沉淀的过程也是过程监控体系能持续进化的关键。4. 常见问题与排查技巧实录监控上线后踩过的那些坑4.1 监控一切等于什么都没监控很多团队搭监控容易走另一个极端恨不得把系统里所有能采的指标全采了把所有任务都配上告警Grafana上拉了几百个面板。结果怎么样没人看也因为根本看不过来。我见过一个团队小小的数据平台挂了三百多条告警规则值班同学每天早上打开手机先筛选“哪些可能是真的故障”告警像背景噪音一样持续轰炸真正的P0被淹没在里面。我的建议是“先精后全”分三步走。第一步只挑核心链路那些直接影响业务产出的任务和工作流数量控制在十个以内。第二步把这些核心对象先做透该采的指标采全该配的告警配好仪表盘做到一眼能看懂。第三步跑两周稳定了再逐步扩大范围把非核心但重要的任务加进来一步步扩到边缘任务。切忌第一周就铺开几百条规则然后第二周因为告警噪音太大全部关掉这种情况我见得太多了。监控体系的建设也要有迭代思维先保证核心再持续完善这比一次铺开再夭折要健康得多。4.2 告警风暴与静默故障并存怎么办告警风暴是监控上线初期最常见的崩溃点。典型场景是这样的一个上游任务挂了下游一两百个任务全部失败于是告警模块在同一分钟内发出两百多条任务失败消息。可实际上这里面只有一个真正的根因。这时候如果告警规则没有做依赖收拢值班的人就被淹没在噪音里了。解决办法是给任务配置依赖层级当下游任务因为上游未产出而失败时不直接发失败告警而是合并成一个“上游阻塞”告警只报最上游的那个根因任务。同样的逻辑也适用于重试场景同一个任务三次重试失败了不应该发三条告警而应该发一条“重试N次后失败”的汇总告警。比告警风暴更可怕的是静默故障——明明出了问题但没有任何告警。我遇到过一个经典案例某个报表任务每天正常跑完状态显示成功但业务方反馈数据跟上个月对不上。查了很久才发现上游数据源某个字段在上个月改过一次格式旧逻辑解析后得到一堆空值故事实上数据已经错了二十多天但任务本身没有失败过。这类问题靠任务状态监控永远发现不了必须靠数据质量监控来兜底。我们的做法是给每个核心报表配上一组质量规则至少包括数据量日环比波动超过20%告警、关键字段空值率超过5%告警、某个枚举值占比异常告警。只有把任务状态、运行趋势、数据质量三套监控组合起来才能既防告警风暴又堵住静默故障的口子。4.3 指标体系“失真”的几种典型原因监控搭好了、指标也在展示了但有时候你会觉得指标不准看仪表盘越看越心虚。这种“失真”通常有几个隐藏原因。第一个原因是指标口径不统一。同一个“任务成功率”调度平台上算的、告警规则里算的、周报里写的用的分子分母可能是不同的。我在一次排查中发现调度平台自带的成功率包含“手动停止”的任务而我们的监控看板排除了手动停止两边对不上导致看板显示99%成功率但平台显示95%团队为此还争论了半天。从那以后我们定了一条死规矩所有指标口径必须在一个地方统一维护各处的数据源必须一致。第二个原因是埋点位置不对。有些团队监控任务耗时用的是任务开始到任务提交的时间段但漏掉了排队等待调度的部分。结果就是明明任务在调度队列里排了两个小时看板上的耗时曲线依然平平稳稳因为“任务还没开始”不被算进耗时里。后来我们改成监控“计划调度时间到实际完成时间”的端到端时长才能真正反映用户体感里的延迟。第三个原因是数据采集本身的污染。例如采集脚本偶尔会漏采导致某一天的指标曲线出现一个突兀的凹陷或者任务重试成功后指标记录了多次运行如果不做去重成功率会失真。这些问题的共性在于指标的准确性是需要持续运维的。我们当时每季度会做一次“指标体检”把核心指标的定义、采集逻辑、计算逻辑全部review一遍看看有没有跟业务现状脱节的地方。这个动作很花时间但它能保证你在关键决策面前看的数字是可信的。结尾说实话把过程监控从“装个Grafana看板”做到“真的能在故障发生前看到苗头”这一步中间要补的功课比想象中多得多。我在实际落地中最大的体会是监控本质上不是技术工程而是管理工程——它逼着你想清楚什么是核心的、什么是正常的、什么是需要立刻响应的以及出了事谁负责。这些想清楚了工具层面的东西反而简单。最后再分享一个小技巧给你的每一个核心告警文案都加上“影响面”字段比如“本任务失败将导致次日8点前日报无法产出影响运营部晨会”。这一行字在值班深夜的排障中作用极大人最容易在紧张的时候失去判断力而影响面能瞬间帮你排序优先级。别小看这样一个小细节它往往决定了是一群人紧张兮兮地把小问题搞大还是一个人冷静地在五分钟内把它解决掉。过程监控这条路没有终点指标会变、业务会变、系统会变但只要“随时看仪表盘”的意识和这套闭环骨架在你就能一直跑在故障前面。