1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 4 #pragma once 5 6 #include "utils/time_utils.hpp" 7 8 #include <boost/url/format.hpp> 9 #include <nlohmann/json.hpp> 10 11 #include <cstdint> 12 #include <string> 13 #include <tuple> 14 #include <vector> 15 16 namespace redfish 17 { 18 namespace telemetry 19 { 20 21 using Readings = std::vector<std::tuple<std::string, double, uint64_t>>; 22 using TimestampReadings = std::tuple<uint64_t, Readings>; 23 24 inline nlohmann::json toMetricValues(const Readings& readings) 25 { 26 nlohmann::json metricValues = nlohmann::json::array_t(); 27 28 for (const auto& [metadata, sensorValue, timestamp] : readings) 29 { 30 nlohmann::json::object_t metricReport; 31 metricReport["MetricProperty"] = metadata; 32 metricReport["MetricValue"] = std::to_string(sensorValue); 33 metricReport["Timestamp"] = 34 redfish::time_utils::getDateTimeUintMs(timestamp); 35 metricValues.emplace_back(std::move(metricReport)); 36 } 37 38 return metricValues; 39 } 40 41 inline bool fillReport(nlohmann::json& json, const std::string& id, 42 const TimestampReadings& timestampReadings) 43 { 44 json["@odata.type"] = "#MetricReport.v1_3_0.MetricReport"; 45 json["@odata.id"] = boost::urls::format( 46 "/redfish/v1/TelemetryService/MetricReports/{}", id); 47 json["Id"] = id; 48 json["Name"] = id; 49 json["MetricReportDefinition"]["@odata.id"] = boost::urls::format( 50 "/redfish/v1/TelemetryService/MetricReportDefinitions/{}", id); 51 52 const auto& [timestamp, readings] = timestampReadings; 53 json["Timestamp"] = redfish::time_utils::getDateTimeUintMs(timestamp); 54 json["MetricValues"] = toMetricValues(readings); 55 return true; 56 } 57 58 } // namespace telemetry 59 } // namespace redfish 60