1 #include "metric.hpp" 2 3 #include "interfaces/types.hpp" 4 #include "utils/transform.hpp" 5 6 #include <algorithm> 7 8 Metric::Metric(std::shared_ptr<interfaces::Sensor> sensor, 9 OperationType operationType, std::string id, 10 std::string metadata) : 11 sensor(std::move(sensor)), 12 operationType(std::move(operationType)), reading{std::move(id), 13 std::move(metadata), 0., 14 0u} 15 {} 16 17 void Metric::initialize() 18 { 19 sensor->registerForUpdates(weak_from_this()); 20 } 21 22 const MetricValue& Metric::getReading() const 23 { 24 return reading; 25 } 26 27 void Metric::sensorUpdated(interfaces::Sensor& notifier, uint64_t timestamp) 28 { 29 MetricValue& mv = findMetric(notifier); 30 mv.timestamp = timestamp; 31 } 32 33 void Metric::sensorUpdated(interfaces::Sensor& notifier, uint64_t timestamp, 34 double value) 35 { 36 MetricValue& mv = findMetric(notifier); 37 mv.timestamp = timestamp; 38 mv.value = value; 39 } 40 41 MetricValue& Metric::findMetric(interfaces::Sensor& notifier) 42 { 43 if (sensor.get() != ¬ifier) 44 { 45 throw std::out_of_range("unknown sensor"); 46 } 47 return reading; 48 } 49 50 LabeledMetricParameters Metric::dumpConfiguration() const 51 { 52 auto sensorPath = 53 LabeledSensorParameters(sensor->id().service, sensor->id().path); 54 return LabeledMetricParameters(std::move(sensorPath), operationType, 55 reading.id, reading.metadata); 56 } 57