blob: 26fa703dc32de02b11bd03d90b3b2f7585d6d436 [file] [log] [blame]
#include "trigger_actions.hpp"
#include <phosphor-logging/log.hpp>
#include <ctime>
namespace action
{
static const char* getDirection(double value, double threshold)
{
if (value < threshold)
{
return "decreasing";
}
if (value > threshold)
{
return "increasing";
}
throw std::runtime_error("Invalid value");
}
const char* LogToJournal::getType() const
{
switch (type)
{
case numeric::Type::upperCritical:
return "UpperCritical";
case numeric::Type::lowerCritical:
return "LowerCritical";
case numeric::Type::upperWarning:
return "UpperWarning";
case numeric::Type::lowerWarning:
return "LowerWarning";
}
throw std::runtime_error("Invalid type");
}
void LogToJournal::commit(const std::string& sensorName, uint64_t timestamp,
double value)
{
std::time_t t = static_cast<time_t>(timestamp);
std::array<char, sizeof("YYYY-MM-DDThh:mm:ssZ")> buf = {};
size_t size =
std::strftime(buf.data(), buf.size(), "%FT%TZ", std::gmtime(&t));
if (size == 0)
{
throw std::runtime_error("Failed to parse timestamp to string");
}
std::string msg = std::string(getType()) +
" numeric threshold condition is met on sensor " +
sensorName + ", recorded value " + std::to_string(value) +
", timestamp " + std::string(buf.data(), size) +
", direction " +
std::string(getDirection(value, threshold));
phosphor::logging::log<phosphor::logging::level::INFO>(msg.c_str());
}
const char* LogToRedfish::getMessageId() const
{
switch (type)
{
case numeric::Type::upperCritical:
return "OpenBMC.0.1.0.NumericThresholdUpperCritical";
case numeric::Type::lowerCritical:
return "OpenBMC.0.1.0.NumericThresholdLowerCritical";
case numeric::Type::upperWarning:
return "OpenBMC.0.1.0.NumericThresholdUpperWarning";
case numeric::Type::lowerWarning:
return "OpenBMC.0.1.0.NumericThresholdLowerWarning";
}
throw std::runtime_error("Invalid type");
}
void LogToRedfish::commit(const std::string& sensorName, uint64_t timestamp,
double value)
{
phosphor::logging::log<phosphor::logging::level::INFO>(
"Threshold value is exceeded",
phosphor::logging::entry("REDFISH_MESSAGE_ID=%s", getMessageId()),
phosphor::logging::entry("REDFISH_MESSAGE_ARGS=%s,%f,%llu,%s",
sensorName.c_str(), value, timestamp,
getDirection(value, threshold)));
}
void UpdateReport::commit(const std::string&, uint64_t, double)
{
for (const auto& name : reportNames)
{
reportManager.updateReport(name);
}
}
} // namespace action