属于Event的问题
以下都可以通过一键日志确认
1.告警对象配置正确并正常分发 -- 避免配置错误,或者SR直接就没加载 2.告警关联的数据源已经符合告警条件或者恢复条件 -- Event只关注告警值,门限值,不关注业务到底做了什么操作 3.没有屏蔽、Mock等操作 -- 可根据下方指导自行排查
一键收集日志
目录: AppDump/event
以下文件有助于明确事件生命周期,便于定位,请及时收集日志避免信息丢失难以定位
registered.txt已注册的硬件对象(附初始读值)not_registerd.txt注册失败的硬件对象(附失败原因)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]以下文件用于收集保留当前数据
current_event.txt当前告警sel.txt历史事件(同eo.sel.csv)event.dbevent_reset_db持久化数据库
TOP问题汇总
- Mock接口模拟的告警不持久化 -- 复位不保存
- Mock接口模拟告警后,会隐藏真实告警 -- 查不到告警时先确认有没有Mock
- 所有真实告警复位持久化 -- 复位后还在,包括软件告警,AC不保存
- 查询告警接口不查询Normal级别 -- 查不出告警时先看一眼级别
- 告警信息异常比如参数错误等,event仅读取,不做任何处理,即99.99%是配置问题 -- 或者非问题
- 除Reading需要同步语法,其他属性推荐引用语法(同步语法存在时间差) -- 原因参考配置文档
- 仅系统事件类型支持对外接口查询,运行事件/维护事件在对应的运行日志/维护日志中 -- 问问题前先弄清事件类型
- clear命令清除历史事件,不清除告警,所以可能出现仅有Deassert没有Assert记录的情况 -- Clear后仍会出现告警的原因
- 部分告警码没有对应的Deassert事件 -- 告警可以配置为无恢复事件,具体可咨询告警开发
- 告警描述后面有(SN:xxx) -- 自动拼接,V2同理,不体现在OMRP
问题分类
一、 Event对象未注册/注册失败
先查看日志文件判断是注册失败还是根本就没有分发
一、修改告警值但无告警
1. 告警级别为Normal
请先确定告警的级别,查询告警接口仅查询Minor级别以上告警
ipmcget -d sel -v list查看一下历史记录有没有
静态配置中SeverityId分别对应
| 取值 | 等级 |
|---|---|
| 0 | Normal |
| 1 | Minor |
| 2 | Major |
| 3 | Critical |
2. Reading值未更新
查看一键日志中的Reading变更值记录,如果没有记录则说明告警值没有变更过
Event**仅对Reading值负责**,Event是通过监听Reading值触发告警,出现此问题则需要由告警开发定位,可能原因参考
- 配置表达式有问题,例如数据类型错误
convert value failed when synchronizing property xxx - 命令或脚本修改的值本身就并未关联Reading
- 生效加载的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并不会有日志打印,可能原因参考
SR文件上的其他对象解析异常导致Event对象没有解析
表达式等语法错误被框架拦截
(5) 资源树对象分发慢
查看一键收集日志中的对象注册信息,观测注册时间
分发流程非Event管理,可能原因参考
Event对象较多,至多6000+,platform优先分发,其他文件依次分发,并且是深度优先
Cpu占用或某组件占用过多资源等原因
(6) CSR未加载
如果对象都分发完了日志里也没记录告警对象的信息,那只能是没有分发了
并非环境中存在SR文件就一定会加载,不加载的话Event就不会有对象,更不会有告警
具体加载逻辑需要咨询配置告警的开发,与Event无关
4. 告警被屏蔽
被屏蔽的告警码无法告警,监听到告警值变更直接忽略,有以下2种方式进行屏蔽
- CSR中Enabled属性为false,即配置屏蔽
- 手动设置屏蔽,屏蔽功能支持持久化,查看操作日志
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:模拟恢复 |
特性如下
只要开启了模拟就会隐藏真实告警,不论是Assert还是Deassert
只有退出模拟才会显示真实告警,deassert命令并不会退出,依然是处于模拟状态,退出需要使用stop命令
Mock不持久化,所以复位后就可以产生
6. 非系统事件
只有系统事件才支持北向接口查询,运行事件和维护事件在运行日志和维护日志中
查看静态配置中的EventType
| Type | 类型 |
|---|---|
| 0 | 系统事件 |
| 1 | 维护事件 |
| 2 | 运行事件 |
二、误告警/误恢复
1. 初始值异常
Event在收到资源树对象时会校验一次Reading值,此时Reading值一定是满足告警条件的,并且一定是配置原因导致,可能原因参考
同步的资源树对象未上树或者解析异常,此时解析Event读值失败,会使用默认值0,请配置
@Defalut(仅对同步生效,引用无效)表达式配置有误,使用的还是默认值
同步时,引用对象值未更新,还是默认值,例如Scanner默认值0,还未开始扫描就被读取,建议判断扫描状态
2. 配置了恢复策略
除了常规监听reading值以外,event可以通过配置LifeCycleId为非0,可以同过上下电等进行恢复,具体请看告警配置文档
3. 附加信息变更
AdditionalInfo属性指向的动态参数,在Event对象注册时如果与上一次告警时不一致,会先恢复再重新检测
三、告警描述异常
1. 硬件告警(SR)
通常为告警描述或者告警建议等动态参数异常,原因是读取动态参数失败,为配置问题,可能原因参考
配置了同步语法,同步时信号存在时间差,触发告警时,Event读取动态参数时还未更新,需要改用引用语法或者引用自身
表达式过长,导致更新较慢(计算完成前不会修改值),此类需要业务组件考虑如何优化
表达式配置错误,如数据类型转换错误等
解析异常,如引用的对象异常,获取失败,会取数据类型的默认值
直接验证方法:使用mock查看参数是否正常,如果正常则说明Event处理机制没问题,是同步参数或者同步过程有问题
2. 软件告警
接口会根据MessageArgs属性解析动态参数,此属性需要由字符串数组cjson格式化为字符串,同时为空的动态参数也需要保留
3. Mock告警
Mock本身就不保证参数正确性,因为没有实际触发告警,许多参数可能不会同步
V3支持对没有配置CSR的告警进行模拟,此类模拟肯定是全空的
四、Event冲日志
- SR配置的数据类型错误,转换失败
日志为convert value failed when synchronizing property xxx
- 框架远端未准备好同步
日志为get original value failed when fetch synchronous property xxx
- 软件事件添加失败,此接口被频繁调用,为其他组件添加失败后的重试行为
add event xxx faild ...
- 组件抛的异常会被框架捕获
如果冲日志需要框架优化
event xxx init.lua(xx):nil xxx
五、复位后告警消失
1. Mock告警
Mock接口模拟的告警不持久化
2. 软件告警
软件告警在event服务启动时会尝试恢复
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. 硬件事件
请查看sel日志,event复位时会检查是否需要恢复告警
所有告警都只是复位持久化
六、接口调用失败
1. 非软件接口
请查看event记录的start to add objects日志(position:00),此时自发现才开始分发,分发前所有接口都无法使用,分发时间非Event控制
2. 软件告警接口
排查上述第一点
event会优先恢复复位前的告警,此时间通常为1s左右,此阶段不提供服务,日志见
resume software event start
first resume software event finished
- 添加抛异常请查看log日志,event会记录各种异常日志
add event [xxx] faild, because.....
- 如果抛出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
模拟告警时查看了Event对象符合告警条件,但实际查询不到告警
查看操作日志后发现有Mock操作
发送退出Mock的命令后告警出现
案例3 告警级别是normal
告警后使用查询告警接口查询无目标告警
查询告警码严重等级发现是Normal级别
查看历史事件记录发现目标事件
案例4 告警本身就没有恢复事件
模拟告警恢复后,查询历史事件记录查不到
通过查询配置数据发现DeassertFlag为0,即不产生恢复事件
案例5 告警码被屏蔽
场景一
模拟告警查询不到
通过查看操作日志并没有主动设置屏蔽
查看SR配置发现有配置屏蔽
场景二
模拟告警查询不到
通过查看操作日志有设置屏蔽的操作日志
总结: 上面章节有提到查询屏蔽事件接口
案例6 没有监听到Reading变更
场景一
SR没生效,修改的值本来就不会触发告警
场景二
修改错了对象,跟目标告警没关系
场景三
表达式错误,修改失败
案例7 Event对象就没注册
查看日志registered.txt和not_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文件