18#include <unordered_map>
22#if KCENON_HAS_COMMON_SYSTEM
23#include <kcenon/common/interfaces/monitoring_interface.h>
24#include <kcenon/common/patterns/result.h>
36#if KCENON_HAS_COMMON_SYSTEM
41inline ::kcenon::common::interfaces::health_status to_common_health_status(
45 return ::kcenon::common::interfaces::health_status::healthy;
47 return ::kcenon::common::interfaces::health_status::degraded;
49 return ::kcenon::common::interfaces::health_status::unhealthy;
52 return ::kcenon::common::interfaces::health_status::unknown;
57 ::kcenon::common::interfaces::health_status status) {
59 case ::kcenon::common::interfaces::health_status::healthy:
61 case ::kcenon::common::interfaces::health_status::degraded:
63 case ::kcenon::common::interfaces::health_status::unhealthy:
65 case ::kcenon::common::interfaces::health_status::unknown:
80 std::shared_ptr<monitor>
mon,
81 std::shared_ptr<metrics_collector> metrics =
nullptr,
82 std::shared_ptr<health_monitor> health =
nullptr)
84 , metrics_collector_(metrics)
85 , health_monitor_(health) {}
87 ~monitor_adapter()
override =
default;
92 ::kcenon::common::VoidResult record_metric(
const std::string& name,
double value)
override {
94 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
98 monitor_->record_metric(name, value);
99 return ::kcenon::common::VoidResult(std::monostate{});
100 }
catch (
const std::exception& e) {
101 return ::kcenon::common::error_info(2, e.what(),
"monitoring_system");
108 ::kcenon::common::VoidResult record_metric(
109 const std::string& name,
111 const std::unordered_map<std::string, std::string>& tags)
override {
113 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
118 monitor_->record_metric_with_tags(name, value, tags);
119 return ::kcenon::common::VoidResult(std::monostate{});
120 }
catch (
const std::exception& e) {
121 return ::kcenon::common::error_info(2, e.what(),
"monitoring_system");
128 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_metrics()
override {
130 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
134 ::kcenon::common::interfaces::metrics_snapshot snapshot;
136 if (metrics_collector_) {
137 auto metrics = metrics_collector_->collect_all();
138 for (
const auto& [name, value] : metrics) {
139 snapshot.add_metric(name, value);
142 auto metrics = monitor_->get_all_metrics();
143 for (
const auto& metric : metrics) {
144 snapshot.add_metric(metric.name, metric.value);
148 snapshot.source_id =
"monitoring_system";
150 }
catch (
const std::exception& e) {
151 return ::kcenon::common::error_info(2, e.what(),
"monitoring_system");
158 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result> check_health()
override {
160 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
164 ::kcenon::common::interfaces::health_check_result result;
166 if (health_monitor_) {
167 auto health = health_monitor_->check_health();
168 result.status = to_common_health_status(health.status);
169 result.message = health.message;
170 result.check_duration = health.duration;
171 result.metadata = health.metadata;
174 result.status = ::kcenon::common::interfaces::health_status::healthy;
175 result.message =
"Monitor is operational";
179 }
catch (
const std::exception& e) {
180 return ::kcenon::common::error_info(2, e.what(),
"monitoring_system");
187 ::kcenon::common::VoidResult reset()
override {
189 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
194 if (metrics_collector_) {
195 metrics_collector_->reset();
197 return ::kcenon::common::VoidResult(std::monostate{});
198 }
catch (
const std::exception& e) {
199 return ::kcenon::common::error_info(2, e.what(),
"monitoring_system");
204 std::shared_ptr<monitor> monitor_;
205 std::shared_ptr<metrics_collector> metrics_collector_;
206 std::shared_ptr<health_monitor> health_monitor_;
212class monitor_from_common_adapter {
217 explicit monitor_from_common_adapter(
218 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor)
219 : common_monitor_(common_monitor) {}
224 void record_metric(
const std::string& name,
double value) {
225 if (!common_monitor_) {
229 auto result = common_monitor_->record_metric(name, value);
236 void record_metric_with_tags(
237 const std::string& name,
239 const std::unordered_map<std::string, std::string>& tags) {
240 if (!common_monitor_) {
244 auto result = common_monitor_->record_metric(name, value, tags);
251 std::vector<metric_data> get_all_metrics() {
252 std::vector<metric_data> metrics;
253 if (!common_monitor_) {
257 auto result = common_monitor_->get_metrics();
258 if (!result.is_err()) {
259 const auto& snapshot = result.value();
260 for (
const auto& metric : snapshot.metrics) {
262 data.name = metric.name;
263 data.value = metric.value;
264 data.timestamp = metric.timestamp;
265 data.tags = metric.tags;
266 metrics.push_back(data);
276 health_check_result check_health() {
277 health_check_result health_result;
278 if (!common_monitor_) {
279 health_result.status = health_status::unknown;
280 health_result.message =
"Monitor not initialized";
281 return health_result;
284 auto result = common_monitor_->check_health();
285 if (!result.is_err()) {
286 const auto& check = result.value();
287 health_result.status = from_common_health_status(check.status);
288 health_result.message = check.message;
289 health_result.duration = check.check_duration;
290 health_result.metadata = check.metadata;
292 health_result.status = health_status::unknown;
293 health_result.message =
"Health check failed";
296 return health_result;
303 if (common_monitor_) {
304 common_monitor_->reset();
309 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor_;
315class monitorable_adapter :
public ::kcenon::common::interfaces::IMonitorable {
320 explicit monitorable_adapter(
321 const std::string& component_name,
322 std::shared_ptr<monitor>
mon,
323 std::shared_ptr<health_monitor> health =
nullptr)
324 : component_name_(component_name)
326 , health_monitor_(health) {}
328 ~monitorable_adapter()
override =
default;
333 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_monitoring_data()
override {
335 return ::kcenon::common::error_info(1,
"Monitor not initialized",
"monitoring_system");
339 ::kcenon::common::interfaces::metrics_snapshot snapshot;
340 snapshot.source_id = component_name_;
342 auto metrics = monitor_->get_all_metrics();
343 for (
const auto& metric : metrics) {
344 snapshot.add_metric(metric.name, metric.value);
348 }
catch (
const std::exception& e) {
349 return ::kcenon::common::error_info(2, e.what(),
"monitoring_system");
356 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result> health_check()
override {
358 ::kcenon::common::interfaces::health_check_result result;
360 if (health_monitor_) {
361 auto health = health_monitor_->check_health();
362 result.status = to_common_health_status(health.status);
363 result.message = health.message;
364 result.check_duration = health.duration;
365 result.metadata = health.metadata;
367 result.status = ::kcenon::common::interfaces::health_status::healthy;
368 result.message = component_name_ +
" is operational";
372 }
catch (
const std::exception& e) {
373 return ::kcenon::common::error_info(2, e.what(),
"monitoring_system");
380 std::string get_component_name()
const override {
381 return component_name_;
385 std::string component_name_;
386 std::shared_ptr<monitor> monitor_;
387 std::shared_ptr<health_monitor> health_monitor_;
393class common_monitor_factory {
398 static std::shared_ptr<::kcenon::common::interfaces::IMonitor> create_from_monitor(
399 std::shared_ptr<monitor>
mon,
400 std::shared_ptr<metrics_collector> metrics =
nullptr,
401 std::shared_ptr<health_monitor> health =
nullptr) {
402 return std::make_shared<monitor_adapter>(
mon, metrics, health);
408 static std::unique_ptr<monitor_from_common_adapter> create_from_common(
409 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor) {
410 return std::make_unique<monitor_from_common_adapter>(common_monitor);
416 static std::shared_ptr<::kcenon::common::interfaces::IMonitorable> create_monitorable(
417 const std::string& name,
418 std::shared_ptr<monitor>
mon,
419 std::shared_ptr<health_monitor> health =
nullptr) {
420 return std::make_shared<monitorable_adapter>(name,
mon, health);
Unified feature flags header for monitoring_system.
Health monitoring with dependency graphs, auto-recovery, and statistics.
Core monitoring system interface definitions.
performance_monitor_adapter monitor_adapter
health_status
System health status levels.