Event常见问题指南
更新时间: 2025/10/15
在Gitcode上查看源码

属于Event的问题

以下都可以通过一键日志确认

1.告警对象配置正确并正常分发 -- 避免配置错误,或者SR直接就没加载 2.告警关联的数据源已经符合告警条件或者恢复条件 -- Event只关注告警值,门限值,不关注业务到底做了什么操作 3.没有屏蔽、Mock等操作 -- 可根据下方指导自行排查

一键收集日志

目录: AppDump/event

以下文件有助于明确事件生命周期,便于定位,请及时收集日志避免信息丢失难以定位

  1. registered.txt 已注册的硬件对象(附初始读值)

  2. not_registerd.txt 注册失败的硬件对象(附失败原因)

  3. event_readings.txt 硬件对象最近的三次读值及时间(只要监听到即记录)


: 以上3个文件在部分分支已归一到var/log/alarm.log文件中,转储3次,自动同步时间5分钟,所以最新记录需要一键收集

归一后的日志长这样,部分版本有变更但大差不大

[2024-12-17 16:41:38] [reading] [Event_SystemPowerHigh_010104] [178]
[2024-12-17 17:03:44] [register] [Event_Cpu1UCE_010101] [reading: 0] [costs: 20ms]
[2024-12-17 17:03:44] [register] [Event_Cpu1UCE_010101] [error_msg: no component]

以下文件用于收集保留当前数据

  1. current_event.txt 当前告警

  2. sel.txt 历史事件(同eo.sel.csv)

  3. event.db event_reset_db 持久化数据库

TOP问题汇总

  1. Mock接口模拟的告警不持久化 -- 复位不保存
  2. Mock接口模拟告警后,会隐藏真实告警 -- 查不到告警时先确认有没有Mock
  3. 所有真实告警复位持久化 -- 复位后还在,包括软件告警,AC不保存
  4. 查询告警接口不查询Normal级别 -- 查不出告警时先看一眼级别
  5. 告警信息异常比如参数错误等,event仅读取,不做任何处理,即99.99%是配置问题 -- 或者非问题
  6. 除Reading需要同步语法,其他属性推荐引用语法(同步语法存在时间差) -- 原因参考配置文档
  7. 系统事件类型支持对外接口查询,运行事件/维护事件在对应的运行日志/维护日志中 -- 问问题前先弄清事件类型
  8. clear命令清除历史事件,不清除告警,所以可能出现仅有Deassert没有Assert记录的情况 -- Clear后仍会出现告警的原因
  9. 部分告警码没有对应的Deassert事件 -- 告警可以配置为无恢复事件,具体可咨询告警开发
  10. 告警描述后面有(SN:xxx) -- 自动拼接,V2同理,不体现在OMRP

问题分类

一、 Event对象未注册/注册失败

先查看日志文件判断是注册失败还是根本就没有分发

一、修改告警值但无告警

1. 告警级别为Normal

请先确定告警的级别,查询告警接口仅查询Minor级别以上告警

ipmcget -d sel -v list查看一下历史记录有没有

静态配置中SeverityId分别对应

取值等级
0Normal
1Minor
2Major
3Critical

2. Reading值未更新

查看一键日志中的Reading变更值记录,如果没有记录则说明告警值没有变更过

Event**仅对Reading值负责**,Event是通过监听Reading值触发告警,出现此问题则需要由告警开发定位,可能原因参考

  1. 配置表达式有问题,例如数据类型错误convert value failed when synchronizing property xxx
  2. 命令或脚本修改的值本身就并未关联Reading
  3. 生效加载的CSR就不对

3. 告警对象就没加载

先查看日志文件判断是注册失败还是根本就没有分发

(1) 告警没有配置静态数没匹配上,Event拒绝注册

告警配置中的EventKeyId会用于匹配事件描述,如果没有找到静态配置

debug日志中会打印:xxx has no definition and cannot be registered

一键日志中的注册信息会显示 [register] [Event_xxx] [error_msg: no definition]

(2) 告警没有关联Component或者解析异常

注册的时候会访问关联的Component,为nil则认为配置异常

日志中打印:xxx has no component elements and cannot be registered

一键日志中的注册信息会显示 [register] [Event_xxx] [error_msg: no component]

(3) 告警注册阻塞,耗时很长

(可搜索上方章节中的日志确认)

event会访问关联的Component对象

如果Component解析失败,访问会重试1min(框架机制)

如果多个对象都关联了此对象就会耗时1 * n分钟,导致后面的对象迟迟未能注册

典型案例:

Componeng_CpuBoard配置BoradId数据类型错误,导致关联此对象的多个告警注册失败,导致阻塞注册

此类问题请修复异常配置

(4) CSR解析异常,没有分发

需要日志中搜索对象名查看具体原因,配置问题会被框架拦截,与Event无关所以Event并不会有日志打印,可能原因参考

  1. SR文件上的其他对象解析异常导致Event对象没有解析

  2. 表达式等语法错误被框架拦截

(5) 资源树对象分发慢

查看一键收集日志中的对象注册信息,观测注册时间

分发流程非Event管理,可能原因参考

  1. Event对象较多,至多6000+,platform优先分发,其他文件依次分发,并且是深度优先

  2. Cpu占用或某组件占用过多资源等原因

(6) CSR未加载

如果对象都分发完了日志里也没记录告警对象的信息,那只能是没有分发了

并非环境中存在SR文件就一定会加载,不加载的话Event就不会有对象,更不会有告警

具体加载逻辑需要咨询配置告警的开发,与Event无关

4. 告警被屏蔽

被屏蔽的告警码无法告警,监听到告警值变更直接忽略,有以下2种方式进行屏蔽

  1. CSR中Enabled属性为false,即配置屏蔽
  2. 手动设置屏蔽,屏蔽功能支持持久化,查看操作日志mask event xxx

也可通过查询已屏蔽事件码

busctl --user call bmc.kepler.event /bmc/kepler/Systems/1/Events bmc.kepler.Systems.Events GetMaskedEventList a{ss} 3 Interface cli UserName Administrator ClientAddr 127.0.0.1

5. 告警码处于Mock状态(模拟)

命令示例busctl --user call bmc.kepler.event /bmc/kepler/Systems/1/Events bmc.kepler.Systems.Events MockEvent a{ss}syqy 3 Interface cli UserName Administrator ClientAddr 127.0.0.1 0x0200000B 1 1 1

参数解释

参数个数含义描述
prop1事件码支持全量、精确、按部件模拟,不区分大小写
prop2使能状态1:开启模拟 0:关闭模拟
prop3事件下表对符合告警码第X个事件进行模拟,0则是全量
prop4模拟状态1:模拟生成 0:模拟恢复

特性如下

  1. 只要开启了模拟就会隐藏真实告警,不论是Assert还是Deassert

  2. 只有退出模拟才会显示真实告警,deassert命令并不会退出,依然是处于模拟状态,退出需要使用stop命令

  3. Mock不持久化,所以复位后就可以产生

6. 非系统事件

只有系统事件才支持北向接口查询,运行事件和维护事件在运行日志和维护日志中

查看静态配置中的EventType

Type类型
0系统事件
1维护事件
2运行事件

二、误告警/误恢复

1. 初始值异常

Event在收到资源树对象时会校验一次Reading值,此时Reading值一定是满足告警条件的,并且一定是配置原因导致,可能原因参考

  1. 同步的资源树对象未上树或者解析异常,此时解析Event读值失败,会使用默认值0,请配置@Defalut(仅对同步生效,引用无效)

  2. 表达式配置有误,使用的还是默认值

  3. 同步时,引用对象值未更新,还是默认值,例如Scanner默认值0,还未开始扫描就被读取,建议判断扫描状态

2. 配置了恢复策略

除了常规监听reading值以外,event可以通过配置LifeCycleId为非0,可以同过上下电等进行恢复,具体请看告警配置文档

3. 附加信息变更

AdditionalInfo属性指向的动态参数,在Event对象注册时如果与上一次告警时不一致,会先恢复再重新检测

三、告警描述异常

1. 硬件告警(SR)

通常为告警描述或者告警建议等动态参数异常,原因是读取动态参数失败,为配置问题,可能原因参考

  1. 配置了同步语法,同步时信号存在时间差,触发告警时,Event读取动态参数时还未更新,需要改用引用语法或者引用自身

  2. 表达式过长,导致更新较慢(计算完成前不会修改值),此类需要业务组件考虑如何优化

  3. 表达式配置错误,如数据类型转换错误等

  4. 解析异常,如引用的对象异常,获取失败,会取数据类型的默认值

直接验证方法:使用mock查看参数是否正常,如果正常则说明Event处理机制没问题,是同步参数或者同步过程有问题

2. 软件告警

接口会根据MessageArgs属性解析动态参数,此属性需要由字符串数组cjson格式化为字符串,同时为空的动态参数也需要保留

3. Mock告警

  1. Mock本身就不保证参数正确性,因为没有实际触发告警,许多参数可能不会同步

  2. V3支持对没有配置CSR的告警进行模拟,此类模拟肯定是全空

四、Event冲日志

  1. SR配置的数据类型错误,转换失败

日志为convert value failed when synchronizing property xxx

  1. 框架远端未准备好同步

日志为get original value failed when fetch synchronous property xxx

  1. 软件事件添加失败,此接口被频繁调用,为其他组件添加失败后的重试行为

add event xxx faild ...

  1. 组件抛的异常会被框架捕获

如果冲日志需要框架优化

event xxx init.lua(xx):nil xxx

五、复位后告警消失

1. Mock告警

Mock接口模拟的告警不持久化

2. 软件告警

  1. 软件告警在event服务启动时会尝试恢复

  2. Component如果未匹配到则会增加进缓存队列每5秒重试,3min后超时则不再进行恢复

首次恢复日志:

resume software event start

first resume software event finished

恢复失败日志

resume [xxx] failed for the first time, add to routine test task

结束二次恢复日志

second resume software event finished

超时不恢复日志

resume [xxx] failed for the seconde time, because component name is invalid

3. 硬件事件

  1. 请查看sel日志,event复位时会检查是否需要恢复告警

  2. 所有告警都只是复位持久化

六、接口调用失败

1. 非软件接口

请查看event记录的start to add objects日志(position:00),此时自发现才开始分发,分发前所有接口都无法使用,分发时间非Event控制

2. 软件告警接口

  1. 排查上述第一点

  2. event会优先恢复复位前的告警,此时间通常为1s左右,此阶段不提供服务,日志见

resume software event start

first resume software event finished

  1. 添加抛异常请查看log日志,event会记录各种异常日志

add event [xxx] faild, because.....

  1. 如果抛出State异常又无日志则是重复添加

七、复位后告警加载慢

1. 硬件告警

配置了SR的告警依赖对象分发,分发时才会进行加载

2. 软件告警

软件告警加载依赖Component对象分发,如果没分发则会延迟恢复,最多重试3min

八、模拟告警失败

1. 事件码未定义

模拟成功的前提是由静态配置

看event仓 datas.yaml文件 搜索告警码,此文件为支持的告警全量文件

55x版本看vpd的paltform

2. 关联部件未匹配

Component部件需要与事件码高位匹配

查询环境有无对应的Component Type等于事件码高位例如0x02xxxxxx则需要查找Type为2的部件

九、软件告警添加失败

请查看app日志的报错信息

1. 状态重复

告警都是复位持久化,部分版本不允许重复添加,并且需要调用方自行维护生命周期

2. 没有匹配的Component

根据ComponentName和SubjectType匹配部件,后者可省略,不传入则根据事件码高位进行匹配

十、没有Deassert事件

1. 执行了AC

告警是复位持久化的,AC后丢失

所以Sel日志显示的现象为Deassert丢失

2. 本身就没有恢复事件

事件配置中的LifeCycleId属性用于表征是否会产生恢复事件

DessertFlag为0代表无deassert事件

十一、使用主干开源后版本修改vpd改了部分告警描述后,环境上版本没有变化

vpd构建后产品仓,即Kunpeng,Ascend仓,也要同时build,才能保证生效新版本

十二、event的转储功能?

event的转储功能在5.8已经删除,后面的版本没有这个功能

典型案例收集

重申

Event对直接修改Reading引用值以及Mock接口这2种模拟方式直接负责,其他方式的‘模拟’则先由对应告警开发定位

例如Ipmi、修改非Event对象的属性、操作物料等方式的模拟

单个告警的问题基本都不是Event问题,所以请先自查

一. 修改了某个值用于模拟告警,实际查询没有告警

案例1 模拟方式错误

修改了A对象值,但触发告警的条件是修改B对象的值

总结: 修改的值跟告警无关

案例2 没退出Mock

  1. 模拟告警时查看了Event对象符合告警条件,但实际查询不到告警

  2. 查看操作日志后发现有Mock操作

  3. 发送退出Mock的命令后告警出现

案例3 告警级别是normal

  1. 告警后使用查询告警接口查询无目标告警

  2. 查询告警码严重等级发现是Normal级别

  3. 查看历史事件记录发现目标事件

案例4 告警本身就没有恢复事件

  1. 模拟告警恢复后,查询历史事件记录查不到

  2. 通过查询配置数据发现DeassertFlag为0,即不产生恢复事件

案例5 告警码被屏蔽

场景一

  1. 模拟告警查询不到

  2. 通过查看操作日志并没有主动设置屏蔽

  3. 查看SR配置发现有配置屏蔽

场景二

  1. 模拟告警查询不到

  2. 通过查看操作日志有设置屏蔽的操作日志

总结: 上面章节有提到查询屏蔽事件接口

案例6 没有监听到Reading变更

场景一

SR没生效,修改的值本来就不会触发告警

场景二

修改错了对象,跟目标告警没关系

场景三

表达式错误,修改失败

案例7 Event对象就没注册

查看日志registered.txtnot_registerd.txt都没有

场景一

修改的CSR根本就没生效

场景二

配置错误

案例8 告警时间延后reading值改变的时间

场景一

统一时间内有大量告警产生和恢复,处理是放在一个队列里的,只有上一个处理完,下一个才能进入 当告警产生时,会重新读一次描述信息,此时描述信息可能和预期的不一致,无法解决

其他声明

一、告警时间出现1970

告警产生时间依赖环境时间,此时时间未同步

CSR排查方式分享

用于判断环境加载的CSR到底是什么

直接查看对象

busctl --user call bmc.kepler.hwdiscovery /bmc/kepler/ObjectGroup/{你的Position} bmc.kepler.ObjectGroup GetObjects a{ss}s 0 'event'

查看CSR文件

查看框架日志判断加载的position对应的文件

[self-discovery] name: Connector_PSR_EEP_0101, position: 01010A
position: 01010A, get csr data from /opt/bmc/sr/14100513_00000001040302023953.sr, ...

自发现目录AppDump\hwdiscovery查看具体的CSR文件