1 #include "config.h" 2 3 #include "health_monitor.hpp" 4 5 #include <phosphor-logging/lg2.hpp> 6 #include <sdbusplus/async.hpp> 7 #include <xyz/openbmc_project/Inventory/Item/Bmc/common.hpp> 8 #include <xyz/openbmc_project/Inventory/Item/common.hpp> 9 10 PHOSPHOR_LOG2_USING; 11 12 namespace phosphor::health::monitor 13 { 14 15 using namespace phosphor::health::utils; 16 17 auto HealthMonitor::startup() -> sdbusplus::async::task<> 18 { 19 info("Creating Health Monitor with config size {SIZE}", "SIZE", 20 configs.size()); 21 22 static constexpr auto bmcIntf = sdbusplus::common::xyz::openbmc_project:: 23 inventory::item::Bmc::interface; 24 static constexpr auto invPath = sdbusplus::common::xyz::openbmc_project:: 25 inventory::Item::namespace_path; 26 auto bmcPaths = co_await findPaths(ctx, bmcIntf, invPath); 27 28 for (auto& [type, collectionConfig] : configs) 29 { 30 info("Creating Health Metric Collection for {TYPE}", "TYPE", type); 31 collections[type] = 32 std::make_unique<CollectionIntf::HealthMetricCollection>( 33 ctx.get_bus(), type, collectionConfig, bmcPaths); 34 } 35 36 co_await run(); 37 } 38 39 auto HealthMonitor::run() -> sdbusplus::async::task<> 40 { 41 info("Running Health Monitor"); 42 while (!ctx.stop_requested()) 43 { 44 for (auto& [type, collection] : collections) 45 { 46 debug("Reading Health Metric Collection for {TYPE}", "TYPE", type); 47 collection->read(); 48 } 49 co_await sdbusplus::async::sleep_for( 50 ctx, std::chrono::seconds(MONITOR_COLLECTION_INTERVAL)); 51 } 52 } 53 54 } // namespace phosphor::health::monitor 55 56 using namespace phosphor::health::monitor; 57 58 int main() 59 { 60 constexpr auto path = MetricIntf::ValueIntf::Value::namespace_path::value; 61 sdbusplus::async::context ctx; 62 sdbusplus::server::manager_t manager{ctx, path}; 63 constexpr auto healthMonitorServiceName = "xyz.openbmc_project.HealthMon"; 64 65 info("Creating health monitor"); 66 HealthMonitor healthMonitor{ctx}; 67 ctx.request_name(healthMonitorServiceName); 68 69 ctx.run(); 70 return 0; 71 } 72