Hardware high availability plays a crucial role in modern data centers, cloud platforms, and critical business systems, since a single hardware failure can cause significant financial loss. However, many hardware issues develop no obvious symptoms in their early stages, making it hard to detect potential failures promptly through traditional manual inspections.
System Event Log (SEL) and Sensor Data Record (SDR) data from the Baseboard Management Controller (BMC) lack a unified analysis platform, and fault localization largely relies on the experience of operations personnel. Moreover, traditional operations react to failures only after they occur, hindering predictive maintenance.
With SEL event (such as temperature exceeding thresholds or insufficient power redundancy) and SDR sensor metadata (such as thresholds and readings) collection, analysis, and alert generation, you can achieve full lifecycle management of hardware health, timely identify hardware issues, and proactively replace faulty components.

Hardware server
The hardware server is deployed in AOC as a Pod. It periodically queries the clusters associated with AOC in round-robin mode to collect the information of agents, and records their deployment status.
Agent
Agents are deployed on each node of the cluster, and are mainly divided into the following types:
ipmi-agent: Collects SEL events and SDR sensor data through in-band mode, parses the data, and stores it in a local SQLite database. It determines whether SEL events should trigger alerts and provides query interfaces for SEL and SDR.
alert-proxy: Receives alerts sent by ipmi-agent, queries the alert rules interface in round-robin mode, determines whether to enable the alert rules, and decides whether to forward alerts to the cluster alerting components.
It takes about 1 to 6 minutes from the generation of an SEL event until you receive its alert.
ipmi-agent runs the ipmitool -vv sel list command to obtain the raw SEL data in hexadecimal format;
ipmi-agent uses a third-party library to parse the raw SEL hexadecimal data into an SEL event;
ipmi-agent stores the SEL event in the local SQLite database, keeping the latest 3,000 events by timestamp.
ipmi-agent runs the ipmitool -vv sdr command to obtain the raw SDR data in text format;
ipmi-agent parses the raw SDR text data line by line into SDR data;
ipmi-agent stores the SDR data in the local SQLite database, without any limit on the number of entries.
After storing the SEL event in the SQLite database, ipmi-agent checks whether the event matches the alert rules. If matched, it sends an alert to alert-proxy;
alert-proxy periodically queries the alert rule interface in round-robin mode and determines whether to enable the alert rules. If alert rules are to be enabled, it forwards the alert to the cluster alert component.
ipmi-agent provides SEL and SDR query interfaces. AOC queries SEL and SDR data through these interfaces and displays the results.
ipmi-agent also supports request proxy, forwarding query requests to other nodes.
| Field | Description | Acquisition |
|---|---|---|
| Event | Event description. | Obtained by parsing and processing raw SEL data. |
| Event ID | Unique identifier of the event, which is a decimal number used to locate specific entries. | Obtained through the SEL Record ID field. |
| Event status | Status assertion or deassertion. | Obtained through the SEL Event Direction field. |
| Event level | Event level, including Nominal, Warning, and Critical. | Obtained by parsing and processing raw SEL data. |
| Sensor type | Sensor type, such as Temperature, Power Supply, Memory, etc. | Obtained through the SEL Sensor Type field. |
| Sensor ID | Sensor identifier, which is a decimal number, such as 1, 2, etc. | Obtained through the SEL Sensor Number field. |
| Time generated | BMC timestamp when the event occurs. | Obtained through the SEL Timestamp field. |
| Time collection | Time when the log is collected. | Recorded during ipmi-agent collection. |
| Field | Description | Acquisition |
|---|---|---|
| Type | Sensor type, such as Temperature, Power Supply, Memory, etc. | Obtained from the Sensor Type line in the output returned by the ipmitool -vv sdr list command. |
| Name | Sensor name, such as Status, FAN1A, Power Cable, etc. | Obtained from the Sensor ID line in the output returned by the ipmitool -vv sdr list command. |
| ID | Unique sensor identifier, which is a decimal number, such as 1, 2, etc. | Obtained from the Sensor ID line in the output returned by the ipmitool -vv sdr list command. |
| Reading | Reading value of the sensor, which may be empty for some sensors. | Obtained from the Sensor Reading line in the output returned by the ipmitool -vv sdr list command. |
| Status | Status of the sensor, which may be empty for some sensors. | Obtained from the Status line in the output returned by the ipmitool -vv sdr list command. |
| Time collected | Time when the sensor data is collected. | Recorded during ipmi-agent collection. |
| System event log | Number of system event logs associated based on the sensor type and sensor ID. | Obtained through the association with data stored in SQLite. |
| Alert | FREEIPMI SEL event |
|---|---|
| IPMI SEL alert: The host { host name } is operating at a temperature above the stable threshold. | IPMI_Temperature_Limit_Exceeded |
| IPMI SEL alert: The power sensor on the host { host name } is abnormal. | IPMI_Power_Supply_Transition_Severity_Transition_To_Critical_From_Less_Severe |
| IPMI_Power_Supply_Transition_Severity_Transition_To_Non_Recoverable_From_Less_Severe | |
| IPMI_Power_Supply_Transition_Severity_Transition_To_Critical_From_Non_Recoverable | |
| IPMI_Power_Supply_Transition_Severity_Transition_To_Non_Recoverable | |
| IPMI SEL alert: The platform management of the processor on the host { host name } has interrupted. | IPMI_Processor_IERR |
| IPMI SEL alert: The processor on the host { host name } is overheated. | IPMI_Processor_Thermal_Trip |
| IPMI SEL alert: The FRB1 self-check for the processor on the host { host name } failed. | IPMI_Processor_FRB1_BIST_Failure |
| IPMI SEL alert: The processor on the host { host name } hung during the POST process. | IPMI_Processor_FRB2_Hang_In_POST_Failure |
| IPMI SEL alert: The processor on the host { host name } failed to be initialized. | IPMI_Processor_FRB3_Processor_Startup_Initialization_Failure |
| IPMI SEL alert: The processor on the host { host name } has configuration errors. | IPMI_Processor_Configuration_Error |
| IPMI SEL alert: The processor on the host { host name } encountered an SMBIOS uncorrectable complex error. | IPMI_Processor_SMBIOS_Uncorrectable_CPU_Complex_Error |
| IPMI SEL alert: The processor on the host { host name } is disabled. | IPMI_Processor_Processor_Disabled |
| IPMI SEL alert: The processor on the host { host name } has a terminator. | IPMI_Processor_Terminator_Presence_Detected |
| IPMI SEL alert: The self-check for the processor on the host { host name } encountered an exception. | IPMI_Processor_Machine_Check_Exception |
| IPMI SEL alert: The power supply on the host { host name } is faulty. | IPMI_Power_Supply_Power_Supply_Failure_Detected |
| IPMI SEL alert: The AC or DC input to the power supply on the host { host name } is lost. | IPMI_Power_Supply_Power_Supply_Input_Lost_AC_DC |
| IPMI SEL alert: The input to the power supply on the host { host name } is lost or out of the normal range. | IPMI_Power_Supply_Power_Supply_Input_Lost_Or_Out_Of_Range |
| IPMI SEL alert: The power supply on the host { host name } has configuration errors. | IPMI_Power_Supply_Configuration_Error |
| IPMI SEL alert: The redundancy status of the power supply on the host { host name } is abnormal. | IPMI_Power_Supply_Redundancy_Redundancy_Lost |
| IPMI_Power_Supply_Redundancy_Non_Redundant_Sufficient_Resources_From_Redundant | |
| IPMI_Power_Supply_Redundancy_Non_Redundant_Sufficient_Resources_From_Insufficient_Redundancy | |
| IPMI_Power_Supply_Redundancy_Non_Redundant_Insufficient_Resources | |
| IPMI SEL alert: The AC power for the power module on the host { host name } is lost. | IPMI_Power_Unit_AC_Lost |
| IPMI SEL alert: The power module on the host { host name } is faulty. | IPMI_Power_Unit_Power_Unit_Failure_Detected |
| IPMI SEL alert: The power module on the host { host name } has been removed. | IPMI_Power_Unit_Device_Present_Device_Removed_Device_Absent |
| IPMI SEL alert: The redundancy status of the power module on the host { host name } is abnormal. | IPMI_Power_Unit_Redundancy_Redundancy_Lost |
| IPMI_Power_Unit_Redundancy_Non_Redundant_Sufficient_Resources_From_Redundant | |
| IPMI_Power_Unit_Redundancy_Non_Redundant_Sufficient_Resources_From_Insufficient_Redundancy | |
| IPMI_Power_Unit_Redundancy_Non_Redundant_Insufficient_Resources | |
| IPMI SEL alert: The memory on the host { host name } encountered uncorrectable errors. | IPMI_Memory_Uncorrectable_Memory_Error |
| IPMI SEL alert: The memory on the host { host name } encountered parity check errors. | IPMI_Memory_Parity |
| IPMI SEL alert: The memory on the host { host name } is disabled. | IPMI_Memory_Memory_Device_Disabled |
| IPMI SEL alert: The memory on the host { host name } has configuration errors. | IPMI_Memory_Configuration_Error |
| IPMI SEL alert: The memory on the host { host name } is overheated. | IPMI_Memory_Critical_Overtemperature |
| IPMI SEL alert: The memory on the host { host name } is abnormal. | IPMI_Memory_Transition_Severity_Transition_To_Non_Recoverable_From_Less_Severe |
| IPMI_Memory_Transition_Severity_Transition_To_Non_Critical_From_More_Severe | |
| IPMI_Memory_Transition_Severity_Monitor | |
| IPMI_Memory_Transition_Severity_Transition_To_Non_Recoverable | |
| IPMI SEL alert: The redundancy status of the memory on the host { host name } is abnormal. | IPMI_Memory_Redundancy_Redundancy_Lost |
| IPMI_Memory_Redundancy_Non_Redundant_Sufficient_Resources_From_Redundant | |
| IPMI_Memory_Redundancy_Non_Redundant_Sufficient_Resources_From_Insufficient_Redundancy | |
| IPMI_Memory_Redundancy_Non_Redundant_Insufficient_Resources | |
| IPMI SEL alert: The hard disk slot on the host { host name } encountered a drive failure. | IPMI_Drive_Slot_Drive_Fault |
| IPMI_Drive_Slot_Predictive_Failure | |
| IPMI SEL alert: The hard disk slot on the host { host name } has encountered a drive array failure. | IPMI_Drive_Slot_In_Critical_Array |
| IPMI SEL alert: The number of SEL logs on the host { host name } has reached the upper limit. | IPMI_Event_Logging_Disabled_SEL_Full |
| IPMI SEL alert: The number of SEL logs on the host { host name } is about to reach the upper limit. | IPMI_Event_Logging_Disabled_SEL_Almost_Full |
| IPMI SEL alert: The motherboard device on the host { host name } has been removed. | IPMI_Module_Board_Device_Present_Device_Removed_Device_Absent |
| IPMI SEL alert: The battery on the host { host name } has failed or damaged. | IPMI_Battery_Battery_Failed |
Note:
- To avoid alert storms, instead of triggering new alerts, the following situations only update existing alerts.
- The same sensor reports different types of power sensor status abnormalities.
- The same sensor reports different types of power redundancy status abnormalities.
- The same sensor reports different types of disk slot drive failures.
- The same sensor reports different types of memory redundancy status abnormalities.
- The same sensor reports different types of memory status abnormalities.
- The same sensor reports different types of power module redundancy status abnormalities.
- The same sensor refers to the sensor with the same Sensor Number and Sensor Type Code.
| Byte offset | Field | Length | Description |
|---|---|---|---|
| 0-1 | Record ID | 2 bytes | Unique identifier of log entries (for locating and deleting specific entries) |
| 2-3 | Record Type | 1 byte | Record type (such as system events, OEM custom events, etc.) |
| 3 | Timestamp | 4 bytes | BMC timestamp when the event occurs (typically the number of seconds since BMC startup) |
| 7 | Generator ID | 1 byte | ID of the event generator (such as BMC) |
| 8 | EvM Revision | 1 byte | Event message format version (typically 0x04) |
| 9 | Sensor Type | 1 byte | Sensor type (such as temperature, power supply, fan, etc.) |
| 10 | Sensor Number | 1 byte | Logical number of the sensor (mapped to specific hardware) |
| 11 | Event Type | 1 byte | Event type (such as threshold exceeded, status change, etc.) |
| 12 | Event Direction | 1 byte | Event direction (status assertion or deassertion) |
| 13 | Event Data | 3 bytes | Specific event data (such as threshold values, status codes, etc., depending on the sensor type and event type) |
The following table takes the full sensor record as an example. Other types of SDR record formats are similar.
| Byte offset | Field | Description |
|---|---|---|
| 0 | Record ID | Unique identifier of the record (typically assigned incrementally) |
| 1 | SDR Version | SDR version (0x51 for IPMI 2.0) |
| 2 | Record Type | Record type (such as full sensor record, compact sensor record, etc.) |
| 3 | Record Length | Total record length (bytes, including header) |
| 4-5 | Sensor Owner ID | ID of the controller to which the sensor belongs (such as 0x20 for BMC) |
| 6 | Sensor Number | Logical number of the sensor (corresponds to Sensor Number in SEL) |
| 7 | Sensor Type | Sensor type (corresponds to Sensor Type in SEL) |
| 8 | Event/Reading Type | Event types supported by the sensor (such as the threshold, discrete state, etc.) |
| 9 | Sensor Unit | Unit definition (such as degrees, volts, percentage, etc.) |
| 10-11 | Linearization Formula | Data linearization formula (such as linear, logarithmic, non-linear lookup tables, etc.) |
| 12-13 | M and B | Sensor raw value conversion formula parameters: Value = (M × Raw) + B |
| 14-15 | Thresholds | Threshold settings (such as lower non-recoverable, upper critical, etc.) |
| ... | Custom Fields | Vendor-customized data (such as calibration offsets, sensor location descriptions, etc.) |
Sensor ID : Inlet Temp (0x5)
Entity ID : 64.96 (Air Inlet)
Sensor Type (Threshold) : Temperature (0x01)
Sensor Reading : 29 (+/- 1) degrees C
Status : ok
Nominal Reading : 23.000
Normal Minimum : 11.000
Normal Maximum : 69.000
Upper critical : 47.000
Upper non-critical : 42.000
Lower critical : -7.000
Lower non-critical : 3.000
Positive Hysteresis : 2.000
Negative Hysteresis : 2.000
Minimum sensor range : Unspecified
Maximum sensor range : Unspecified
Event Message Control : Per-threshold
Readable Thresholds : lcr lnc unc ucr
Settable Thresholds : lnc unc
Threshold Read Mask : lcr lnc unc ucr
Assertion Events :
Assertions Enabled : lnc- lcr- unc+ ucr+
Deassertions Enabled : lnc- lcr- unc+ ucr+