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