#include "report_factory.hpp" #include "metric.hpp" #include "report.hpp" #include "sensor.hpp" #include "utils/clock.hpp" #include "utils/conversion.hpp" #include "utils/dbus_mapper.hpp" #include "utils/transform.hpp" ReportFactory::ReportFactory( std::shared_ptr bus, const std::shared_ptr& objServer, SensorCache& sensorCache) : bus(std::move(bus)), objServer(objServer), sensorCache(sensorCache) {} std::unique_ptr ReportFactory::make( const std::string& name, const std::string& reportingType, bool emitsReadingsSignal, bool logToMetricReportsCollection, Milliseconds period, interfaces::ReportManager& reportManager, interfaces::JsonStorage& reportStorage, std::vector labeledMetricParams) const { std::vector> metrics = utils::transform( labeledMetricParams, [this](const LabeledMetricParameters& param) -> std::shared_ptr { namespace ts = utils::tstring; return std::make_shared( getSensors(param.at_label()), param.at_label(), param.at_label(), param.at_label(), param.at_label(), param.at_label(), std::make_unique()); }); return std::make_unique( bus->get_io_context(), objServer, name, reportingType, emitsReadingsSignal, logToMetricReportsCollection, period, reportManager, reportStorage, std::move(metrics)); } Sensors ReportFactory::getSensors( const std::vector& sensorPaths) const { using namespace utils::tstring; return utils::transform(sensorPaths, [this](const LabeledSensorParameters& sensorPath) -> std::shared_ptr { return sensorCache.makeSensor( sensorPath.at_label(), sensorPath.at_label(), bus->get_io_context(), bus); }); } std::vector ReportFactory::convertMetricParams( boost::asio::yield_context& yield, const ReadingParameters& metricParams) const { auto tree = utils::getSubTreeSensors(yield, bus); return utils::transform(metricParams, [&tree](const auto& item) { const auto& [sensorPaths, operationType, id, metadata, collectionTimeScope, collectionDuration] = item; std::vector sensorParameters; for (const auto& sensorPath : sensorPaths) { auto it = std::find_if( tree.begin(), tree.end(), [&sensorPath](const auto& v) { return v.first == sensorPath; }); if (it != tree.end() && it->second.size() == 1) { const auto& [service, ifaces] = it->second.front(); sensorParameters.emplace_back(service, sensorPath); } } if (sensorParameters.size() != sensorPaths.size()) { throw sdbusplus::exception::SdBusError( static_cast(std::errc::invalid_argument), "Could not find service for provided sensors"); } return LabeledMetricParameters( std::move(sensorParameters), utils::stringToOperationType(operationType), id, metadata, utils::stringToCollectionTimeScope(collectionTimeScope), CollectionDuration(Milliseconds(collectionDuration))); }); }