V3版本的恢复门限告警的事件描述中未显示实际恢复告警时的温度值

// 此模板仅供参考,如果不适用可以修改

问题描述

对比V2和V3版本的门限告警描述,当前V3版本的恢复门限告警的事件描述中未显示实际恢复告警时的温度值。V3是否可以改动这部分代码,实现和v2一样的效果吗

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

知道如何修改使得恢复告警描述显示实际温度值

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:

五、结论与建议

结论项 内容
问题定位 V3 版本中,告警恢复事件的描述文本未根据当前 Reading 值动态刷新,仍沿用 Assert 时的快照。
是否可修复 :white_check_mark: 完全可以修复,属于事件描述生成逻辑的设计缺陷或演进中的退化。
推荐方案 修改 event 组件服务,在 Deassert 阶段重新计算 DescArg 并生成最新事件描述。
影响范围 所有基于阈值比较的传感器类事件(温度、电压、风扇等)。
建议提交 Issue 向 openUBMC 社区提报:“【缺陷】V3 恢复告警事件描述未显示实际恢复温度值”,归类至 eventwebui 模块。

:paperclip: 补充建议:未来可考虑增加“恢复值记录”字段(RecoveryValue),专门用于存储并展示恢复时的关键指标,提升可观测性。

点击此处查看详细分析解答

V3 版本恢复门限告警事件描述未显示实际温度值的问题分析与解决方案

根据您提出的问题,在 V3 版本中,当温度恢复至正常范围、告警解除(Deasserted)时,事件描述中仍使用的是触发告警时的温度值,而未更新为实际恢复时刻的温度值。 这导致运维人员无法直观判断系统是在何种温度下恢复正常状态,影响故障回溯和性能分析。

而 V2 版本的实现中,该信息是准确更新的。本文将结合现有知识库和工程实践,对此问题进行深入分析,并给出可行的解决方案路径。


一、问题现象对比

项目 V2 版本行为 V3 版本行为
告警触发(Asserted) 显示触发温度,例如:“温度 85.000°C 超出阈值” :white_check_mark: 显示触发温度,例如:“温度 105°C 超出阈值” :white_check_mark:
告警恢复(Deasserted) 动态更新为恢复时的实际温度,例如:“温度 82.000°C 超出阈值” :white_check_mark: 仍保留为触发时的温度值,例如:“温度 105°C 超出阈值”,但实际恢复温度是 45°C :cross_mark:
信息准确性 高,可用于回溯真实恢复点 低,存在误导性

:magnifying_glass_tilted_left: 从截图可见:

  • 序号 660 的恢复事件中,描述为“109°C”,但批注指出“实际是45度恢复”。
  • 序号 658 的恢复事件中,描述为“105°C”,但批注指出“实际是102度恢复”。

说明当前事件描述未根据 Reading 值动态刷新。


二、根本原因分析

该问题的核心在于 事件描述(Event Description)是否在告警恢复阶段重新评估了动态参数(如当前温度值)

1. 事件配置机制差异(V2 vs V3)

在 openUBMC 系统中,事件(Event)通常通过 JSON 配置文件定义其行为,其中包含:

  • EventKeyId:事件唯一标识
  • Reading:读取哪个传感器属性作为判断依据
  • Condition:触发条件(如 > Threshold)
  • DescArg:用于拼接事件描述的参数列表

关键点:V2 可能使用了运行时动态拼接描述的机制,而 V3 改为缓存了初始 Assert 时的描述文本,导致 Deassert 时未重新计算。

2. 与 TemperatureInfo 和 ThresholdSensor 的关系

  • TemperatureInfo 是管理温度数据点的核心对象,定义了传感器的上下门限、当前读数等。
  • TemperatureCelsius 是具体的温度读数字段(见 Knowledge Graph)。
  • TemperatureUpperThreshold 定义了高温告警门限。
  • 比较逻辑为:TemperatureCelsius > TemperatureUpperThreshold 触发告警。

系统虽能正确检测状态变化(Assert/Deassert),但 事件描述字符串的生成逻辑未在恢复时重新执行表达式解析

3. 可能的技术实现问题

  • 描述文本被“固化”:Event 组件可能在 Assert 时生成了一次描述文本并持久化,Deassert 时仅复用该模板而不重新填充参数。
  • 参数绑定时机错误DescArg 中的温度参数可能只在事件首次触发时绑定了一次,后续未更新。
  • 缺少生命周期回调:Event 的 Deassert 流程缺少调用 refresh_description() 类似的机制。

三、是否可以修改实现与 V2 一致?

:white_check_mark: 可以修改,且应作为缺陷修复项处理。

:white_check_mark: 修复方向建议如下:

方案一:在 Event 组件中增加“动态描述刷新”机制

  1. 修改 event 服务逻辑(对应 event 实体):

    • Deassert 流程中,重新获取所有 DescArg 对应的实时值
    • 调用描述模板重新生成事件描述字符串。
    • 写入日志或数据库时使用新生成的描述。
  2. 参考代码位置(推测):

    • 文件:event/hardware_event.lua(文档中提及)
    • 入口:generate_an_event() 函数应支持 assertdeassert 两种模式分别处理描述拼接。

方案二:优化描述模板配置方式

确保 event_def.json 或 CSR 配置中,描述字段支持表达式引用,例如:

"Desc": "The CPU core temperature (${TemperatureCelsius} degrees C) exceeds the overtemperature threshold."

并确保在 每次状态同步(sync_property)时重新解析该表达式,而非缓存结果。

:pushpin: 参考 Document Chunk 5 中 wbf 提供的日志:

[Event_Cpu1VddqTempFail_010102]generate an event [assert] while reading change to [1]
[Event_Cpu1VddqTempFail_010102]generate an event [deassert] while reading change to [0]

表明系统能正确识别状态切换,具备扩展描述刷新的基础能力。


四、临时排查与验证方法

  1. 查看 app.log
    所有事件的生成过程都会记录在 app.log 中,可通过以下命令筛选:

    grep "generate an event" /var/log/app.log | grep "Cpu"
    
  2. 检查 event/sync_property_trace.log
    确认 TemperatureCelsius 的值在恢复时已更新:

    cat /var/log/event/sync_property_trace.log | grep TemperatureCelsius
    
  3. 查看 alarm.logsel.txt
    持久化存储的事件记录是否也存在描述错误。


五、结论与建议

结论项 内容
问题定位 V3 版本中,告警恢复事件的描述文本未根据当前 Reading 值动态刷新,仍沿用 Assert 时的快照。
是否可修复 :white_check_mark: 完全可以修复,属于事件描述生成逻辑的设计缺陷或演进中的退化。
推荐方案 修改 event 组件服务,在 Deassert 阶段重新计算 DescArg 并生成最新事件描述。
影响范围 所有基于阈值比较的传感器类事件(温度、电压、风扇等)。
建议提交 Issue 向 openUBMC 社区提报:“【缺陷】V3 恢复告警事件描述未显示实际恢复温度值”,归类至 eventwebui 模块。

:paperclip: 补充建议:未来可考虑增加“恢复值记录”字段(RecoveryValue),专门用于存储并展示恢复时的关键指标,提升可观测性。


如需进一步协助定位代码路径或构造测试用例,请提供具体平台型号和 openUBMC 分支版本。

我理解一下现在的情况V2温度是使用的当前温度,V3温度使用的是触发告警的温度对吗

是的

在告警逻辑中,事件描述本身作为事件的一部分,应该是不变的,V3实现比较符合事件记录本身的逻辑。

如果是设计如此,那就没什么问题

其实应该可以实现和v2一样的效果

可以把引用属性改为同步属性<=/ 试试