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