33#if KCENON_HAS_COMMON_SYSTEM
41class common_system_monitor_adapter :
public ::kcenon::common::interfaces::IMonitor {
47 explicit common_system_monitor_adapter(
48 std::shared_ptr<monitoring_interface> monitor)
49 : monitor_(monitor) {}
51 ~common_system_monitor_adapter()
override =
default;
56 ::kcenon::common::VoidResult record_metric(
57 const std::string& name,
58 double value)
override {
60 return ::kcenon::common::VoidResult(
61 ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system"));
69 pending_metrics_.push_back(
metric);
71 return ::kcenon::common::VoidResult(std::monostate{});
77 ::kcenon::common::VoidResult record_metric(
78 const std::string& name,
80 const std::unordered_map<std::string, std::string>& tags)
override {
82 return ::kcenon::common::VoidResult(
83 ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system"));
88 pending_metrics_.push_back(
metric);
90 return ::kcenon::common::VoidResult(std::monostate{});
96 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_metrics()
override {
98 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
101 auto result = monitor_->collect_now();
102 if (result.is_err()) {
103 return ::kcenon::common::error_info(2,
"Failed to collect metrics",
"monitoring_system");
107 ::kcenon::common::interfaces::metrics_snapshot snapshot;
108 snapshot.capture_time = result.value().capture_time;
109 snapshot.source_id = result.value().source_id;
112 for (
const auto& m : result.value().metrics) {
113 snapshot.metrics.emplace_back(m.name, m.value);
117 for (
const auto& m : pending_metrics_) {
118 snapshot.metrics.push_back(m);
120 pending_metrics_.clear();
128 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result> check_health()
override {
130 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
133 auto result = monitor_->check_health();
134 if (result.is_err()) {
135 return ::kcenon::common::error_info(2,
"Health check failed",
"monitoring_system");
139 ::kcenon::common::interfaces::health_check_result health;
141 switch(result.value().status) {
142 case health_status::healthy:
143 health.status = ::kcenon::common::interfaces::health_status::healthy;
145 case health_status::degraded:
146 health.status = ::kcenon::common::interfaces::health_status::degraded;
148 case health_status::unhealthy:
149 health.status = ::kcenon::common::interfaces::health_status::unhealthy;
152 health.status = ::kcenon::common::interfaces::health_status::unknown;
155 health.message = result.value().message;
156 health.timestamp = result.value().timestamp;
157 health.check_duration = result.value().check_duration;
158 health.metadata = result.value().metadata;
166 ::kcenon::common::VoidResult reset()
override {
167 pending_metrics_.clear();
169 return ::kcenon::common::VoidResult(std::monostate{});
173 std::shared_ptr<monitoring_interface> monitor_;
174 std::vector<metric_value> pending_metrics_;
190 explicit monitor_from_common_adapter(
191 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor,
192 const std::string& name =
"common_adapter")
193 : common_monitor_(common_monitor),
name_(name) {}
195 ~monitor_from_common_adapter()
override =
default;
200 common::Result<metrics_snapshot> collect()
override {
201 if (!common_monitor_) {
202 return common::Result<metrics_snapshot>(
203 monitoring_error_code::collection_failed,
204 "Common monitor not initialized");
207 auto common_result = common_monitor_->get_metrics();
208 if (common_result.is_err()) {
209 return common::Result<metrics_snapshot>(
210 monitoring_error_code::collection_failed,
211 common_result.error().message);
214 const auto& common_snapshot = common_result.value();
219 snapshot.
source_id = common_snapshot.source_id;
221 for (
const auto& m : common_snapshot.metrics) {
225 return common::Result<metrics_snapshot>(snapshot);
231 std::string get_name()
const override {
238 bool is_enabled()
const override {
245 common::VoidResult set_enabled(
bool enable)
override {
253 common::VoidResult initialize()
override {
260 common::VoidResult cleanup()
override {
261 if (common_monitor_) {
262 common_monitor_->reset();
268 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor_;
270 bool enabled_ =
true;
276class common_system_monitorable_adapter :
public ::kcenon::common::interfaces::IMonitorable {
283 explicit common_system_monitorable_adapter(
284 std::shared_ptr<monitorable_interface> monitorable,
285 const std::string& name =
"monitoring_component")
286 : monitorable_(monitorable), component_name_(name) {}
288 ~common_system_monitorable_adapter()
override =
default;
293 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_monitoring_data()
override {
296 ::kcenon::common::interfaces::metrics_snapshot snapshot;
297 snapshot.source_id = component_name_;
304 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result>
health_check()
override {
307 ::kcenon::common::interfaces::health_check_result result;
308 result.status = ::kcenon::common::interfaces::health_status::healthy;
309 result.message =
"Component operational";
316 std::string get_component_name()
const override {
317 return component_name_;
321 std::shared_ptr<monitorable_interface> monitorable_;
322 std::string component_name_;
328class common_monitor_factory {
333 static std::shared_ptr<::kcenon::common::interfaces::IMonitor> create_common_monitor(
334 std::shared_ptr<monitoring_interface> monitor) {
335 return std::make_shared<common_system_monitor_adapter>(monitor);
341 static std::shared_ptr<metrics_collector> create_from_common(
342 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor,
343 const std::string& name =
"common_adapter") {
344 return std::make_shared<monitor_from_common_adapter>(common_monitor, name);
350 static std::shared_ptr<::kcenon::common::interfaces::IMonitorable> create_common_monitorable(
351 std::shared_ptr<monitorable_interface> monitorable,
352 const std::string& name =
"monitoring_component") {
353 return std::make_shared<common_system_monitorable_adapter>(monitorable, name);