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