xref: /openbmc/telemetry/src/report.hpp (revision fdb06a141c6d9bbf1088fee974b815d1f35d3bcb)
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