Krzysztof Grobelny | c8e3a64 | 2020-10-23 12:29:16 +0200 | [diff] [blame] | 1 | #include "metric.hpp" |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 2 | |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 3 | #include "types/report_types.hpp" |
Szymon Dompke | 3a61702 | 2021-07-19 18:23:02 +0200 | [diff] [blame^] | 4 | #include "utils/labeled_tuple.hpp" |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 5 | #include "utils/transform.hpp" |
| 6 | |
| 7 | #include <algorithm> |
| 8 | |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 9 | Metric::Metric(Sensors sensorsIn, OperationType operationTypeIn, |
| 10 | std::string idIn, std::string metadataIn, |
| 11 | CollectionTimeScope timeScopeIn, |
| 12 | CollectionDuration collectionDurationIn) : |
| 13 | id(idIn), |
| 14 | metadata(metadataIn), |
| 15 | readings(sensorsIn.size(), |
| 16 | MetricValue{std::move(idIn), std::move(metadataIn), 0., 0u}), |
| 17 | sensors(std::move(sensorsIn)), operationType(operationTypeIn), |
| 18 | timeScope(timeScopeIn), collectionDuration(collectionDurationIn) |
| 19 | { |
| 20 | tryUnpackJsonMetadata(); |
| 21 | } |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 22 | |
| 23 | void Metric::initialize() |
| 24 | { |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 25 | for (const auto& sensor : sensors) |
| 26 | { |
| 27 | sensor->registerForUpdates(weak_from_this()); |
| 28 | } |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 29 | } |
| 30 | |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 31 | const std::vector<MetricValue>& Metric::getReadings() const |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 32 | { |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 33 | return readings; |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 34 | } |
| 35 | |
Krzysztof Grobelny | e8fc575 | 2021-02-05 14:30:45 +0000 | [diff] [blame] | 36 | void Metric::sensorUpdated(interfaces::Sensor& notifier, uint64_t timestamp) |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 37 | { |
Krzysztof Grobelny | e8fc575 | 2021-02-05 14:30:45 +0000 | [diff] [blame] | 38 | MetricValue& mv = findMetric(notifier); |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 39 | mv.timestamp = timestamp; |
| 40 | } |
| 41 | |
Krzysztof Grobelny | e8fc575 | 2021-02-05 14:30:45 +0000 | [diff] [blame] | 42 | void Metric::sensorUpdated(interfaces::Sensor& notifier, uint64_t timestamp, |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 43 | double value) |
| 44 | { |
Krzysztof Grobelny | e8fc575 | 2021-02-05 14:30:45 +0000 | [diff] [blame] | 45 | MetricValue& mv = findMetric(notifier); |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 46 | mv.timestamp = timestamp; |
| 47 | mv.value = value; |
| 48 | } |
| 49 | |
Krzysztof Grobelny | e8fc575 | 2021-02-05 14:30:45 +0000 | [diff] [blame] | 50 | MetricValue& Metric::findMetric(interfaces::Sensor& notifier) |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 51 | { |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 52 | auto it = std::find_if( |
| 53 | sensors.begin(), sensors.end(), |
| 54 | [¬ifier](const auto& sensor) { return sensor.get() == ¬ifier; }); |
| 55 | auto index = std::distance(sensors.begin(), it); |
| 56 | return readings.at(index); |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 57 | } |
| 58 | |
Krzysztof Grobelny | d223819 | 2020-12-02 09:27:28 +0000 | [diff] [blame] | 59 | LabeledMetricParameters Metric::dumpConfiguration() const |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 60 | { |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 61 | auto sensorPath = utils::transform(sensors, [this](const auto& sensor) { |
| 62 | return LabeledSensorParameters(sensor->id().service, sensor->id().path); |
| 63 | }); |
| 64 | |
| 65 | return LabeledMetricParameters(std::move(sensorPath), operationType, id, |
| 66 | metadata, timeScope, collectionDuration); |
| 67 | } |
| 68 | |
| 69 | void Metric::tryUnpackJsonMetadata() |
| 70 | { |
Szymon Dompke | 3a61702 | 2021-07-19 18:23:02 +0200 | [diff] [blame^] | 71 | using MetricMetadata = |
| 72 | utils::LabeledTuple<std::tuple<std::vector<std::string>>, |
| 73 | utils::tstring::MetricProperties>; |
| 74 | |
| 75 | using ReadingMetadata = |
| 76 | utils::LabeledTuple<std::tuple<std::string, std::string>, |
| 77 | utils::tstring::SensorDbusPath, |
| 78 | utils::tstring::SensorRedfishUri>; |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 79 | try |
| 80 | { |
Szymon Dompke | 3a61702 | 2021-07-19 18:23:02 +0200 | [diff] [blame^] | 81 | const MetricMetadata parsedMetadata = |
| 82 | nlohmann::json::parse(metadata).get<MetricMetadata>(); |
| 83 | |
| 84 | if (readings.size() == parsedMetadata.at_index<0>().size()) |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 85 | { |
Szymon Dompke | 3a61702 | 2021-07-19 18:23:02 +0200 | [diff] [blame^] | 86 | for (size_t i = 0; i < readings.size(); ++i) |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 87 | { |
Szymon Dompke | 3a61702 | 2021-07-19 18:23:02 +0200 | [diff] [blame^] | 88 | ReadingMetadata readingMetadata{ |
| 89 | sensors[i]->id().path, parsedMetadata.at_index<0>()[i]}; |
| 90 | readings[i].metadata = readingMetadata.dump(); |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 91 | } |
| 92 | } |
| 93 | } |
Szymon Dompke | 3a61702 | 2021-07-19 18:23:02 +0200 | [diff] [blame^] | 94 | catch (const nlohmann::json::parse_error&) |
Krzysztof Grobelny | dcc4e19 | 2021-03-08 09:09:34 +0000 | [diff] [blame] | 95 | {} |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 96 | } |