1 #pragma once 2 3 #include "interfaces/clock.hpp" 4 #include "interfaces/json_storage.hpp" 5 #include "interfaces/metric.hpp" 6 #include "interfaces/report.hpp" 7 #include "interfaces/report_factory.hpp" 8 #include "interfaces/report_manager.hpp" 9 #include "types/report_action.hpp" 10 #include "types/report_types.hpp" 11 #include "types/report_updates.hpp" 12 #include "types/reporting_type.hpp" 13 #include "utils/circular_vector.hpp" 14 #include "utils/messanger.hpp" 15 16 #include <boost/asio/io_context.hpp> 17 #include <boost/asio/steady_timer.hpp> 18 #include <sdbusplus/asio/object_server.hpp> 19 20 #include <chrono> 21 #include <memory> 22 #include <unordered_set> 23 24 class Report : public interfaces::Report 25 { 26 public: 27 Report(boost::asio::io_context& ioc, 28 const std::shared_ptr<sdbusplus::asio::object_server>& objServer, 29 const std::string& reportId, const std::string& reportName, 30 const ReportingType reportingType, 31 std::vector<ReportAction> reportActions, const Milliseconds period, 32 const uint64_t appendLimitIn, const ReportUpdates reportUpdatesIn, 33 interfaces::ReportManager& reportManager, 34 interfaces::JsonStorage& reportStorage, 35 std::vector<std::shared_ptr<interfaces::Metric>> metrics, 36 const interfaces::ReportFactory& reportFactory, const bool enabled, 37 std::unique_ptr<interfaces::Clock> clock); 38 39 Report(const Report&) = delete; 40 Report(Report&&) = delete; 41 Report& operator=(const Report&) = delete; 42 Report& operator=(Report&&) = delete; 43 44 std::string getId() const override 45 { 46 return id; 47 } 48 49 std::string getPath() const override 50 { 51 return reportDir + id; 52 } 53 54 private: 55 std::unique_ptr<sdbusplus::asio::dbus_interface> 56 makeReportInterface(const interfaces::ReportFactory& reportFactory); 57 static void timerProc(boost::system::error_code, Report& self); 58 void scheduleTimer(Milliseconds interval); 59 std::optional<uint64_t> 60 deduceAppendLimit(const uint64_t appendLimitIn) const; 61 uint64_t deduceBufferSize(const ReportUpdates reportUpdatesIn, 62 const ReportingType reportingTypeIn) const; 63 void setReadingBuffer(const ReportUpdates newReportUpdates); 64 void setReportUpdates(const ReportUpdates newReportUpdates); 65 static uint64_t getSensorCount( 66 std::vector<std::shared_ptr<interfaces::Metric>>& metrics); 67 interfaces::JsonStorage::FilePath fileName() const; 68 std::unordered_set<std::string> 69 collectTriggerIds(boost::asio::io_context& ioc) const; 70 bool storeConfiguration() const; 71 void updateReadings(); 72 73 std::string id; 74 std::string name; 75 ReportingType reportingType; 76 Milliseconds interval; 77 std::unordered_set<ReportAction> reportActions; 78 ReadingParametersPastVersion readingParametersPastVersion; 79 ReadingParameters readingParameters; 80 bool persistency = false; 81 uint64_t sensorCount; 82 std::optional<uint64_t> appendLimit; 83 ReportUpdates reportUpdates; 84 CircularVector<ReadingData> readingsBuffer; 85 Readings readings = {}; 86 std::shared_ptr<sdbusplus::asio::object_server> objServer; 87 std::unique_ptr<sdbusplus::asio::dbus_interface> reportIface; 88 std::unique_ptr<sdbusplus::asio::dbus_interface> deleteIface; 89 std::vector<std::shared_ptr<interfaces::Metric>> metrics; 90 boost::asio::steady_timer timer; 91 std::unordered_set<std::string> triggerIds; 92 93 interfaces::JsonStorage& reportStorage; 94 bool enabled; 95 std::unique_ptr<interfaces::Clock> clock; 96 utils::Messanger messanger; 97 98 public: 99 static constexpr const char* reportIfaceName = 100 "xyz.openbmc_project.Telemetry.Report"; 101 static constexpr const char* reportDir = 102 "/xyz/openbmc_project/Telemetry/Reports/"; 103 static constexpr const char* deleteIfaceName = 104 "xyz.openbmc_project.Object.Delete"; 105 static constexpr size_t reportVersion = 6; 106 }; 107