Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
service_registration.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
15#pragma once
16
17#include <memory>
19
20#if KCENON_HAS_COMMON_SYSTEM
21
22#include <kcenon/common/di/service_container.h>
23#include <kcenon/common/interfaces/monitoring_interface.h>
24
27
28namespace kcenon::monitoring::di {
29
33struct monitor_registration_config {
35 std::string monitor_name = "default_performance_monitor";
36
38 double cpu_threshold = 80.0;
39
41 double memory_threshold = 90.0;
42
44 std::chrono::milliseconds latency_threshold{1000};
45
47 bool enable_system_monitoring = true;
48
50 bool enable_lock_free = false;
51
53 common::di::service_lifetime lifetime = common::di::service_lifetime::singleton;
54};
55
85inline common::VoidResult register_monitor_services(
86 common::di::IServiceContainer& container,
87 const monitor_registration_config& config = {}) {
88
89 // Check if already registered
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"
95 );
96 }
97
98 // Register monitor factory
99 return container.register_factory<common::interfaces::IMonitor>(
100 [config](common::di::IServiceContainer&) -> std::shared_ptr<common::interfaces::IMonitor> {
101 // Create performance_monitor with configuration
102 auto monitor = std::make_shared<performance_monitor>(config.monitor_name);
103
104 // Apply thresholds
105 monitor->set_cpu_threshold(config.cpu_threshold);
106 monitor->set_memory_threshold(config.memory_threshold);
107 monitor->set_latency_threshold(config.latency_threshold);
108
109 // Configure lock-free mode if requested
110 monitor->get_profiler().set_lock_free_mode(config.enable_lock_free);
111
112 // Initialize system monitoring if enabled
113 if (config.enable_system_monitoring) {
114 auto init_result = monitor->initialize();
115 if (init_result.is_err()) {
116 // Log warning but continue - system monitoring is optional
117 // In production, consider using a logger here
118 }
119 }
120
121 // Create adapter that implements IMonitor
122 return std::make_shared<performance_monitor_adapter>(std::move(monitor));
123 },
124 config.lifetime
125 );
126}
127
148inline common::VoidResult register_monitor_instance(
149 common::di::IServiceContainer& container,
150 std::shared_ptr<performance_monitor> monitor) {
151
152 if (!monitor) {
153 return common::make_error<std::monostate>(
154 common::error_codes::INVALID_ARGUMENT,
155 "Cannot register null monitor instance",
156 "monitoring_system::di"
157 );
158 }
159
160 auto adapter = std::make_shared<performance_monitor_adapter>(std::move(monitor));
161
162 return container.register_instance<common::interfaces::IMonitor>(adapter);
163}
164
171inline common::VoidResult unregister_monitor_services(
172 common::di::IServiceContainer& container) {
173
174 return container.unregister<common::interfaces::IMonitor>();
175}
176
195inline std::shared_ptr<performance_monitor> get_underlying_performance_monitor(
196 const std::shared_ptr<common::interfaces::IMonitor>& monitor) {
197
198 auto adapter = std::dynamic_pointer_cast<performance_monitor_adapter>(monitor);
199 if (adapter) {
200 return adapter->get_wrapped_monitor();
201 }
202 return nullptr;
203}
204
205} // namespace kcenon::monitoring::di
206
207#endif // KCENON_HAS_COMMON_SYSTEM
Unified feature flags header for monitoring_system.
Performance monitoring and profiling implementation.
Adapter to bridge performance_monitor to common::interfaces::IMonitor.