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