Checked that all metric values of the application's execution context was received before accepting an SLO Violation Message
Change-Id: I74b1f8217259212c08318cef5f13da50b04a24cc
This commit is contained in:
parent
3105b79e14
commit
c83d0dedd5
@ -15,6 +15,8 @@ License: MPL2.0 (https://www.mozilla.org/en-US/MPL/2.0/)
|
|||||||
#include <sstream> // To format error messages
|
#include <sstream> // To format error messages
|
||||||
#include <stdexcept> // standard exceptions
|
#include <stdexcept> // standard exceptions
|
||||||
#include <iterator> // Iterator support
|
#include <iterator> // Iterator support
|
||||||
|
#include <ranges> // Container ranges
|
||||||
|
#include <algorithm> // Algorithms
|
||||||
|
|
||||||
#include "Communication/AMQ/AMQEndpoint.hpp" // For Topic subscriptions
|
#include "Communication/AMQ/AMQEndpoint.hpp" // For Topic subscriptions
|
||||||
|
|
||||||
@ -114,38 +116,32 @@ void MetricUpdater::UpdateMetricValue(
|
|||||||
// based on the time point of the severity message. The Optimiser controller
|
// based on the time point of the severity message. The Optimiser controller
|
||||||
// must look for this identifier type on the solutions in order to decide
|
// must look for this identifier type on the solutions in order to decide
|
||||||
// which solutions to deploy.
|
// which solutions to deploy.
|
||||||
|
//
|
||||||
|
// The message will be ignored if not all metric values have been received,
|
||||||
|
// and no error message indication will be given.
|
||||||
|
|
||||||
void MetricUpdater::SLOViolationHandler(
|
void MetricUpdater::SLOViolationHandler(
|
||||||
const SLOViolation & SeverityMessage, const Address TheSLOTopic )
|
const SLOViolation & SeverityMessage, const Address TheSLOTopic )
|
||||||
{
|
{
|
||||||
// The application execution context is constructed first
|
// The application execution context is constructed first
|
||||||
// as it represents the name and the current values of the recorded
|
// as it represents the name and the current values of the recorded
|
||||||
// metrics. Note the construction has to be done conditionally based
|
// metrics.
|
||||||
// on whether the standard library containers supports the range based
|
|
||||||
// constructors defined for C++23
|
|
||||||
|
|
||||||
#ifdef __cpp_lib_containers_ranges
|
|
||||||
#pragma message("C++23: Range inserters available! Rewrite MetricUpdater.hpp!")
|
|
||||||
|
|
||||||
Solver::MetricValueType TheApplicationExecutionContext(
|
|
||||||
std::views::transform( MetricValues, [](const auto & MetricRecord){
|
|
||||||
return std::make_pair( MetricRecord.second.OptimisationName,
|
|
||||||
MetricRecord.second.Value );
|
|
||||||
}) );
|
|
||||||
#else
|
|
||||||
|
|
||||||
Solver::MetricValueType TheApplicationExecutionContext;
|
Solver::MetricValueType TheApplicationExecutionContext;
|
||||||
|
|
||||||
for( const auto & [_, MetricRecord ] : MetricValues )
|
for( const auto & [_, MetricRecord ] : MetricValues )
|
||||||
|
if( !MetricRecord.Value.is_null() )
|
||||||
TheApplicationExecutionContext.emplace( MetricRecord.OptimisationName,
|
TheApplicationExecutionContext.emplace( MetricRecord.OptimisationName,
|
||||||
MetricRecord.Value );
|
MetricRecord.Value );
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The application context can then be sent to the solution manager
|
// The application context can then be sent to the solution manager
|
||||||
// using the corresponding message, and the time stamp of the severity
|
// using the corresponding message, and the time stamp of the severity
|
||||||
// message,
|
// message provided that the size of the execution context equals the
|
||||||
|
// number of metric values. It will be different if any of the metric
|
||||||
|
// values has not been updated, and in this case the application execution
|
||||||
|
// context is invalid and cannot be used for optimisation.
|
||||||
|
|
||||||
|
if( TheApplicationExecutionContext.size() == MetricValues.size() )
|
||||||
Send( Solver::ApplicationExecutionContext(
|
Send( Solver::ApplicationExecutionContext(
|
||||||
SeverityMessage[ NebulOuS::SLOIdentifier ],
|
SeverityMessage[ NebulOuS::SLOIdentifier ],
|
||||||
SeverityMessage[ NebulOuS::TimePoint ].get< Solver::TimePointType >(),
|
SeverityMessage[ NebulOuS::TimePoint ].get< Solver::TimePointType >(),
|
||||||
|
Loading…
Reference in New Issue
Block a user