summaryrefslogtreecommitdiff
path: root/redfish-core/include/utils/telemetry_utils.hpp
AgeCommit message (Collapse)AuthorFilesLines
2025-02-04clang-format: update latest spec and reformatPatrick Williams1-4/+4
Copy the latest format file from the docs repository and apply. Change-Id: I2f0b9d0fb6e01ed36a2f34c750ba52de3b6d15d1 Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
2025-01-31Fix includesEd Tanous1-2/+10
Clang-tidy misc-include-cleaner appears to now be enforcing significantly more headers than previously. That is overall a good thing, but forces us to fix some issues. This commit is largely just taking the clang-recommended fixes and checking them in. Subsequent patches will fix the more unique issues. Note, that a number of new ignores are added into the .clang-tidy file. These can be cleaned up over time as they're understood. The majority are places where boost includes a impl/x.hpp and x.hpp, but expects you to use the later. include-cleaner opts for the impl, but it isn't clear why. Change-Id: Id3fdd7ee6df6c33b2fd35626898523048dd51bfb Signed-off-by: Ed Tanous <etanous@nvidia.com> Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
2025-01-20Use SPDX identifiersEd Tanous1-0/+2
SPDX identifiers are simpler, and reduce the amount of cruft we have in code files. They are recommended by linux foundation, and therefore we should do as they allow. This patchset does not intend to modify any intent on any existing copyrights or licenses, only to standardize their inclusion. [1] https://www.linuxfoundation.org/blog/blog/copyright-notices-in-open-source-software-projects Change-Id: I935c7c0156caa78fc368c929cebd0f068031e830 Signed-off-by: Ed Tanous <etanous@nvidia.com>
2023-10-05Update to boost 1.83.0Ed Tanous1-1/+1
In boost 1.83.0, the boost::url maintainers deprecated the header only usage of the library without warning. A discussion with the maintainers[1] made it clear that they removed the abiliy on purpose, and they're not going to add it back or add a deprecation strategy (they did say they would update the documentation to actually match the intent), and that from here on in we should be using the cmake boost project to pull in the non-header-only boost libraries we use (which at this point is ONLY boost url). This commit updates to remove the usage of boost::urls::result typedef, which was deprecated in this release (which causes a compile error) and moves it to boost::system::result. In addition, it updates our meson files to pull in the boost project as a cmake dependency. [1] https://cpplang.slack.com/archives/C01JR6C9C4U/p1696441238739129 Tested: Not yet. Change-Id: Ia7adfc0348588915440687c3ab83a1de3e6b845a Signed-off-by: Ed Tanous <edtanous@google.com>
2023-07-31Add PATCH for MetricReportDefinitionLukasz Kazmierczak1-2/+2
Support for PATCH method is added to Metric Report Definition, now selected read/write Report properties can be modified by PATCH method Tested: - Added Report via POST, overwrite editable properties via PATCH and fetched Report via GET checking if received data is properly modified Signed-off-by: Lukasz Kazmierczak <lukasz.kazmierczak@intel.com> Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com> Change-Id: If75110a92c55c9e4f2415f0ed4471baa802643ff
2023-07-20Replace logging with std::formatEd Tanous1-6/+6
std::format is a much more modern logging solution, and gives us a lot more flexibility, and better compile times when doing logging. Unfortunately, given its level of compile time checks, it needs to be a method, instead of the stream style logging we had before. This requires a pretty substantial change. Fortunately, this change can be largely automated, via the script included in this commit under scripts/replace_logs.py. This is to aid people in moving their patchsets over to the new form in the short period where old patches will be based on the old logging. The intention is that this script eventually goes away. The old style logging (stream based) looked like. BMCWEB_LOG_DEBUG << "Foo " << foo; The new equivalent of the above would be: BMCWEB_LOG_DEBUG("Foo {}", foo); In the course of doing this, this also cleans up several ignored linter errors, including macro usage, and array to pointer deconstruction. Note, This patchset does remove the timestamp from the log message. In practice, this was duplicated between journald and bmcweb, and there's no need for both to exist. One design decision of note is the addition of logPtr. Because the compiler can't disambiguate between const char* and const MyThing*, it's necessary to add an explicit cast to void*. This is identical to how fmt handled it. Tested: compiled with logging meson_option enabled, and launched bmcweb Saw the usual logging, similar to what was present before: ``` [Error include/webassets.hpp:60] Unable to find or open /usr/share/www/ static file hosting disabled [Debug include/persistent_data.hpp:133] Restored Session Timeout: 1800 [Debug redfish-core/include/event_service_manager.hpp:671] Old eventService config not exist [Info src/webserver_main.cpp:59] Starting webserver on port 18080 [Error redfish-core/include/event_service_manager.hpp:1301] inotify_add_watch failed for redfish log file. [Info src/webserver_main.cpp:137] Start Hostname Monitor Service... ``` Signed-off-by: Ed Tanous <ed@tanous.net> Change-Id: I86a46aa2454be7fe80df608cb7e5573ca4029ec8
2023-05-30Add support for POST on TriggersCollectionSzymon Dompke1-0/+19
Added POST method on /redfish/v1/TelemetryService/Triggers uri, which creates new trigger in telemetry service, by using dbus call AddTrigger. By DMTF, most of the properties are not required, and as such are treated as optional. Some values can be deduced from others (like 'MetricType', depending on 'DiscreteTriggers' or 'NumericThresholds'). All properties provided in POST body by user will be verified against each other, and errors will be raised. Few examples of such situations: - 'MetricType' is set to 'Discrete' but 'NumericThresholds' was passed. - 'MetricType' is set to 'Numeric' but "DiscreteTriggers' or 'DiscreteTriggerCondition' were passed - 'DiscreteTriggerCondition' is set to 'Specified' but 'DiscreteTriggers' is an empty array or was not passed. - 'DiscreteTriggerCondition' is set to 'Changed' but 'DiscreteTriggers' is passed and is not an empty array. Example 1 – Trigger with discrete values: ``` { "Id": "TestTrigger", "MetricType": "Discrete", "TriggerActions": [ "RedfishEvent" ], "DiscreteTriggerCondition": "Specified", "DiscreteTriggers": [ { "Value": "55.88", "DwellTime": "PT0.001S", "Severity": "Warning" }, { "Name": "My discrete trigger", "Value": "55.88", "DwellTime": "PT0.001S", "Severity": "OK" }, { "Value": "55.88", "DwellTime": "PT0.001S", "Severity": "Critical" } ], "MetricProperties": [ "/redfish/v1/Chassis/AC_Baseboard/Thermal#/Fans/0/Reading" ], "Links": { "MetricReportDefinitions": [] } } Example 2 – trigger with numeric threshold: { "Id": "TestTrigger2", "Name": "My Numeric Trigger", "MetricType": "Numeric", "TriggerActions": [ "RedfishEvent", "RedfishMetricReport" ], "NumericThresholds": { "UpperCritical": { "Reading": 50, "Activation": "Increasing", "DwellTime": "PT0.001S" }, "UpperWarning": { "Reading": 48.1, "Activation": "Increasing", "DwellTime": "PT0.004S" } }, "MetricProperties": [ "/redfish/v1/Chassis/AC_Baseboard/Thermal#/Fans/0/Reading", "/redfish/v1/Chassis/AC_Baseboard/Thermal#/Fans/17/Reading" ], "Links": { "MetricReportDefinitions": [ "/redfish/v1/TelemetryService/MetricReportDefinitions/PowerMetrics", "/redfish/v1/TelemetryService/MetricReportDefinitions/PowerMetricStats", "/redfish/v1/TelemetryService/MetricReportDefinitions/PlatformPowerUsage" ] } } ``` Tested: - Triggers were successfully created with above example message bodies. This can be checked by calling: 'busctl tree xyz.openbmc_project.Telemetry'. - Expected errors were returned for messages with incorrect or mutually exclusive properties and incorrect values. - Redfish service validator is passing. Signed-off-by: Szymon Dompke <szymon.dompke@intel.com> Change-Id: Ief8c76de8aa660ae0d2dbe4610c26a28186a290a
2023-05-23Switched bmcweb to use new telemetry service APIKrzysztof Grobelny1-1/+71
Added support for multiple MetricProperties. Added support for new parameters: CollectionTimeScope, CollectionDuration. ReadingParameters was not yet changed in telemetry backend, instead temporary property ReadingParametersFutureVersion was introduced. Once bmcweb is adapted to use ReadingParametersFutureVersion this property will be renamed in backend to ReadingParameters. Then bmcweb will change to use ReadingParameters. Then ReadingParametersFutureVersion will be removed from backend and everything will be exactly like described in phosphor-dbus-interfaces without introducing breaking changes. Related change in phosphor-dbus-interfaces [1], [2]. This change needs to be bumped together with [3]. Tested: - It is possible to create MetricReportDefinitions with multiple MetricProperties. - Stub values for new parameters are correctly passed to telemetry service. - All existing telemetry service functionalities remain unchanged. [1]: https://github.com/openbmc/phosphor-dbus-interfaces/commit/4f9c09144b60edc015291d2c120fc5b33aa0bec2 [2]: https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/60750 [3]: https://gerrit.openbmc.org/c/openbmc/telemetry/+/58229 Change-Id: I2cd17069e3ea015c8f5571c29278f1d50536272a Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com> Signed-off-by: Lukasz Kazmierczak <lukasz.kazmierczak@intel.com>
2023-01-18Fix a boatload of #includesEd Tanous1-0/+8
Most of these missing includes were found by running clang-tidy on all files, including headers. The existing scripts just run clang-tidy on source files, which doesn't catch most of these. Tested: Code compiles Signed-off-by: Ed Tanous <edtanous@google.com> Change-Id: Ic741fbb2cc9e5e92955fd5a1b778a482830e80e8
2022-08-29Sensor optimizationEd Tanous1-3/+1
SensorsAsyncResp has existed for a long time, and has slowly morphed from its intended usage (as an RAII response object) into a conglomeration of all possible things that a sensor request could want. This leads to a ton of inefficient queries, and lots of data being held for much longer than we'd like. This commit tries to start breaking things apart, and follow the patterns we use elsewhere, passing AsyncResp where a response object is needed, and passing specialized data structures only into the scopes where they're needed. This significantly increases the performance of the /redfish/v1/Chassis/<>/Sensors/<sensor> URI. The optimization changes the URI such that in includes both the sensor type as well as the sensor name in the URI, meaning that from a given tree, we can directly look up the sensor path, instead of having to look up all sensor paths, and do a filename() compare on them. Implementation-wise, there is one main difference in user-facing behavior, in that instead of using a mechanized version of the sensor name for the URI (aka /redfish/v1/Chassis/my_chassis/Sensors/my_sensor) the URI now contains the sensor type (ex /redfish/v1/Chassis/my_chassis/Sensors/temperature_my_sensor). One implementation note: because fan_pwm and fan_tach namespaces have an underscore in them, we normalize these in the URI to fanpwm and fantach respectively such that we can differentiate between the two without looping, and special case them on the other side. This seems like a reasonable compromise. The above means that when a request comes in to query the sensor, we no longer have to pull all sensors to identify the one that matches the name, and we can go directly to the mapper to determine which sensor we need, with a GetObject query. This significantly reduces the amount of time to grab the information from a single sensor. To accomplish this, the per-sensor methods needed broken down into pieces that allowed loading a single sensor at a time, rather than a complete GetManagedObjects call. In practice, this just means breaking out one helper function, such that the new code can directly call GetAll. In a few places, const std::string& had to be replaced with std::string_view, because the new sensor API can directly inline its const char* parameters for types, which allows it to avoid constructing a string copy to do it. Tested: Redfish service validator passes on a S7106 system, and shows a timing of ~40-50ms per sensor request, which is in line with what we'd expect for a keepalive function using Session auth. ''' curl --insecure -w "@curl-format.txt" -H "X-Auth-Token: nOIarWLRFkFN14qVONs0" https://192.168.10.140/redfish/v1/Chassis/Tyan_S7106_Baseboard/Sensors/temperature_sys_air_inlet ''' returns timing that is on the order of 125ms. On this setup, ServiceRoot (which should do no dbus calls) returns in 90ms, so the sensor implementation itself is on the order of 40% of the timing. TelemetryService functions as expected ''' curl -k --user "root:0penBmc" -X POST https://$bmc/redfish/v1/TelemetryService/MetricReportDefinitions/ -d '{"Id": "lxw1", "Metrics": [{"MetricId": "123", "MetricProperties": ["/redfish/v1/Chassis/Tyan_S7106_Baseboard/Power#/Voltages/0"]}], "MetricReportDefinitionType": "OnRequest", "ReportActions": ["LogToMetricReportsCollection"], "Schedule": {"RecurrenceInterval": "100"}}' ''' Succeeds. Also succeeds with MetricProperties set to: /redfish/v1/Chassis/Tyan_S7106_Baseboard/Sensors/voltage_vcc5 Signed-off-by: Ed Tanous <edtanous@google.com> Change-Id: If42f531b385c3b611b100c1c485a1e4e877c5512
2022-04-13Add common url segments parserSzymon Dompke1-0/+58
This change is adding helper template function, which can be used both to validate and read segments from segments_view returned by boost_url parser. Number of segments is also validated - in case when argument count differs from them, false will be returned. In case when we want to validate only existence of a segment, special argument can be passed in its place: 'anySegment'. Reasoning why url_view was chosen instead of strings: - This way code generation is kept minimal. - There are multiple parse functions in boost_url with different rules, but all of them return url_view. This solution should accommodate every use case. Testing done: - Unit tests are added, passing. - Refactored part of telemetry to use this new approach, no regression spotted during simple POST/GET tests. Change-Id: I677a34e1ee570d33f2322a80dc1629f88273e0d5 Signed-off-by: Szymon Dompke <szymon.dompke@intel.com>
2022-03-30Use url_view for telemetry urisSzymon Dompke1-4/+1
This change refactor telemetry code to use bmcweb utility function for uri construction, which is safe and preferred way, instead of string operations. Testing done: - Some basic GET operations done on Telemetry, no regression. Signed-off-by: Szymon Dompke <szymon.dompke@intel.com> Change-Id: I6de5d79a078944d398357f27dc0c201c130c4302
2021-12-17Add support for DELETE on Triggers schemaSzymon Dompke1-4/+10
Added DELETE method on /redfish/v1/TelemetryService/Triggers/<trigger> uri. Dbus Delete interface on trigger object is used as a backend. Tested: - Trigger was removed successfully by making DELETE call on redfish/v1/TelemetryService/Triggers/TestTrigger Signed-off-by: Szymon Dompke <szymon.dompke@intel.com> Change-Id: Ia830920dac6a539da5b289428374cb96d6492183
2021-12-17Add GET method for TriggerCollectionLukasz Kazmierczak1-1/+0
Added GET method for retrieving list of Triggers from Telemetry service Tested: - Added single Trigger and requested result from bmcweb via /redfish/v1/TelemetryService/Triggers - Added multiple Triggers numeric and discrete, and requested results from bmcweb via /redfish/v1/TelemetryService/Triggers - Verified uri /redfish/v1/TelemetryService/Triggers by using Redfish-Service-Validator with no Triggers/empty Collection (passed) Signed-off-by: Lukasz Kazmierczak <lukasz.kazmierczak@intel.com> Change-Id: Ide00eb44901ea1b97b80fc5c5ddfd97e393d4a04
2021-11-05Make telemetry use the common collection utilitiesEd Tanous1-49/+2
getReportCollection is almost a 1:1 copy of getCollectionMembers, but hardcoded for report interface. This commit moves to using the common implementation, rather than duplicating the code. In the course of writing this patchset, it looks like the definition in metric_report_definition.hpp is incorrect, as we pulling metric reports instead of pulling metric report definitions. This commit has the same behavior as the old, but will need to be looked at in the future. Tested: Basic touch testing done by Szymon Dompke. "Everything looks good to me" Signed-off-by: Ed Tanous <edtanous@google.com> Change-Id: I643da1849aacc38848db1da3eeaad0c111521d34
2021-04-08Using AsyncResp everywherezhanghch051-2/+3
Get the core using AsyncResp everywhere, and not have each individual handler creating its own object.We can call app.handle() without fear of the response getting ended after the first tree is done populating. Don't use res.end() anymore. Tested: 1. Validator passed. Signed-off-by: zhanghaicheng <zhanghch05@inspur.com> Change-Id: I867367ce4a0caf8c4b3f4e07e06c11feed0782e8
2021-03-30Add POST and DELETE in MetricReportDefinitionsWludzik, Jozef1-0/+2
Added POST action in MetricReportDefinitions node to allow user to add new MetricReportDefinition. Using minimal set of MetricReportDefinition parameters from user bmcweb converts it to DBus call "AddReport" to Telemetry that serves as a backend for Redfish TelemetryService. Added DELETE request in MetricReportDefinitions node to allow user to remove report from Telemetry. Added conversion from string that represents duration format into its numeric equivalent. Added unit tests for conversion from and to Duration format. Tested: - Tested using witherspoon image on QEMU - Verified POST action in different cases: - all parameters are provided, new report is added to collection - some parameters are missing or invalid, user gets response with description of the issue - Verified that reports are removed on DELETE request - Verified that on invalid DELETE request user receives response with error - Verified time_utils::fromDurationString() - Succesfully passed RedfishServiceValidator.py Signed-off-by: Wludzik, Jozef <jozef.wludzik@intel.com> Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com> Change-Id: I2fed96848594451e22fde686f8c066d7770cc65a
2021-02-09Redfish TelemetryService schema implementationWludzik, Jozef1-0/+71
Now user is able to communicate with Telemetry service using Redfish. Added TelemetryService, MetricReports, MetricReportCollection, MetricReportDefinition and MetricReportDefinitionCollection nodes with GET method support. Added TelemetryService URI to root service. Implemented communication with backend - Telemetry: https://github.com/openbmc/telemetry Added schemes attributes that are supported by Telemetry service design, ref.: https://github.com/openbmc/docs/blob/master/designs/telemetry.md Change introduces function that converts decimal value into duration format that is described by ISO 8601 and Redfish specification. Tested: - Tested using romulus and s2600wf images on QEMU - Verified DBus method calls to Telemetry service from bmcweb - Verified bmcweb responses from new nodes in different cases: - Report collection is empty - Report collection is filled with artificial data - Telemetry service is disabled - Verified time_utils::toDurationString() output - Passed RedfishServiceValidator.py Signed-off-by: Wludzik, Jozef <jozef.wludzik@intel.com> Signed-off-by: Adrian Ambrożewicz <adrian.ambrozewicz@linux.intel.com> Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com> Change-Id: Ie6b0b49f4ef5eeaef07d1209b6c349270c04d570