xref: /openbmc/phosphor-fan-presence/sensor-monitor/threshold_alarm_logger.hpp (revision c77b60a5fb9fbad4d22593e2d1185a554beab9e1)
1 /**
2  * Copyright © 2021 IBM Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include <sdbusplus/bus.hpp>
19 #include <sdbusplus/bus/match.hpp>
20 #include <sdeventplus/event.hpp>
21 
22 namespace sensor::monitor
23 {
24 
25 using InterfaceName = std::string;
26 using PropertyName = std::string;
27 using ErrorName = std::string;
28 using ObjectPath = std::string;
29 using InterfaceKey = std::tuple<ObjectPath, InterfaceName>;
30 
31 /**
32  * @class ThresholdAlarmLogger
33  *
34  * This class watches the threshold interfaces
35  *    openbmc_project.Sensor.Threshold.Warning
36  *    openbmc_project.Sensor.Threshold.Critical
37  *    openbmc_project.Sensor.Threshold.PerformanceLoss
38  *
39  * and creates event logs when their high and low alarm
40  * properties set and clear.  The error names of the
41  * event logs are based on the sensor type and look like:
42  *
43  * xyz.openbmc_project.Sensor.Threshold.Error.TemperatureWarningHigh
44  * xyz.openbmc_project.Sensor.Threshold.Error.TemperatureWarningHighClear
45  */
46 class ThresholdAlarmLogger
47 {
48   public:
49     ThresholdAlarmLogger() = delete;
50     ~ThresholdAlarmLogger() = default;
51     ThresholdAlarmLogger(const ThresholdAlarmLogger&) = default;
52     ThresholdAlarmLogger& operator=(const ThresholdAlarmLogger&) = default;
53     ThresholdAlarmLogger(ThresholdAlarmLogger&&) = default;
54     ThresholdAlarmLogger& operator=(ThresholdAlarmLogger&&) = default;
55 
56     /**
57      * @brief Constructor
58      *
59      * Looks for existing active threshold alarms.
60      *
61      * @param[in] bus - The sdbusplus bus object
62      * @param[in] event - The sdeventplus event object
63      */
64     ThresholdAlarmLogger(sdbusplus::bus::bus& bus, sdeventplus::Event& event);
65 
66   private:
67     /**
68      * @brief The propertiesChanged handler for all of the thresholds
69      *        interfaces.
70      *
71      * Creates event logs for high/low alarm sets and clears.
72      *
73      * @param[in] msg - The signal message payload.
74      */
75     void propertiesChanged(sdbusplus::message::message& msg);
76 
77     /**
78      * @brief Checks for active alarms on the path and threshold interface
79      *        passed in and creates event logs if necessary.
80      *
81      * @param[in] interface - The threshold interface
82      * @param[in] sensorPath - The sensor D-Bus path
83      * @param[in] service - The D-Bus service that owns the interface
84      */
85     void checkThresholds(const std::string& interface,
86                          const std::string& sensorPath,
87                          const std::string& service);
88 
89     /**
90      * @brief Creates an event log for the alarm set/clear
91      *
92      * @param[in] sensorPath - The sensor object path
93      * @param[in] interface - The threshold interface
94      * @param[in] alarmProperty - The alarm property name
95      * @param[in] alarmValue - The alarm value
96      */
97     void createEventLog(const std::string& sensorPath,
98                         const std::string& interface,
99                         const std::string& alarmProperty, bool alarmValue);
100 
101     /**
102      * @brief Returns the type of the sensor using the path segment
103      *        that precedes the sensor name.
104      *
105      * /xyz/openbmc_project/sensors/voltage/vout -> type == voltage
106      *
107      * @param[in] sensorPath - The sensor object path name
108      *
109      * @return std::string The type segment
110      */
111     std::string getSensorType(std::string sensorPath);
112 
113     /**
114      * @brief Allows for skipping event logs based on the sensor type.
115      *
116      * Specifically for the 'utilization' type because its provider
117      * doesn't support configurable thresholds yet.
118      *
119      * @param[in] type - The sensor type, like 'temperature'.
120      * @return bool - If it can be skipped or not.
121      */
122     bool skipSensorType(const std::string& type);
123 
124     /**
125      * @brief Returns the inventory path to use for a FRU callout
126      *        for the alarm exceeded errors.
127      *
128      * It finds the path by looking for 'inventory' or 'chassis'
129      * association objects on the sensor that point to a FRU.
130      *
131      * @param[in] std::string - The sensor object path
132      * @return std::string - The inventory path for the FRU callout.
133      *                       May be empty if none found.
134      */
135     std::string getCallout(const std::string& sensorPath);
136 
137     /**
138      * @brief The sdbusplus bus object
139      */
140     sdbusplus::bus::bus& bus;
141 
142     /**
143      * @brief The sdeventplus Event object
144      */
145     sdeventplus::Event& event;
146 
147     /**
148      * @brief The Warning interface match object
149      */
150     sdbusplus::bus::match::match warningMatch;
151 
152     /**
153      * @brief The Critical interface match object
154      */
155     sdbusplus::bus::match::match criticalMatch;
156 
157     /**
158      * @brief The PerformanceLoss interface match object
159      */
160     sdbusplus::bus::match::match perfLossMatch;
161 
162     /**
163      * @brief The current alarm values
164      */
165     std::map<InterfaceKey, std::map<PropertyName, bool>> alarms;
166 };
167 
168 } // namespace sensor::monitor
169