Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
monitoring_to_common_adapter.h
Go to the documentation of this file.
1
8#pragma once
9
10// BSD 3-Clause License
11// Copyright (c) 2025, 🍀☀🌕🌥 🌊
12// See the LICENSE file in the project root for full license information.
13
14
15#include <memory>
16#include <string>
17#include <chrono>
18#include <unordered_map>
19#include <vector>
21
22#if KCENON_HAS_COMMON_SYSTEM
23#include <kcenon/common/interfaces/monitoring_interface.h>
24#include <kcenon/common/patterns/result.h>
25#endif
26
27// Include actual monitoring_system headers
31
32namespace kcenon {
33namespace monitoring {
34namespace adapters {
35
36#if KCENON_HAS_COMMON_SYSTEM
37
41inline ::kcenon::common::interfaces::health_status to_common_health_status(
42 health_status status) {
43 switch (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;
51 default:
52 return ::kcenon::common::interfaces::health_status::unknown;
53 }
54}
55
56inline health_status from_common_health_status(
57 ::kcenon::common::interfaces::health_status status) {
58 switch (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:
66 default:
68 }
69}
70
74class monitor_adapter : public ::kcenon::common::interfaces::IMonitor {
75public:
79 explicit monitor_adapter(
80 std::shared_ptr<monitor> mon,
81 std::shared_ptr<metrics_collector> metrics = nullptr,
82 std::shared_ptr<health_monitor> health = nullptr)
83 : monitor_(mon)
84 , metrics_collector_(metrics)
85 , health_monitor_(health) {}
86
87 ~monitor_adapter() override = default;
88
92 ::kcenon::common::VoidResult record_metric(const std::string& name, double value) override {
93 if (!monitor_) {
94 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
95 }
96
97 try {
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");
102 }
103 }
104
108 ::kcenon::common::VoidResult record_metric(
109 const std::string& name,
110 double value,
111 const std::unordered_map<std::string, std::string>& tags) override {
112 if (!monitor_) {
113 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
114 }
115
116 try {
117 // Convert tags to monitoring_system format
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");
122 }
123 }
124
128 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_metrics() override {
129 if (!monitor_) {
130 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
131 }
132
133 try {
134 ::kcenon::common::interfaces::metrics_snapshot snapshot;
135
136 if (metrics_collector_) {
137 auto metrics = metrics_collector_->collect_all();
138 for (const auto& [name, value] : metrics) {
139 snapshot.add_metric(name, value);
140 }
141 } else {
142 auto metrics = monitor_->get_all_metrics();
143 for (const auto& metric : metrics) {
144 snapshot.add_metric(metric.name, metric.value);
145 }
146 }
147
148 snapshot.source_id = "monitoring_system";
149 return snapshot;
150 } catch (const std::exception& e) {
151 return ::kcenon::common::error_info(2, e.what(), "monitoring_system");
152 }
153 }
154
158 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result> check_health() override {
159 if (!monitor_) {
160 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
161 }
162
163 try {
164 ::kcenon::common::interfaces::health_check_result result;
165
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;
172 } else {
173 // Simple health check based on monitor state
174 result.status = ::kcenon::common::interfaces::health_status::healthy;
175 result.message = "Monitor is operational";
176 }
177
178 return result;
179 } catch (const std::exception& e) {
180 return ::kcenon::common::error_info(2, e.what(), "monitoring_system");
181 }
182 }
183
187 ::kcenon::common::VoidResult reset() override {
188 if (!monitor_) {
189 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
190 }
191
192 try {
193 monitor_->reset();
194 if (metrics_collector_) {
195 metrics_collector_->reset();
196 }
197 return ::kcenon::common::VoidResult(std::monostate{});
198 } catch (const std::exception& e) {
199 return ::kcenon::common::error_info(2, e.what(), "monitoring_system");
200 }
201 }
202
203private:
204 std::shared_ptr<monitor> monitor_;
205 std::shared_ptr<metrics_collector> metrics_collector_;
206 std::shared_ptr<health_monitor> health_monitor_;
207};
208
212class monitor_from_common_adapter {
213public:
217 explicit monitor_from_common_adapter(
218 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor)
219 : common_monitor_(common_monitor) {}
220
224 void record_metric(const std::string& name, double value) {
225 if (!common_monitor_) {
226 return;
227 }
228
229 auto result = common_monitor_->record_metric(name, value);
230 // Silently ignore errors for now
231 }
232
236 void record_metric_with_tags(
237 const std::string& name,
238 double value,
239 const std::unordered_map<std::string, std::string>& tags) {
240 if (!common_monitor_) {
241 return;
242 }
243
244 auto result = common_monitor_->record_metric(name, value, tags);
245 // Silently ignore errors for now
246 }
247
251 std::vector<metric_data> get_all_metrics() {
252 std::vector<metric_data> metrics;
253 if (!common_monitor_) {
254 return metrics;
255 }
256
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) {
261 metric_data data;
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);
267 }
268 }
269
270 return metrics;
271 }
272
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;
282 }
283
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;
291 } else {
292 health_result.status = health_status::unknown;
293 health_result.message = "Health check failed";
294 }
295
296 return health_result;
297 }
298
302 void reset() {
303 if (common_monitor_) {
304 common_monitor_->reset();
305 }
306 }
307
308private:
309 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor_;
310};
311
315class monitorable_adapter : public ::kcenon::common::interfaces::IMonitorable {
316public:
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)
325 , monitor_(mon)
326 , health_monitor_(health) {}
327
328 ~monitorable_adapter() override = default;
329
333 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_monitoring_data() override {
334 if (!monitor_) {
335 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
336 }
337
338 try {
339 ::kcenon::common::interfaces::metrics_snapshot snapshot;
340 snapshot.source_id = component_name_;
341
342 auto metrics = monitor_->get_all_metrics();
343 for (const auto& metric : metrics) {
344 snapshot.add_metric(metric.name, metric.value);
345 }
346
347 return snapshot;
348 } catch (const std::exception& e) {
349 return ::kcenon::common::error_info(2, e.what(), "monitoring_system");
350 }
351 }
352
356 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result> health_check() override {
357 try {
358 ::kcenon::common::interfaces::health_check_result result;
359
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;
366 } else {
367 result.status = ::kcenon::common::interfaces::health_status::healthy;
368 result.message = component_name_ + " is operational";
369 }
370
371 return result;
372 } catch (const std::exception& e) {
373 return ::kcenon::common::error_info(2, e.what(), "monitoring_system");
374 }
375 }
376
380 std::string get_component_name() const override {
381 return component_name_;
382 }
383
384private:
385 std::string component_name_;
386 std::shared_ptr<monitor> monitor_;
387 std::shared_ptr<health_monitor> health_monitor_;
388};
389
393class common_monitor_factory {
394public:
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);
403 }
404
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);
411 }
412
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);
421 }
422};
423
424#endif // KCENON_HAS_COMMON_SYSTEM
425
426} // namespace adapters
427} // namespace monitoring
428} // namespace kcenon
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.
Performance monitoring and profiling implementation.