做运维这行,绕不开一个画面:凌晨两点,手机震得整个床头柜都在响,爬起来一看,值班群已经刷了几百条告警,核心系统的接口成功率掉到50%,但没人说得清是哪台机器、哪个服务先出了问题。这种“先救火再复盘”的日子,我过了很多年,后来从零参与搭建了两套智能运维体系,才明白所谓智能运维(AIOps),核心不是搞一堆高大上的算法,而是把数据、流程和自动化串成一个能自我运转的闭环。这篇内容就围绕智能运维在真实生产环境里怎么落地来聊,讲讲数据底座、告警治理、根因定位、容量管理,以及风电这类重资产行业里智能运维是怎么玩的。适合正在建设运维体系、被告警闹到失去耐心的同行参考。
1. 智能运维到底在解决什么问题:三个场景讲透
1.1 场景一:告警风暴把人淹没
我接手过一个电商后端团队,当时监控已经上了,Prometheus也配了,但效果恰恰相反——告警多了,反而没人看。有一天核心交换机跳过一次,下游几百个服务全部出现超时,一个小时内Alertmanager推了四千多条告警。值班同学半夜被电话叫醒,打开值班群根本找不到重点,所有人都在问“现在到底什么状态”。等大家分头查了一圈,发现那台交换机的故障已经在五分钟内自行恢复了,但告警还在营销群里持续刷屏,真实需要处理的慢SQL问题反倒被淹没在最底下。
这类场景我后来见过太多次。传统监控的特点是“有告警就报”,但它不区分这个告警是不是根因,也不管它是不是重复信号。一个节点故障,往往会通过调用链传导到几十上百个上下游服务,每个服务又各自触发超时、失败、连接池耗尽等多条规则,最后形成几何级数的告警风暴。人工在这样的风暴里找出真正值得动手的那一条,成本极高,而且极度依赖老师傅的经验。新人值班遇到这种局面,基本只能一路“@所有人”求援。
1.2 场景二:排查链路像大海捞针
另一个让人崩溃的场景是故障定位。有一个下单请求链特别长:App端进来,先过网关,再到用户服务、订单服务,接着调支付接口,发MQ消息,最后写账务库。某个环节慢,用户侧表现就是“下单转圈转半天”。没有链路追踪的时候,排查只能靠登机器翻日志。你得先确认是网关慢还是业务服务慢,是缓存慢了还是数据库慢了,每层都要重新去看指标。最尴尬的是你查了半天,最后发现罪魁祸首是缓存里有几个热点Key,把数据库连接池打满了。前面排查花了两个多小时,真正修复只花了五分钟。
这种场景的本质是:系统的因果关系藏在调用链和数据流里,人工很难快速把它还原出来。故障定位的核心不是“看日志”,而是“还原因果”——知道异常是先发生在哪个节点、通过什么路径传播到其他节点。这恰恰是智能运维里“根因分析”模块最能发力的地方。
1.3 智能运维的定位与边界
结合前面的场景,我对智能运维的理解可以浓缩成一句话:把重复的监控判断、告警过滤、初步排查和常规处置交给机器,把人留在异常处置、架构优化和业务保障这些需要判断力的工作上。
它不解决所有问题。如果数据质量一塌糊涂、服务拓扑一团乱麻、变更流程全靠拍脑袋,任何算法都救不了你。它也不是“上了就能完全无人值守”的黑盒,而是一套依赖数据、算法和流程共同运转的工程体系。理解这条边界,比急着选工具重要得多。后面我讲的每一步,其实都是围绕“如何让数据更干净、判断更准确、动作更可控”展开的。
2. 先把数据底座打牢:指标、日志、链路三类数据怎么打通
2.1 可观测性的三根柱子
智能运维的地基是可观测性。当前工程界对可观测性的共识,是把数据分成三类:指标(Metrics)、日志(Logs)、链路追踪(Traces)。我习惯用一个类比来理解它们:指标是系统的“体温和血压”,告诉你这台机器整体状态如何;日志是系统的“病历记录”,详细写了每个时间段发生了什么;链路追踪则是“一次看病的完整路径”,记录了一个请求从进入系统到最终返回,都经过了哪些科室、花了多长时间。
只靠其中一类数据很难做智能运维。指标适合做异常检测,但说不清原因;日志信息量最大,但噪音也同样大;链路能还原调用关系,但往往覆盖不到所有业务。真正有价值的组合是:指标先发现“这个服务的延迟上去了”,链路告诉你“慢的请求都经过了下游的支付服务”,日志再帮你确认“支付服务的超时异常大量出现”。三条线互相印证,才能形成完整的判断。
2.2 采集链路的搭建与工具选型
工具选型上,中小团队完全可以从开源体系起步,并不需要一上来就买商业产品。我实测下来比较省心的一套组合是:Prometheus抓指标,Grafana做可视化,Loki或ELK管日志,OpenTelemetry做统一采集,SkyWalking做链路追踪和服务拓扑分析。这套组合的优点在于每一层都有成熟社区,出了问题随便一搜就有答案,而且数据格式开放,后续接自己的算法也方便。
OpenTelemetry要特别提一句。它现在是CNCF孵化的可观测性标准,核心价值是把指标、日志、链路三种数据的采集格式与传输协议统一起来。以前我们接一个服务要装三个Agent,一个发指标、一个收日志、一个传Trace,资源占用高,配置还容易漏。换成OpenTelemetry之后,一个SDK就能同时上报三类数据,数据关联性也更好做了。
实操上我建议分三步走:先给所有主机和容器装上采集器,打通指标链路;再推进业务日志的规范化采集;最后在所有核心服务的SDK里打开链路追踪。三步不要并行,每一步都花时间把覆盖率做到90%以上再进入下一步。
2.3 三个最容易踩的数据坑
第一是标签设计不规范。Prometheus里每个指标都带一组标签(label),比如env="prod"、app="order"、region="cn-east"。如果大家在写Exporter和埋点时随便造标签,后面做聚合和关联就非常痛苦。我踩过的真实教训是:有两套服务分别叫order-api和order_api,中间差一个下划线,同一个大盘上硬生生分成两个面板,排查时反复对不上。从第一天起就强制统一命名规范,比事后清洗容易一百倍。
第二是Agent资源占用失控。业务机器本身资源有限,如果每个Agent都默认开全量采集,日志又不过滤,很容易把业务进程都拖垮。我们有一回就遇到日志Agent占掉了节点20%的内存,比业务进程还夸张。后来所有采集器统一加了资源限制,日志采集默认只收WARN级别以上,Error级别的全量收,Info级别的按需采样,这才把资源占用压回去。
第三是数据保留策略。一天的原始日志可能几个T,全量存一年既不现实也没必要。我的建议是分两层:原始数据留短周期(比如30-45天),保证查问题和算法训练够用;聚合后的指标数据可以留长周期(比如两年),因为容量分析和趋势预测都需要长历史。定期把冷数据转存到对象存储,别让集群硬盘撑到报警。
3. 告警治理:智能运维里最容易出成果的模块
3.1 为什么传统告警让人想关机
如果智能运维只能先做一个模块,我一定会选告警治理。因为它见效最快,而且直接决定运维团队是否信任这套体系。
传统静态阈值的问题是“不分场景”。一条“CPU使用率>90%”的规则,白天业务高峰触发是正常的扩容信号,凌晨三点触发可能就是异常;同样的延迟阈值,对核心下单链路的敏感度应该远高于一个内部报表接口。把所有系统一视同仁地用固定阈值去卡,结果就是要么误报太多,要么漏报严重,值班同学逐渐对所有告警免疫,开始选择性忽略。一旦大家形成“先看是不是误报”的条件反射,真故障来了也没人重视了。
3.2 动态基线怎么做
告警治理的理想状态,是让告警规则学会“只在该报警的时候报警”。这就得靠动态基线。
动态基线的核心思路是:不设定固定阈值,而是基于历史数据学习“这个指标在此时段内的正常范围”。我常用的方法是对一段时间的历史数据做周期性分解——比如把一天按分钟拆成1440个槽位,再用最近14天到30天的数据,分别算出每个槽位的分位数区间(例如P5到P95),把它作为动态的上下边界。系统在凌晨两点的CPU基线,和下午两点的基线是两条不同的曲线,各有各的正常区间。指标值明显超出当前时段基线范围时,才触发告警。
这个方案的优点在于实现不复杂,Holt-Winters周期分解或者简单的分位数基线都能跑,不需要上深度模型。因为监控数据的周期性非常明显,只要拿几个月的同期数据去学习,模型的效果就足够用了。要注意的是动态基线必须保留足够的历史窗口,有些系统刚上线数据量不够,这时候强行上AI反而容易误报,老老实实先用静态阈值加宽边界更稳妥。
3.3 告警聚合与收敛的三个手段
有了动态基线,告警数量会降下来一大截,但还不够,还得做聚合和收敛。我总结下来有三板斧。
第一板斧是时间窗口聚合。同一个服务、同一个监控项在五分钟内连续触发多次,就合并成一条告警,带上触发次数和最早/最晚时间。否则一个持续性的故障会每分钟刷一条,看着就烦。
第二板斧是依赖关系收敛。要建一张服务依赖图:订单服务调用了支付服务,那当支付服务挂掉时,订单服务报超时告警,本质上就是衍生告警。正确做法是保留下游根告警,把上游衍生的告警自动抑制掉,只在告警详情里提示“该告警可能与XX服务异常相关”。
第三板斧是业务拓扑聚类。把同一业务线、同一集群的告警归到同一组里,值班人一次看一个“故障现场”,而不是看几十条孤立的点。
我改造告警体系时,真实的对比数据是:改造前平均每天1800到2500条告警,改造后过滤到每天20到40条有效告警,其中真正需要人工介入的又只占一半左右。告警量降下来之后,团队才算真正治好了“狼来了”的疲劳症,每次响起的告警,大家都会当回事。
4. 根因定位与自愈动作:让故障处置从“翻日志”变成“看界面”
4.1 倒推异常传播链
告警收敛之后,下一步是帮值班人快速定位“到底哪里先出了问题”。我最常用的手段,是把三类数据和调用关系图串联起来做倒推。
具体逻辑是这样的:当告警发生时,先去时序数据库里找所有相关指标,找出哪个指标最先偏离基线。注意是“最先”,因为异常是传播的,最先异常的那个节点,往往是根因所在。第二步,结合服务调用拓扑图看传播路径:如果支付服务和订单服务同时异常,再去看它们共同依赖的数据库,如果数据库的慢查询数量也在同一时间飙升,那基本可以断定问题出在下游存储。
第三步是把日志里的异常关键词做聚类。一个故障发生时,日志里的Exception、Timeout、Connection refused等错误,往往会集中出现在某一两个服务上。把这些高频关键词聚成类,再和指标、链路的判断结果交叉验证,基本能锁定根因所在。这套流程看起来简单,但人工做一遍要好几个小时,机器来做只需几分钟。
4.2 自动化恢复的落点与安全边界
定位完根因,自然想让它自动恢复。自动化的价值在“省人”,风险也在“没人拦得住”。我的经验是:自动化的范围要从小到大,安全边界要画清楚。
最低风险的一类是“无状态服务的自动重启”。比如容器OOM导致服务不可用,监控平台判定后直接自动重启容器,并在群里同步“已自动重启,请关注”。这里要加一道判断:如果同一个容器30分钟内连续重启了两次以上,就立刻停止自动操作,转人工介入。因为连续重启说明问题不是偶发抖动,很可能是代码Bug或者依赖故障,继续重启只会放大问题。
第二类是有一定风险的“自动扩容”。触发条件可以是CPU持续高于80%或QPS达到设定水位,扩容幅度、最大节点数都要预设,避免弹性伸缩把预算打穿。第三类才是限流降级这类策略性动作,我建议即便实现自动化也要保留人工审批环节,因为限流降级直接影响用户体验,尺度拿捏需要业务一起确认。
所有的自动执行动作,都必须在执行前打印详细操作上下文、执行中打日志、执行后写审计记录。被机器做过什么操作,必须能完整回溯。这是SRE的基本底线。
4.3 ChatOps协同模式
工具落地到最后,一定要考虑值班人的使用体验。我们最终把告警和根因分析结果接入了企业内部通信工具的机器人:告警触发时,机器人直接把“指标异常类型、根因判断结果、相关日志关键字、可能的处理建议”汇总成一张卡片推到群里。值班人不用打开三个系统来回切换,只要看卡片就能上手处理。
这个设计表面上只是把信息聚合了一下,实际效果却很显著。以前新同学值班,遇到故障第一反应是打电话给组长,因为不知道去哪里看;现在机器人把上下文都推过来了,新人也能在十分钟内给出初步判断。ChatOps的意义不是取代监控平台,而是把人和报警之间的摩擦降到最低,让人更快地进入处理状态。
5. 容量管理:把稳定性和成本放到同一张表里算
5.1 容量管理到底管什么
容量管理是智能运维里容易被低估的一块。很多人觉得容量就是“看CPU用满了没”,实际上它同时管着稳定性和成本两个目标。
我常用的容量指标体系分三层:基础设施层看CPU、内存、磁盘、带宽;中间件层看连接数、队列深度、缓存命中率;业务层看QPS、并发数、平均响应时间、慢请求占比。只盯着基础设施层容易失真。比如一台机器CPU不忙,但数据库连接池已经满了,业务照样超时;或者MQ队列深度从几百涨到几十万,CPU毫无波动,但消费者的延迟已经大到不可接受。真正的容量评估,必须把三层数据放在一起看。
5.2 用时间序列预测做容量推荐
容量管理的核心操作是预测,而不是看到水位报警才扩容。
我常用的方法是给核心业务建立容量预测模型。输入是历史一个季度以上的核心指标数据,算法层面用带周期和趋势分解的时间序列模型就够,比如Holt-Winters或Prophet。这类模型能自然学习“每天晚高峰涨、周末涨、凌晨降”的规律,并预测出未来24小时每个时间点的预期负载。
关键点在于:不能只预测均值,要预测P95甚至P99的高峰水位,否则扩出来的容量会在尖峰时刻被打穿。我当时做的扩容推荐逻辑,就是取预测P95值作为目标容量,再留10%到15%的余量,转换成“建议扩容几台节点”。这套逻辑上线后,某条业务的节点在夜间能缩到白天的四分之一,定时扩缩容加弹性伸缩双管齐下,整体计算成本省了三成左右,而且没有再被半夜的容量告警骚扰过。
5.3 大促场景的“预测+计划”混合模式
纯靠历史数据建模在大促场景是不够的:大促流量是爆发性的,历史数据里根本没有相似的先例。这时候要用“预测+计划”的混合模式。把营销计划、活动预热节奏、历史大促的转化率作为外部信号注入模型,或者更直接一些,由业务方给出流量预估,用压测结果反推容量需求,再由平台做资源预留和格子预扩容。大促期间适当把模型放宽松、多留余量,活动结束后再快速释放。稳定性优先还是成本优先,不同场景要有意识地切换。
6. 智能风电运维:一个硬核行业的落地样本
6.1 风电运维为什么需要智能运维
前面聊的都是互联网场景,但智能运维的价值远不止数据中心。今年我一直在关注智能风电运维这个方向,它可以说是“智能运维+重资产行业”结合的典型样本。
风电运维的痛点和互联网完全不同:风电机组分布在偏远山区或者海上,一台风机几十上百米高,登塔作业本身就有安全风险;海上风电更夸张,单次出海费用巨大,如果到了现场才发现备件带错了,损失直接翻倍。风机的大部件(齿轮箱、发电机、叶片)价格昂贵,一旦突发故障,非计划停机的电量损失和维修成本加起来非常惊人。传统风电运维模式是“定期巡检+故障后维修”,要么该修没修,要么修早了浪费,整体效率很低。
6.2 风电场景的数据与算法玩法
风电运维的智能化和互联网其实是同一套技术骨架,但数据源和模型目标完全不同。
第一类数据是SCADA系统采集的运行参数,包括风速、有功功率、转速、齿轮箱油温、轴承温度、机舱温度等。我会对这些参数的时序数据做趋势预测和异常检测,尤其关注温度类指标。齿轮箱轴承损坏前,往往会先出现持续几周到几个月的油温异常爬升,震动频谱里也会出现特定频段的能量增长。如果能在损坏前两三个月识别出这个趋势,就能把“突发故障停机”变成“计划检修下塔”,维修成本能差出一个数量级。
第二类是功率曲线分析。把风速和功率放到一张图上看,正常风机应该贴着厂商给的功率曲线走。如果发现某台风机在相同风速下发电功率明显偏低,常见原因可能是叶片结冰、偏航误差或者变桨系统异常。这种“性能衰减识别”不一定要多复杂的模型,用SCADA历史数据拟合出基准曲线,再实时计算偏离度就够了。
第三类是气象数据联动。低温高湿环境下叶片容易结冰,如果实时判断出结冰风险,提前下发除冰或降载指令,既能保护叶片又能减少无效运行带来的载荷。这个场景下,算法输出必须带置信度和复核窗口,因为误操作一次可能直接造成安全事故,和互联网“误报一条告警”的代价完全不在一个量级。
6.3 风电可用率与备件管理
风电行业里衡量运维水平的核心指标是可利用率,公式很简单:统计周期内可用小时数除以统计总小时数,行业一般要求95%以上。智能运维在这里的贡献就是两条:把非计划停机时间压下来,把计划检修安排在低风时段,让发电损失最小化。
备件管理也很有意思。风机备件特别是大部件,库存占用资金很高。以前大家就按经验囤,偶尔还会出现“坏的部件没备件、备了十年没用上”的尴尬。现在可以基于故障预测做备件推荐:哪台风机齿轮箱在预测窗口内有较高故障概率,就提前把对应备件调到客户现场。这省下来的不止是库存成本,还有紧急调货的物流成本和停机时长。
7. 智能运维落地路线图:别急着上AI,先把前几步走稳
7.1 四个阶段,每步都要有验收标准
很多团队一上来就买算法平台、上机器学习,结果数据不成体系,模型跑起来全是空中楼阁。我的建议是老老实实分四个阶段走。
第一阶段是“监控覆盖与数据标准化”。目标不是上AI,而是把所有核心业务系统的指标、日志、链路数据收集齐,统一标签命名,收敛告警规则。这个阶段的验收标准就一条:核心系统的三类数据覆盖率都达到90%以上。
第二阶段是“统一观察与关联分析”。把数据接到同一个大屏和告警平台上,实现“一次故障在一套工具内完成确认”。这个阶段至少要让团队摆脱“看指标开一个系统、看日志开一个系统、查链路再开一个系统”的狼狈状态。
第三阶段才是“智能分析与告警降噪”。上动态基线、告警聚合、根因定位,目标是告警量明显下降、平均故障恢复时间(MTTR)显著缩短。
第四阶段是“自动化闭环”。在少数成熟场景里开启自动扩缩容、自动重启、容量推荐,一步步扩大自动化范围。
每个阶段之间的切换都要有明确的验收数据,不要拍了脑袋就升级。
7.2 双轨运行与灰度切换
算法策略替换规则策略时,千万别“一刀切”切换。我吃过亏:新策略直接上线,结果误报率比预期高,值班团队一天之内对智能运维彻底失去信心。后来我坚持双轨运行:新旧两套告警逻辑并行跑一到两周,只在新策略表现稳定、误报率低于设定阈值后,才正式切换流量。
同理,自动化的灰度也非常重要。自动重启先只对测试环境和低风险服务开放,跑一个月确认没有事故,再扩展到核心业务。安全上的谨慎永远值得。
7.3 组织与人力建议
智能运维不是纯工具项目,组织能力也得跟上。我最深的感触是:运维团队里至少要有一个懂数据分析或算法的人,哪怕只是能把时序数据从Prometheus拉出来、用Python跑一个简单的基线模型都行。这个人不需要是算法专家,懂运维场景、能和开发对上话、能把数据问题看清,才是关键。很多智能运维项目死在“算法团队不了解运维业务,运维团队看不懂模型输出”,一个既懂数据又懂业务的桥梁角色,能避免掉大部分沟通成本。
8. 常见问题与避坑清单:值班三年踩过的坑
8.1 五个高频问题与处理方式
第一个问题是告警规则越堆越多,没有人清理。告警规则和其他代码一样,没人维护就会腐烂。我的习惯是每季度做一次告警规则“体检”,把30天内从未触发过的规则列出来,逐个确认是留着还是删掉,绝不让无效规则在监控系统里占地。
第二个问题是标签规范形同虚设。关键不在于定规范,而在于接入检查。我们在采集配置里加了校验规则:新接入服务如果没有按规范打标签,数据直接拒收并提示开发者修正。这个“强制”步骤看起来无情,但它能让整个数据体系长期保持干净。
第三个问题是模型误报之后无人反馈。智能算法出了误报,如果没人告诉模型“这次判断错了”,模型就永远不知道自己错了。我们在告警卡片上加了“误报/有效”的反馈按钮,把反馈数据沉淀成标注集,定期回流重训。模型是在真实场景的否定反馈里成长起来的,光靠初始数据远远不够。
第四个问题是自动化的“最后一公里”没做好。脚本写了,权限也配了,但执行时没有任何确认提示,结果自动化跑出去没人知道。所有自动动作一定要有“执行前通知、执行后记录”的机制,哪怕只是在群里发一条操作日志,都能避免以后扯皮。
第五个问题是业务和运维的容量口径对不上。业务说的“大促流量翻倍”和运维理解的“需要加几台机器”之间,隔着好几个模型参数。后来我把容量语言统一成了“基于预测QPS自动给出节点数建议”,业务提出流量目标,系统回答资源需求,不再靠人力翻译。
8.2 问题速查表
| 现象 | 可能原因 | 建议操作 |
|---|---|---|
| 告警太多,没人看 | 规则未清理、阈值不合理、无聚合收敛 | 做告警治理,动态基线+依赖抑制+规则体检 |
| 指标查询时标签对不上 | 命名规范不统一、漏打标签 | 接入校验强制规范,存量数据做迁移清洗 |
| 智能模型误报高 | 训练样本不足、场景周期性变化 | 双轨运行、标注反馈、定期重训 |
| 采集Agent占用资源高 | 全量采集、日志未分级 | 加资源限制、按日志级别采样、预留资源 |
| 自动操作出事故 | 无审批、无灰度、无回滚 | 小范围灰度、设定自动停止条件、操作审计 |
8.3 一点真实的个人体会
最后说点题外话。我自己的经验是,智能运维项目里最难的从来不是选哪款工具、调哪个模型,而是改变团队的习惯:让告警从“人人无视”变成“人人重视”,让数据从“各存各的”变成“全局可用”,让自动化从“不敢开”变成“敢开但知道如何去管”。如果你正准备启动智能运维建设,我给的建议很简单:先收敛告警,再打通数据,最后才碰算法。把一个高频场景做到让团队真正依赖,比铺开一堆酷炫功能更值得。