20#if KCENON_HAS_COMMON_SYSTEM
22#include <kcenon/common/di/service_container.h>
23#include <kcenon/common/interfaces/monitoring_interface.h>
28namespace kcenon::monitoring::di {
33struct monitor_registration_config {
35 std::string monitor_name =
"default_performance_monitor";
38 double cpu_threshold = 80.0;
41 double memory_threshold = 90.0;
44 std::chrono::milliseconds latency_threshold{1000};
47 bool enable_system_monitoring =
true;
50 bool enable_lock_free =
false;
53 common::di::service_lifetime lifetime = common::di::service_lifetime::singleton;
85inline common::VoidResult register_monitor_services(
86 common::di::IServiceContainer& container,
87 const monitor_registration_config& config = {}) {
90 if (
container.is_registered<common::interfaces::IMonitor>()) {
91 return common::make_error<std::monostate>(
92 common::di::di_error_codes::already_registered,
93 "IMonitor is already registered",
94 "monitoring_system::di"
99 return container.register_factory<common::interfaces::IMonitor>(
100 [config](common::di::IServiceContainer&) -> std::shared_ptr<common::interfaces::IMonitor> {
102 auto monitor = std::make_shared<performance_monitor>(config.monitor_name);
105 monitor->set_cpu_threshold(config.cpu_threshold);
106 monitor->set_memory_threshold(config.memory_threshold);
107 monitor->set_latency_threshold(config.latency_threshold);
110 monitor->get_profiler().set_lock_free_mode(config.enable_lock_free);
113 if (config.enable_system_monitoring) {
114 auto init_result = monitor->initialize();
115 if (init_result.is_err()) {
122 return std::make_shared<performance_monitor_adapter>(std::move(monitor));
148inline common::VoidResult register_monitor_instance(
149 common::di::IServiceContainer& container,
150 std::shared_ptr<performance_monitor> monitor) {
153 return common::make_error<std::monostate>(
154 common::error_codes::INVALID_ARGUMENT,
155 "Cannot register null monitor instance",
156 "monitoring_system::di"
160 auto adapter = std::make_shared<performance_monitor_adapter>(std::move(monitor));
162 return container.register_instance<common::interfaces::IMonitor>(adapter);
171inline common::VoidResult unregister_monitor_services(
172 common::di::IServiceContainer& container) {
174 return container.unregister<common::interfaces::IMonitor>();
195inline std::shared_ptr<performance_monitor> get_underlying_performance_monitor(
196 const std::shared_ptr<common::interfaces::IMonitor>& monitor) {
198 auto adapter = std::dynamic_pointer_cast<performance_monitor_adapter>(monitor);
200 return adapter->get_wrapped_monitor();
Unified feature flags header for monitoring_system.