Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
kcenon::monitoring::graceful_degradation_manager Class Reference

Graceful degradation manager. More...

#include <graceful_degradation.h>

Collaboration diagram for kcenon::monitoring::graceful_degradation_manager:
Collaboration graph

Public Member Functions

 graceful_degradation_manager ()
 
 graceful_degradation_manager (const std::string &name)
 
common::VoidResult register_service (const service_config &config)
 Register a service for management.
 
common::VoidResult unregister_service (const std::string &name)
 Unregister a service.
 
common::VoidResult degrade_service (const std::string &name, degradation_level level, const std::string &reason)
 Degrade a specific service.
 
common::VoidResult recover_service (const std::string &name)
 Recover a specific service to normal operation.
 
common::VoidResult recover_all_services ()
 Recover all services to normal operation.
 
degradation_level get_service_level (const std::string &name) const
 Get current degradation level for a service.
 
common::VoidResult add_degradation_plan (const degradation_plan &plan)
 Add a degradation plan.
 
common::VoidResult execute_plan (const std::string &plan_name, const std::string &reason)
 Execute a degradation plan.
 
common::Result< bool > is_healthy () const
 Check if the manager is healthy (more than 50% services at normal level)
 
graceful_degradation_metrics get_metrics () const
 Get metrics.
 
const std::string & get_name () const
 Get manager name.
 
std::vector< std::string > get_service_names () const
 Get all registered service names.
 

Private Attributes

std::string name_
 
std::mutex mutex_
 
std::unordered_map< std::string, service_stateservices_
 
std::unordered_map< std::string, degradation_planplans_
 
graceful_degradation_metrics metrics_
 

Detailed Description

Graceful degradation manager.

Manages service degradation and recovery in a coordinated manner.

Definition at line 118 of file graceful_degradation.h.

Constructor & Destructor Documentation

◆ graceful_degradation_manager() [1/2]

kcenon::monitoring::graceful_degradation_manager::graceful_degradation_manager ( )
inline

Definition at line 120 of file graceful_degradation.h.

◆ graceful_degradation_manager() [2/2]

kcenon::monitoring::graceful_degradation_manager::graceful_degradation_manager ( const std::string & name)
inlineexplicit

Definition at line 122 of file graceful_degradation.h.

122: name_(name) {}

Member Function Documentation

◆ add_degradation_plan()

common::VoidResult kcenon::monitoring::graceful_degradation_manager::add_degradation_plan ( const degradation_plan & plan)
inline

Add a degradation plan.

Definition at line 233 of file graceful_degradation.h.

233 {
234 if (!plan.validate()) {
235 return common::VoidResult::err(error_info(monitoring_error_code::invalid_configuration, "Invalid degradation plan").to_common_error());
236 }
237
238 std::lock_guard<std::mutex> lock(mutex_);
239 plans_[plan.name] = plan;
240 return common::ok();
241 }
std::unordered_map< std::string, degradation_plan > plans_

References kcenon::monitoring::invalid_configuration, mutex_, kcenon::monitoring::degradation_plan::name, plans_, and kcenon::monitoring::degradation_plan::validate().

Here is the call graph for this function:

◆ degrade_service()

common::VoidResult kcenon::monitoring::graceful_degradation_manager::degrade_service ( const std::string & name,
degradation_level level,
const std::string & reason )
inline

Degrade a specific service.

Definition at line 164 of file graceful_degradation.h.

165 {
166 std::lock_guard<std::mutex> lock(mutex_);
167 auto it = services_.find(name);
168 if (it == services_.end()) {
170 return common::VoidResult::err(static_cast<int>(monitoring_error_code::not_found),
171 "Service not found: " + name);
172 }
173
175 it->second.current_level = level;
176 it->second.last_degradation_reason = reason;
177 it->second.last_state_change = std::chrono::steady_clock::now();
179
180 return common::ok();
181 }
std::unordered_map< std::string, service_state > services_

References kcenon::monitoring::graceful_degradation_metrics::failed_degradations, metrics_, mutex_, kcenon::monitoring::not_found, services_, kcenon::monitoring::graceful_degradation_metrics::successful_degradations, and kcenon::monitoring::graceful_degradation_metrics::total_degradations.

◆ execute_plan()

common::VoidResult kcenon::monitoring::graceful_degradation_manager::execute_plan ( const std::string & plan_name,
const std::string & reason )
inline

Execute a degradation plan.

Definition at line 246 of file graceful_degradation.h.

246 {
247 std::lock_guard<std::mutex> lock(mutex_);
248 auto it = plans_.find(plan_name);
249 if (it == plans_.end()) {
250 return common::VoidResult::err(static_cast<int>(monitoring_error_code::not_found),
251 "Plan not found: " + plan_name);
252 }
253
254 const auto& plan = it->second;
255
256 // Degrade services to maintain to target level
257 for (const auto& service_name : plan.services_to_maintain) {
258 auto service_it = services_.find(service_name);
259 if (service_it != services_.end()) {
261 service_it->second.current_level = plan.target_level;
262 service_it->second.last_degradation_reason = reason;
263 service_it->second.last_state_change = std::chrono::steady_clock::now();
265 }
266 }
267
268 // Disable (set to emergency) services to disable
269 for (const auto& service_name : plan.services_to_disable) {
270 auto service_it = services_.find(service_name);
271 if (service_it != services_.end()) {
273 service_it->second.current_level = degradation_level::emergency;
274 service_it->second.last_degradation_reason = reason;
275 service_it->second.last_state_change = std::chrono::steady_clock::now();
277 }
278 }
279
280 return common::ok();
281 }

References kcenon::monitoring::emergency, metrics_, mutex_, kcenon::monitoring::not_found, plans_, services_, kcenon::monitoring::graceful_degradation_metrics::successful_degradations, and kcenon::monitoring::graceful_degradation_metrics::total_degradations.

◆ get_metrics()

graceful_degradation_metrics kcenon::monitoring::graceful_degradation_manager::get_metrics ( ) const
inline

Get metrics.

Definition at line 306 of file graceful_degradation.h.

306 {
307 return metrics_;
308 }

References metrics_.

◆ get_name()

const std::string & kcenon::monitoring::graceful_degradation_manager::get_name ( ) const
inline

Get manager name.

Definition at line 313 of file graceful_degradation.h.

313 {
314 return name_;
315 }

References name_.

Referenced by TEST_F().

Here is the caller graph for this function:

◆ get_service_level()

degradation_level kcenon::monitoring::graceful_degradation_manager::get_service_level ( const std::string & name) const
inline

Get current degradation level for a service.

Definition at line 221 of file graceful_degradation.h.

221 {
222 std::lock_guard<std::mutex> lock(mutex_);
223 auto it = services_.find(name);
224 if (it == services_.end()) {
226 }
227 return it->second.current_level;
228 }

References mutex_, kcenon::monitoring::normal, and services_.

◆ get_service_names()

std::vector< std::string > kcenon::monitoring::graceful_degradation_manager::get_service_names ( ) const
inline

Get all registered service names.

Definition at line 320 of file graceful_degradation.h.

320 {
321 std::lock_guard<std::mutex> lock(mutex_);
322 std::vector<std::string> names;
323 names.reserve(services_.size());
324 for (const auto& [name, state] : services_) {
325 names.push_back(name);
326 }
327 return names;
328 }

References mutex_, and services_.

◆ is_healthy()

common::Result< bool > kcenon::monitoring::graceful_degradation_manager::is_healthy ( ) const
inline

Check if the manager is healthy (more than 50% services at normal level)

Definition at line 286 of file graceful_degradation.h.

286 {
287 std::lock_guard<std::mutex> lock(mutex_);
288 if (services_.empty()) {
289 return common::ok(true);
290 }
291
292 size_t normal_count = 0;
293 for (const auto& [name, state] : services_) {
294 if (state.current_level == degradation_level::normal) {
295 normal_count++;
296 }
297 }
298
299 double healthy_ratio = static_cast<double>(normal_count) / static_cast<double>(services_.size());
300 return common::ok(healthy_ratio > 0.5);
301 }

References mutex_, kcenon::monitoring::normal, and services_.

◆ recover_all_services()

common::VoidResult kcenon::monitoring::graceful_degradation_manager::recover_all_services ( )
inline

Recover all services to normal operation.

Definition at line 206 of file graceful_degradation.h.

206 {
207 std::lock_guard<std::mutex> lock(mutex_);
208 for (auto& [name, state] : services_) {
210 state.current_level = degradation_level::normal;
211 state.last_degradation_reason.clear();
212 state.last_state_change = std::chrono::steady_clock::now();
214 }
215 return common::ok();
216 }

References metrics_, mutex_, kcenon::monitoring::normal, kcenon::monitoring::graceful_degradation_metrics::recovery_attempts, services_, and kcenon::monitoring::graceful_degradation_metrics::successful_recoveries.

◆ recover_service()

common::VoidResult kcenon::monitoring::graceful_degradation_manager::recover_service ( const std::string & name)
inline

Recover a specific service to normal operation.

Definition at line 186 of file graceful_degradation.h.

186 {
187 std::lock_guard<std::mutex> lock(mutex_);
188 auto it = services_.find(name);
189 if (it == services_.end()) {
190 return common::VoidResult::err(static_cast<int>(monitoring_error_code::not_found),
191 "Service not found: " + name);
192 }
193
195 it->second.current_level = degradation_level::normal;
196 it->second.last_degradation_reason.clear();
197 it->second.last_state_change = std::chrono::steady_clock::now();
199
200 return common::ok();
201 }

References metrics_, mutex_, kcenon::monitoring::normal, kcenon::monitoring::not_found, kcenon::monitoring::graceful_degradation_metrics::recovery_attempts, services_, and kcenon::monitoring::graceful_degradation_metrics::successful_recoveries.

◆ register_service()

common::VoidResult kcenon::monitoring::graceful_degradation_manager::register_service ( const service_config & config)
inline

Register a service for management.

Definition at line 127 of file graceful_degradation.h.

127 {
128 if (!config.validate()) {
129 return common::VoidResult::err(error_info(monitoring_error_code::invalid_configuration, "Invalid service configuration").to_common_error());
130 }
131
132 std::lock_guard<std::mutex> lock(mutex_);
133 if (services_.find(config.name) != services_.end()) {
134 return common::VoidResult::err(static_cast<int>(monitoring_error_code::already_exists),
135 "Service already registered: " + config.name);
136 }
137
138 service_state state;
139 state.config = config;
140 state.current_level = degradation_level::normal;
141 state.last_state_change = std::chrono::steady_clock::now();
142 services_[config.name] = state;
143
144 return common::ok();
145 }

References kcenon::monitoring::already_exists, kcenon::monitoring::service_state::config, kcenon::monitoring::service_state::current_level, kcenon::monitoring::invalid_configuration, kcenon::monitoring::service_state::last_state_change, mutex_, kcenon::monitoring::service_config::name, kcenon::monitoring::normal, services_, and kcenon::monitoring::service_config::validate().

Here is the call graph for this function:

◆ unregister_service()

common::VoidResult kcenon::monitoring::graceful_degradation_manager::unregister_service ( const std::string & name)
inline

Unregister a service.

Definition at line 150 of file graceful_degradation.h.

150 {
151 std::lock_guard<std::mutex> lock(mutex_);
152 auto it = services_.find(name);
153 if (it == services_.end()) {
154 return common::VoidResult::err(static_cast<int>(monitoring_error_code::not_found),
155 "Service not found: " + name);
156 }
157 services_.erase(it);
158 return common::ok();
159 }

References mutex_, kcenon::monitoring::not_found, and services_.

Member Data Documentation

◆ metrics_

graceful_degradation_metrics kcenon::monitoring::graceful_degradation_manager::metrics_
mutableprivate

◆ mutex_

std::mutex kcenon::monitoring::graceful_degradation_manager::mutex_
mutableprivate

◆ name_

std::string kcenon::monitoring::graceful_degradation_manager::name_
private

Definition at line 331 of file graceful_degradation.h.

Referenced by get_name().

◆ plans_

std::unordered_map<std::string, degradation_plan> kcenon::monitoring::graceful_degradation_manager::plans_
private

Definition at line 334 of file graceful_degradation.h.

Referenced by add_degradation_plan(), and execute_plan().

◆ services_

std::unordered_map<std::string, service_state> kcenon::monitoring::graceful_degradation_manager::services_
private

The documentation for this class was generated from the following file: