diff options
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0002-Sync-Telmetry-service-with-EventService.patch')
-rw-r--r-- | meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0002-Sync-Telmetry-service-with-EventService.patch | 295 |
1 files changed, 0 insertions, 295 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0002-Sync-Telmetry-service-with-EventService.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0002-Sync-Telmetry-service-with-EventService.patch deleted file mode 100644 index 3088a7f9d..000000000 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0002-Sync-Telmetry-service-with-EventService.patch +++ /dev/null @@ -1,295 +0,0 @@ -From 541353a4e4b06de42b6a9a400629f5a5fba04e86 Mon Sep 17 00:00:00 2001 -From: "Wludzik, Jozef" <jozef.wludzik@intel.com> -Date: Tue, 15 Dec 2020 12:30:31 +0100 -Subject: [PATCH] Sync Telmetry service with EventService - -Synced the latest changes in Telemetry service with Event Service -code. Now assembling MetricReport is covered in single place in -code. Updated method of fetching Readings from Telemetry by -Event Service. Using ReportUpdate signal is no longer -supported. Now Event Service monitors for PropertiesChanged signal -from /xyz/openbmc_project/Telemetry/Reports path. - -Tested: - - Verified that EventListener received MetricReport response from - Event Service in insecure http push style eventing mode - -Change-Id: I2fc1841a6c9259a8bff30b34bddc0d4aabd41912 -Signed-off-by: Wludzik, Jozef <jozef.wludzik@intel.com> -Signed-off-by: Lukasz Kazmierczak <lukasz.kazmierczak@intel.com> ---- - .../include/event_service_manager.hpp | 156 ++++++------------ - redfish-core/lib/metric_report.hpp | 28 ++-- - 2 files changed, 69 insertions(+), 115 deletions(-) - -diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index 3f398d7..cf9f658 100644 ---- a/redfish-core/include/event_service_manager.hpp -+++ b/redfish-core/include/event_service_manager.hpp -@@ -14,6 +14,7 @@ - // limitations under the License. - */ - #pragma once -+#include "metric_report.hpp" - #include "registries.hpp" - #include "registries/base_message_registry.hpp" - #include "registries/openbmc_message_registry.hpp" -@@ -511,47 +512,32 @@ class Subscription : public persistent_data::UserSubscription - } - #endif - -- void filterAndSendReports(const std::string& id2, -- const std::string& readingsTs, -- const ReadingsObjType& readings) -+ void filterAndSendReports( -+ const std::string& id, -+ const std::variant<telemetry::TimestampReadings>& var) - { -- std::string metricReportDef = -- "/redfish/v1/TelemetryService/MetricReportDefinitions/" + id2; -+ std::string mrdUri = telemetry::metricReportDefinitionUri + id; - - // Empty list means no filter. Send everything. - if (metricReportDefinitions.size()) - { - if (std::find(metricReportDefinitions.begin(), - metricReportDefinitions.end(), -- metricReportDef) == metricReportDefinitions.end()) -+ mrdUri) == metricReportDefinitions.end()) - { - return; - } - } - -- nlohmann::json metricValuesArray = nlohmann::json::array(); -- for (const auto& it : readings) -+ nlohmann::json msg; -+ if (!telemetry::fillReport(msg, id, var)) - { -- metricValuesArray.push_back({}); -- nlohmann::json& entry = metricValuesArray.back(); -- -- auto& [id, property, value, timestamp] = it; -- -- entry = {{"MetricId", id}, -- {"MetricProperty", property}, -- {"MetricValue", std::to_string(value)}, -- {"Timestamp", crow::utility::getDateTime(timestamp)}}; -+ BMCWEB_LOG_ERROR << "Failed to fill the MetricReport for DBus " -+ "Report with id " -+ << id; -+ return; - } - -- nlohmann::json msg = { -- {"@odata.id", "/redfish/v1/TelemetryService/MetricReports/" + id}, -- {"@odata.type", "#MetricReport.v1_3_0.MetricReport"}, -- {"Id", id2}, -- {"Name", id2}, -- {"Timestamp", readingsTs}, -- {"MetricReportDefinition", {{"@odata.id", metricReportDef}}}, -- {"MetricValues", metricValuesArray}}; -- - this->sendEvent( - msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace)); - } -@@ -1317,75 +1303,6 @@ class EventServiceManager - } - - #endif -- -- void getMetricReading(const std::string& service, -- const std::string& objPath, const std::string& intf) -- { -- std::size_t found = objPath.find_last_of('/'); -- if (found == std::string::npos) -- { -- BMCWEB_LOG_DEBUG << "Invalid objPath received"; -- return; -- } -- -- std::string idStr = objPath.substr(found + 1); -- if (idStr.empty()) -- { -- BMCWEB_LOG_DEBUG << "Invalid ID in objPath"; -- return; -- } -- -- crow::connections::systemBus->async_method_call( -- [idStr{std::move(idStr)}]( -- const boost::system::error_code ec, -- boost::container::flat_map< -- std::string, std::variant<int32_t, ReadingsObjType>>& -- resp) { -- if (ec) -- { -- BMCWEB_LOG_DEBUG -- << "D-Bus call failed to GetAll metric readings."; -- return; -- } -- -- const int32_t* timestampPtr = -- std::get_if<int32_t>(&resp["Timestamp"]); -- if (!timestampPtr) -- { -- BMCWEB_LOG_DEBUG << "Failed to Get timestamp."; -- return; -- } -- -- ReadingsObjType* readingsPtr = -- std::get_if<ReadingsObjType>(&resp["Readings"]); -- if (!readingsPtr) -- { -- BMCWEB_LOG_DEBUG << "Failed to Get Readings property."; -- return; -- } -- -- if (!readingsPtr->size()) -- { -- BMCWEB_LOG_DEBUG << "No metrics report to be transferred"; -- return; -- } -- -- for (const auto& it : -- EventServiceManager::getInstance().subscriptionsMap) -- { -- std::shared_ptr<Subscription> entry = it.second; -- if (entry->eventFormatType == metricReportFormatType) -- { -- entry->filterAndSendReports( -- idStr, crow::utility::getDateTime(*timestampPtr), -- *readingsPtr); -- } -- } -- }, -- service, objPath, "org.freedesktop.DBus.Properties", "GetAll", -- intf); -- } -- - void unregisterMetricReportSignal() - { - if (matchTelemetryMonitor) -@@ -1405,9 +1322,11 @@ class EventServiceManager - } - - BMCWEB_LOG_DEBUG << "Metrics report signal - Register"; -- std::string matchStr( -- "type='signal',member='ReportUpdate', " -- "interface='xyz.openbmc_project.MonitoringService.Report'"); -+ std::string matchStr = "type='signal',member='PropertiesChanged'," -+ "interface='org.freedesktop.DBus.Properties'," -+ "path_namespace=/xyz/openbmc_project/Telemetry/" -+ "Reports/TelemetryService," -+ "arg0=xyz.openbmc_project.Telemetry.Report"; - - matchTelemetryMonitor = std::make_shared<sdbusplus::bus::match::match>( - *crow::connections::systemBus, matchStr, -@@ -1418,10 +1337,43 @@ class EventServiceManager - return; - } - -- std::string service = msg.get_sender(); -- std::string objPath = msg.get_path(); -- std::string intf = msg.get_interface(); -- getMetricReading(service, objPath, intf); -+ sdbusplus::message::object_path path(msg.get_path()); -+ std::string id = path.filename(); -+ if (id.empty()) -+ { -+ BMCWEB_LOG_ERROR << "Failed to get Id from path"; -+ return; -+ } -+ -+ std::string intf; -+ std::vector<std::pair< -+ std::string, std::variant<telemetry::TimestampReadings>>> -+ props; -+ std::vector<std::string> invalidProps; -+ msg.read(intf, props, invalidProps); -+ -+ auto found = -+ std::find_if(props.begin(), props.end(), [](const auto& x) { -+ return x.first == "Readings"; -+ }); -+ if (found == props.end()) -+ { -+ BMCWEB_LOG_INFO -+ << "Failed to get Readings from Report properties"; -+ return; -+ } -+ -+ const std::variant<telemetry::TimestampReadings>& readings = -+ found->second; -+ for (const auto& it : -+ EventServiceManager::getInstance().subscriptionsMap) -+ { -+ Subscription& entry = *it.second.get(); -+ if (entry.eventFormatType == metricReportFormatType) -+ { -+ entry.filterAndSendReports(id, readings); -+ } -+ } - }); - } - -diff --git a/redfish-core/lib/metric_report.hpp b/redfish-core/lib/metric_report.hpp -index 63c8c19..7fe281d 100644 ---- a/redfish-core/lib/metric_report.hpp -+++ b/redfish-core/lib/metric_report.hpp -@@ -33,16 +33,14 @@ inline nlohmann::json toMetricValues(const Readings& readings) - return metricValues; - } - --inline void fillReport(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, -- const std::string& id, -+inline bool fillReport(nlohmann::json& json, const std::string& id, - const std::variant<TimestampReadings>& var) - { -- asyncResp->res.jsonValue["@odata.type"] = -- "#MetricReport.v1_3_0.MetricReport"; -- asyncResp->res.jsonValue["@odata.id"] = telemetry::metricReportUri + id; -- asyncResp->res.jsonValue["Id"] = id; -- asyncResp->res.jsonValue["Name"] = id; -- asyncResp->res.jsonValue["MetricReportDefinition"]["@odata.id"] = -+ json["@odata.type"] = "#MetricReport.v1_3_0.MetricReport"; -+ json["@odata.id"] = telemetry::metricReportUri + id; -+ json["Id"] = id; -+ json["Name"] = id; -+ json["MetricReportDefinition"]["@odata.id"] = - telemetry::metricReportDefinitionUri + id; - - const TimestampReadings* timestampReadings = -@@ -50,14 +48,14 @@ inline void fillReport(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, - if (!timestampReadings) - { - BMCWEB_LOG_ERROR << "Property type mismatch or property is missing"; -- messages::internalError(asyncResp->res); -- return; -+ return false; - } - - const auto& [timestamp, readings] = *timestampReadings; -- asyncResp->res.jsonValue["Timestamp"] = -+ json["Timestamp"] = - crow::utility::getDateTime(static_cast<time_t>(timestamp)); -- asyncResp->res.jsonValue["MetricValues"] = toMetricValues(readings); -+ json["MetricValues"] = toMetricValues(readings); -+ return true; - } - } // namespace telemetry - -@@ -118,7 +116,11 @@ inline void requestRoutesMetricReport(App& app) - return; - } - -- telemetry::fillReport(asyncResp, id, ret); -+ if (!telemetry::fillReport( -+ asyncResp->res.jsonValue, id, ret)) -+ { -+ messages::internalError(asyncResp->res); -+ } - }, - telemetry::service, reportPath, - "org.freedesktop.DBus.Properties", "Get", --- -2.25.1 |