ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

告警风暴怎么压?100MW 电站监控平台告警引擎架构复盘

告警风暴怎么压?100MW 电站监控平台告警引擎架构复盘

去年 9 月,华东某资产方旗下的 300 多个工商业电站突然在半小时内弹出了上万条告警。运维群里的消息提示音就没停过,几个运维主管的手机直接被震得发烫。点开一看,全是「逆变器网关离线」和「电网电压异常」,但仔细排查发现,其实只是其中一个片区的 10kV 线路例行检修导致的小范围停电。

这种「告警风暴」是很多刚做分布式监控平台的团队最头疼的事。你以为接了 50 个品牌的 API,把数据拉回来存进时序数据库就完事了?真到了实战,你会发现如果不做告警引擎的深度设计,系统要么被垃圾告警淹没,要么在关键故障发生时,真正的求救信号被埋在几千条「无效噪音」里。

我们今天不谈那些虚头巴脑的数字化转型大道理,就聊聊在管理 100MW+ 甚至 GW 级电站资产时,一个能打的告警引擎到底该怎么设计,以及我们踩过哪些坑。

规则匹配:别让 SQL 拖垮了你的实时性

刚开始做告警的时候,很多人的第一反应是在数据库里跑定时任务:每隔 5 分钟跑一次 SQL,查一下current_power == 0且irradiance > 200的设备。在只有 10 个电站的时候,这招挺灵。但当你有 500 个站、几万台逆变器时,这种「轮询式」的逻辑简直是灾难。

逆变器云 API 的数据推过来通常是有延迟的,而且不同品牌的步调不一致。华为可能 5 分钟推一次,锦浪可能 3 分钟推一次。如果全靠数据库定时扫,你会发现告警永远比现场慢半拍,而且数据库的 CPU 经常被那些复杂的聚合查询占满。

我们的做法是引入流式处理思路。数据进入网关后,在流经业务层时直接进行动态规则匹配。规则不应该硬编码,而是通过 JSON 格式定义的逻辑树:

{"rule_id":"INV_EFFICIENCY_LOW","target_type":"inverter","conditions":[{"field":"active_power","operator":"<","value":"rated_power * 0.1","duration":"600s"},{"field":"irradiance","operator":">","value":300}],"severity":"major","message_template":"逆变器 {device_sn} 转换效率异常,当前辐照度 {irradiance}"}

这里有个关键的技术细节:死区(Deadband)与延迟触发。电网电压经常会有零点几伏的波动,如果你把阈值设死在 253V,电压在 252.9 和 253.1 之间反复横跳时,你的引擎每秒钟能生成 10 条告警。我们必须给告警加上「持续时间」判断(比如持续 5 分钟才触发)和「回差控制」(比如跌回 250V 才消除)。没做这两点,运维人员迟早会把你的 App 给卸载了。

事件聚合:解决「一处着火,百处报警」

这是最考验架构师功力的地方。在大型集中式电站或者密集的分布式区域,一个高压侧开关跳闸,会导致下游几十台逆变器瞬间报出「电网丢失」。如果你的引擎只会机械地匹配规则,那就会瞬间生成几十个工单。

我们后来设计了一套基于「时间窗口+拓扑关联」的聚合算法。简单说,就是在告警产生的瞬间,不立即推送,而是把它丢进一个 30 到 60 秒的「缓冲区」。

在这个窗口期内,如果引擎发现同一个数采下的 20 台逆变器都报了「交流断连」,那么它会自动抑制掉这些单个设备的告警,转而生成一条更高维度的事件:「数采 A 区域通讯或并网异常」。

原始事件发生频率聚合逻辑最终告警
逆变器 #1 交流断连15:00:01检查同一变压器下其他设备忽略个体告警
逆变器 #2 交流断连15:00:05发现 80% 设备离线触发「支路故障」
环境监测仪通讯中断15:00:10检查网关在线状态触发「网关离线」

我们在处理多品牌数据归一化时,内部使用了一套中间件。它最核心的作用就是把华为、阳光、古瑞瓦特这些各不相同的错误码,映射到这套统一的聚合逻辑里。不然,你得为每个品牌写一套聚合规则,那代码根本没法维护。

通知去重:别在深夜炸响运维的手机

很多 EPC 老板跟我抱怨过,说有的系统「太敬业」,大半夜因为某个电站的通讯模块偶尔波动,疯狂发短信。这种「狼来了」玩多了,真正出事时没人会理会。

告警通知必须做分级:

  1. 致命级(Critical):如汇流箱起火、变压器重瓦斯动作,直接电话拨号或语音机器人,不分昼夜。
  2. 严重级(Major):如逆变器全站停机,App 推送 + 钉钉/微信群通知,限工作时间或运维值班表人员。
  3. 提示级(Info):如滤网堵塞、通讯偶尔丢包,只记录在系统日志,周报里体现即可。

另外,抑制逻辑非常重要。如果一个电站已经处于「全站离线」状态,那么这个站下属的所有「组件电流偏低」、「功率偏差大」告警都应该被静默。因为根源问题是离线,其他的都是伴生现象。我们在 2023 年底做的一个山东 50MW 项目中,通过这套抑制逻辑,将无效告警条数减少了约 70% 左右。

状态机管理:从告警到工单的闭环

告警不是发出去就完了,它得有生命周期。一个成熟的监控平台,告警引擎必须和工单系统深度耦合。

告警的状态通常分为:待触发 -> 活跃中 -> 已确认 -> 已消除。这里有个细节我们死磕了很久:告警自愈。很多时候电网波动是暂时的,10 分钟后电压恢复了,逆变器自动重启了。这时候,优秀的引擎应该自动把之前的「活跃」告警标记为「已消除」,并同步关闭关联的待处理工单。

如果你让运维人员去现场跑了一趟,发现设备早好了,回来还得手动点「关闭告警」,这种系统在他们眼里就是垃圾。我们现在的做法是:告警产生时生成一个 Unique Key,只要设备状态没恢复,这个 Key 就一直挂在内存的哈希表里;一旦收到恢复报文,立即销毁 Key 并发送「自愈通知」。

我们的取舍与判断

做告警引擎,技术难度其实不在算法,而在对业务逻辑的理解。你是宁可错报一千,不可漏报一个?还是追求极高的精准度?在光伏这个行业,我们的判断是:分场景对待。

对于资产方,他们需要的是「干净」的数据,他们不想看过程,只想看结果。所以聚合和抑制要做到出色。对于 EPC 运维人员,他们需要「现场感」,哪怕是瞬时的波动也想知道,所以原始事件日志必须保留,但在通知层要克制。

我们目前在 ZenovaConnect 的架构中,将告警引擎独立成了一个高可用的微服务,通过 Kafka 挂载在采集层之后。这样哪怕前端界面挂了,告警的下发和记录也不会丢。这对于那些管理 50 个以上电站的团队来说,是必须要考虑的架构冗余。

最后一个问题留给各位工程师:在你的实际运维经验中,哪类逆变器的「虚假告警」最让你头疼?欢迎在评论区分享你的排雷经历。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进