xref: /openbmc/telemetry/src/metric.hpp (revision 3eb56865)
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     uint64_t sensorCount() const override;
26 
27   private:
28     class CollectionData;
29     class DataPoint;
30     class DataInterval;
31     class DataStartup;
32 
33     static std::vector<std::unique_ptr<CollectionData>>
34         makeCollectionData(size_t size, OperationType, CollectionTimeScope,
35                            CollectionDuration);
36 
37     void attemptUnpackJsonMetadata();
38     CollectionData& findAssociatedData(const interfaces::Sensor& notifier);
39 
40     std::string id;
41     std::string metadata;
42     std::vector<MetricValue> readings;
43     Sensors sensors;
44     OperationType operationType;
45     CollectionTimeScope collectionTimeScope;
46     CollectionDuration collectionDuration;
47     std::vector<std::unique_ptr<CollectionData>> collectionAlgorithms;
48     std::unique_ptr<interfaces::Clock> clock;
49 };
50