Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
common_to_monitoring_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 <vector>
18#include <chrono>
20
21#if KCENON_HAS_COMMON_SYSTEM
22#include <kcenon/common/interfaces/monitoring_interface.h>
23#include <kcenon/common/patterns/result.h>
24#endif
25
29
30namespace kcenon { namespace monitoring {
31namespace adapters {
32
33#if KCENON_HAS_COMMON_SYSTEM
34
41class common_system_monitor_adapter : public ::kcenon::common::interfaces::IMonitor {
42public:
47 explicit common_system_monitor_adapter(
48 std::shared_ptr<monitoring_interface> monitor)
49 : monitor_(monitor) {}
50
51 ~common_system_monitor_adapter() override = default;
52
56 ::kcenon::common::VoidResult record_metric(
57 const std::string& name,
58 double value) override {
59 if (!monitor_) {
60 return ::kcenon::common::VoidResult(
61 ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system"));
62 }
63
64 // Create metric value and add to current collection
65 metric_value metric(name, value);
66
67 // monitoring_system doesn't have direct record_metric,
68 // store locally and include in next collect
69 pending_metrics_.push_back(metric);
70
71 return ::kcenon::common::VoidResult(std::monostate{});
72 }
73
77 ::kcenon::common::VoidResult record_metric(
78 const std::string& name,
79 double value,
80 const std::unordered_map<std::string, std::string>& tags) override {
81 if (!monitor_) {
82 return ::kcenon::common::VoidResult(
83 ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system"));
84 }
85
86 metric_value metric(name, value);
87 metric.tags = tags;
88 pending_metrics_.push_back(metric);
89
90 return ::kcenon::common::VoidResult(std::monostate{});
91 }
92
96 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_metrics() override {
97 if (!monitor_) {
98 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
99 }
100
101 auto result = monitor_->collect_now();
102 if (result.is_err()) {
103 return ::kcenon::common::error_info(2, "Failed to collect metrics", "monitoring_system");
104 }
105
106 // Convert monitoring_system snapshot to common snapshot
107 ::kcenon::common::interfaces::metrics_snapshot snapshot;
108 snapshot.capture_time = result.value().capture_time;
109 snapshot.source_id = result.value().source_id;
110
111 // Add collected metrics
112 for (const auto& m : result.value().metrics) {
113 snapshot.metrics.emplace_back(m.name, m.value);
114 }
115
116 // Add pending metrics
117 for (const auto& m : pending_metrics_) {
118 snapshot.metrics.push_back(m);
119 }
120 pending_metrics_.clear();
121
122 return snapshot;
123 }
124
128 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result> check_health() override {
129 if (!monitor_) {
130 return ::kcenon::common::error_info(1, "Monitor not initialized", "monitoring_system");
131 }
132
133 auto result = monitor_->check_health();
134 if (result.is_err()) {
135 return ::kcenon::common::error_info(2, "Health check failed", "monitoring_system");
136 }
137
138 // Convert monitoring_system health to common health
139 ::kcenon::common::interfaces::health_check_result health;
140
141 switch(result.value().status) {
142 case health_status::healthy:
143 health.status = ::kcenon::common::interfaces::health_status::healthy;
144 break;
145 case health_status::degraded:
146 health.status = ::kcenon::common::interfaces::health_status::degraded;
147 break;
148 case health_status::unhealthy:
149 health.status = ::kcenon::common::interfaces::health_status::unhealthy;
150 break;
151 default:
152 health.status = ::kcenon::common::interfaces::health_status::unknown;
153 }
154
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;
159
160 return health;
161 }
162
166 ::kcenon::common::VoidResult reset() override {
167 pending_metrics_.clear();
168 // monitoring_system doesn't have direct reset
169 return ::kcenon::common::VoidResult(std::monostate{});
170 }
171
172private:
173 std::shared_ptr<monitoring_interface> monitor_;
174 std::vector<metric_value> pending_metrics_;
175};
176
183class monitor_from_common_adapter : public metrics_collector {
184public:
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) {}
194
195 ~monitor_from_common_adapter() override = default;
196
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");
205 }
206
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);
212 }
213
214 const auto& common_snapshot = common_result.value();
215
216 // Convert common snapshot to monitoring_system snapshot
217 metrics_snapshot snapshot;
218 snapshot.capture_time = common_snapshot.capture_time;
219 snapshot.source_id = common_snapshot.source_id;
220
221 for (const auto& m : common_snapshot.metrics) {
222 snapshot.add_metric(m.name, m.value);
223 }
224
225 return common::Result<metrics_snapshot>(snapshot);
226 }
227
231 std::string get_name() const override {
232 return name_;
233 }
234
238 bool is_enabled() const override {
239 return enabled_;
240 }
241
245 common::VoidResult set_enabled(bool enable) override {
246 enabled_ = enable;
247 return common::ok();
248 }
249
253 common::VoidResult initialize() override {
254 return common::ok();
255 }
256
260 common::VoidResult cleanup() override {
261 if (common_monitor_) {
262 common_monitor_->reset();
263 }
264 return common::ok();
265 }
266
267private:
268 std::shared_ptr<::kcenon::common::interfaces::IMonitor> common_monitor_;
269 std::string name_;
270 bool enabled_ = true;
271};
272
276class common_system_monitorable_adapter : public ::kcenon::common::interfaces::IMonitorable {
277public:
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) {}
287
288 ~common_system_monitorable_adapter() override = default;
289
293 ::kcenon::common::Result<::kcenon::common::interfaces::metrics_snapshot> get_monitoring_data() override {
294 // monitoring_system monitorable doesn't have get_monitoring_data
295 // Return empty snapshot
296 ::kcenon::common::interfaces::metrics_snapshot snapshot;
297 snapshot.source_id = component_name_;
298 return snapshot;
299 }
300
304 ::kcenon::common::Result<::kcenon::common::interfaces::health_check_result> health_check() override {
305 // monitoring_system monitorable doesn't have health_check
306 // Return healthy status
307 ::kcenon::common::interfaces::health_check_result result;
308 result.status = ::kcenon::common::interfaces::health_status::healthy;
309 result.message = "Component operational";
310 return result;
311 }
312
316 std::string get_component_name() const override {
317 return component_name_;
318 }
319
320private:
321 std::shared_ptr<monitorable_interface> monitorable_;
322 std::string component_name_;
323};
324
328class common_monitor_factory {
329public:
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);
336 }
337
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);
345 }
346
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);
354 }
355};
356
357#endif // KCENON_HAS_COMMON_SYSTEM
358
359} // namespace adapters
360} } // namespace kcenon::monitoring
Abstract base class for health checks.
Abstract base class for metric collectors.
Unified feature flags header for monitoring_system.
Interface for components that expose monitoring metrics.
Core monitoring system interface definitions.
Result pattern type definitions for monitoring system.
Represents a single metric value with metadata.
Basic metric structure for interface compatibility.
std::unordered_map< std::string, std::string > tags
Complete snapshot of metrics at a point in time.
std::chrono::system_clock::time_point capture_time
void add_metric(const std::string &name, double value)
Add a metric to the snapshot.
std::string name_