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" |
| 4 | #include "utils/json.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 | { |
| 71 | try |
| 72 | { |
| 73 | const nlohmann::json parsedMetadata = nlohmann::json::parse(metadata); |
| 74 | if (const auto metricProperties = |
| 75 | utils::readJson<std::vector<std::string>>(parsedMetadata, |
| 76 | "MetricProperties")) |
| 77 | { |
| 78 | if (readings.size() == metricProperties->size()) |
| 79 | { |
| 80 | for (size_t i = 0; i < readings.size(); ++i) |
| 81 | { |
| 82 | readings[i].metadata = (*metricProperties)[i]; |
| 83 | } |
| 84 | } |
| 85 | } |
| 86 | } |
| 87 | catch (const nlohmann::json::parse_error& e) |
| 88 | {} |
Krzysztof Grobelny | 6ccfcbf | 2020-11-04 09:31:36 +0100 | [diff] [blame] | 89 | } |