xref: /openbmc/telemetry/src/metric.hpp (revision 7e098e93)
1 #pragma once
2 
3 #include "interfaces/clock.hpp"
4 #include "interfaces/metric.hpp"
5 #include "interfaces/sensor.hpp"
6 #include "interfaces/sensor_listener.hpp"
7 
8 class Metric :
9     public interfaces::Metric,
10     public interfaces::SensorListener,
11     public std::enable_shared_from_this<Metric>
12 {
13   public:
14     Metric(Sensors sensors, OperationType operationType, std::string id,
15            std::string metadata, CollectionTimeScope, CollectionDuration,
16            std::unique_ptr<interfaces::Clock>);
17     ~Metric();
18 
19     void initialize() override;
20     void deinitialize() override;
21     std::vector<MetricValue> getReadings() const override;
22     void sensorUpdated(interfaces::Sensor&, uint64_t) override;
23     void sensorUpdated(interfaces::Sensor&, uint64_t, double value) override;
24     LabeledMetricParameters dumpConfiguration() const override;
25 
26   private:
27     class CollectionData;
28     class DataPoint;
29     class DataInterval;
30     class DataStartup;
31 
32     static std::vector<std::unique_ptr<CollectionData>>
33         makeCollectionData(size_t size, OperationType, CollectionTimeScope,
34                            CollectionDuration);
35 
36     void attemptUnpackJsonMetadata();
37     CollectionData& findAssociatedData(const interfaces::Sensor& notifier);
38 
39     std::string id;
40     std::string metadata;
41     std::vector<MetricValue> readings;
42     Sensors sensors;
43     OperationType operationType;
44     CollectionTimeScope collectionTimeScope;
45     CollectionDuration collectionDuration;
46     std::vector<std::unique_ptr<CollectionData>> collectionAlgorithms;
47     std::unique_ptr<interfaces::Clock> clock;
48 };
49