xref: /openbmc/telemetry/src/report.hpp (revision b4ef22e4d365bde35a7fce7950033c9271c68ce7)
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 
14 #include <boost/asio/io_context.hpp>
15 #include <boost/asio/steady_timer.hpp>
16 #include <sdbusplus/asio/object_server.hpp>
17 
18 #include <chrono>
19 #include <memory>
20 #include <unordered_set>
21 
22 class Report : public interfaces::Report
23 {
24   public:
25     Report(boost::asio::io_context& ioc,
26            const std::shared_ptr<sdbusplus::asio::object_server>& objServer,
27            const std::string& reportId, const std::string& reportName,
28            const ReportingType reportingType,
29            std::vector<ReportAction> reportActions, const Milliseconds period,
30            const uint64_t appendLimitIn, const ReportUpdates reportUpdatesIn,
31            interfaces::ReportManager& reportManager,
32            interfaces::JsonStorage& reportStorage,
33            std::vector<std::shared_ptr<interfaces::Metric>> metrics,
34            const bool enabled, std::unique_ptr<interfaces::Clock> clock,
35            const std::vector<std::string>& triggerIds);
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     void updateReadings() override;
53     void updateTriggerIds(const std::string& triggerId,
54                           TriggerIdUpdate updateType) override;
55     bool storeConfiguration() const;
56 
57   private:
58     std::unique_ptr<sdbusplus::asio::dbus_interface> makeReportInterface();
59     static void timerProc(boost::system::error_code, Report& self);
60     void scheduleTimer(Milliseconds interval);
61     std::optional<uint64_t>
62         deduceAppendLimit(const uint64_t appendLimitIn) const;
63     uint64_t deduceBufferSize(const ReportUpdates reportUpdatesIn,
64                               const ReportingType reportingTypeIn) const;
65     void setReportUpdates(const ReportUpdates newReportUpdates);
66     static uint64_t getSensorCount(
67         std::vector<std::shared_ptr<interfaces::Metric>>& metrics);
68     interfaces::JsonStorage::FilePath fileName() const;
69 
70     std::string id;
71     std::string name;
72     ReportingType reportingType;
73     Milliseconds interval;
74     std::vector<ReportAction> reportActions;
75     ReadingParametersPastVersion readingParametersPastVersion;
76     ReadingParameters readingParameters;
77     bool persistency = false;
78     uint64_t sensorCount;
79     std::optional<uint64_t> appendLimit;
80     ReportUpdates reportUpdates;
81     CircularVector<ReadingData> readingsBuffer;
82     Readings readings = {};
83     std::shared_ptr<sdbusplus::asio::object_server> objServer;
84     std::unique_ptr<sdbusplus::asio::dbus_interface> reportIface;
85     std::unique_ptr<sdbusplus::asio::dbus_interface> deleteIface;
86     std::vector<std::shared_ptr<interfaces::Metric>> metrics;
87     boost::asio::steady_timer timer;
88     std::unordered_set<std::string> triggerIds;
89 
90     interfaces::JsonStorage& reportStorage;
91     bool enabled;
92     std::unique_ptr<interfaces::Clock> clock;
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