Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
performance_monitor_adapter.h
Go to the documentation of this file.
1#pragma once
2
3// BSD 3-Clause License
4// Copyright (c) 2025, 🍀☀🌕🌥 🌊
5// See the LICENSE file in the project root for full license information.
6
7
19#include <kcenon/common/interfaces/monitoring_interface.h>
20#include <memory>
21#include <string>
22
23namespace kcenon { namespace monitoring {
24
45class performance_monitor_adapter : public common::interfaces::IMonitor {
46public:
52 explicit performance_monitor_adapter(std::shared_ptr<performance_monitor> monitor)
53 : monitor_(std::move(monitor)) {
54 if (!monitor_) {
55 throw std::invalid_argument("performance_monitor cannot be null");
56 }
57 }
58
70 common::VoidResult record_metric(const std::string& name, double value) override {
71 // performance_monitor is specifically designed for timing operations,
72 // not recording arbitrary metric values. For IMonitor compatibility,
73 // we accept the call but don't store it.
74 (void)name; // Suppress unused parameter warning
75 (void)value;
76 return common::ok();
77 }
78
91 common::VoidResult record_metric(
92 const std::string& name,
93 double value,
94 const std::unordered_map<std::string, std::string>& tags) override {
95 // Convert to tag_map and record as counter with tags
96 tag_map converted_tags(tags.begin(), tags.end());
97 auto result = monitor_->record_counter(name, value, converted_tags);
98 if (result.is_err()) {
99 const auto& err = result.error();
100 return common::VoidResult(
101 common::error_info{static_cast<int>(err.code), err.message, "performance_monitor_adapter"}
102 );
103 }
104 return common::ok();
105 }
106
112 common::Result<common::interfaces::metrics_snapshot> get_metrics() override {
113 try {
114 // Get all recorded metrics from the performance_monitor
115 common::interfaces::metrics_snapshot snapshot;
116 snapshot.source_id = monitor_->get_name();
117 snapshot.capture_time = std::chrono::system_clock::now();
118
119 // Get performance metrics from the monitor's profiler
120 const auto& perf_metrics = monitor_->get_profiler().get_all_metrics();
121
122 // Convert each performance_metrics (operation timing) into multiple metric_value entries
123 for (const auto& perf : perf_metrics) {
124 // Add various duration metrics as gauges
125 snapshot.add_metric(perf.operation_name + "_min_ns",
126 static_cast<double>(perf.min_duration.count()));
127 snapshot.add_metric(perf.operation_name + "_max_ns",
128 static_cast<double>(perf.max_duration.count()));
129 snapshot.add_metric(perf.operation_name + "_mean_ns",
130 static_cast<double>(perf.mean_duration.count()));
131 snapshot.add_metric(perf.operation_name + "_median_ns",
132 static_cast<double>(perf.median_duration.count()));
133 snapshot.add_metric(perf.operation_name + "_p95_ns",
134 static_cast<double>(perf.p95_duration.count()));
135 snapshot.add_metric(perf.operation_name + "_p99_ns",
136 static_cast<double>(perf.p99_duration.count()));
137
138 // Add count metrics as counters (conceptually)
139 snapshot.add_metric(perf.operation_name + "_call_count",
140 static_cast<double>(perf.call_count));
141 snapshot.add_metric(perf.operation_name + "_error_count",
142 static_cast<double>(perf.error_count));
143 }
144
145 // Add tagged metrics (counters, gauges, histograms with tags)
146 const auto& tagged_metrics = monitor_->get_all_tagged_metrics();
147 for (const auto& metric : tagged_metrics) {
148 // Create metric_value with tags directly
149 common::interfaces::metric_value mv(metric.name, metric.value);
150 mv.tags = std::unordered_map<std::string, std::string>(
151 metric.tags.begin(), metric.tags.end());
152 mv.timestamp = metric.timestamp;
153 snapshot.metrics.push_back(std::move(mv));
154 }
155
156 return common::ok(std::move(snapshot));
157 } catch (const std::exception& e) {
158 return common::Result<common::interfaces::metrics_snapshot>(
159 common::error_info{3, std::string("Exception in get_metrics: ") + e.what(), "performance_monitor_adapter"}
160 );
161 }
162 }
163
169 common::Result<common::interfaces::health_check_result> check_health() override {
170 try {
171 common::interfaces::health_check_result result;
172 result.timestamp = std::chrono::system_clock::now();
173
174 if (monitor_->is_enabled()) {
175 result.status = common::interfaces::health_status::healthy;
176 result.message = "Performance monitor is operational";
177 } else {
178 result.status = common::interfaces::health_status::degraded;
179 result.message = "Performance monitor is disabled";
180 }
181
182 return common::ok(std::move(result));
183 } catch (const std::exception& e) {
184 common::interfaces::health_check_result result;
185 result.status = common::interfaces::health_status::unhealthy;
186 result.message = std::string("Health check failed: ") + e.what();
187 result.timestamp = std::chrono::system_clock::now();
188 return common::ok(std::move(result));
189 }
190 }
191
197 common::VoidResult reset() override {
198 try {
199 monitor_->reset();
200 return common::ok();
201 } catch (const std::exception& e) {
202 return common::VoidResult(
203 common::error_info{4, std::string("Failed to reset monitor: ") + e.what(), "performance_monitor_adapter"}
204 );
205 }
206 }
207
212 std::shared_ptr<performance_monitor> get_wrapped_monitor() const {
213 return monitor_;
214 }
215
216private:
217 std::shared_ptr<performance_monitor> monitor_;
218};
219
225inline std::shared_ptr<common::interfaces::IMonitor> make_monitor_adapter(
226 std::shared_ptr<performance_monitor> monitor) {
227 return std::make_shared<performance_monitor_adapter>(std::move(monitor));
228}
229
230} } // namespace kcenon::monitoring
Adapter that wraps performance_monitor to implement IMonitor interface.
common::VoidResult record_metric(const std::string &name, double value) override
Record a simple metric value.
std::shared_ptr< performance_monitor > get_wrapped_monitor() const
Get the wrapped performance_monitor.
common::VoidResult reset() override
Reset all metrics in the wrapped performance_monitor.
common::Result< common::interfaces::health_check_result > check_health() override
Perform health check on the performance_monitor.
common::VoidResult record_metric(const std::string &name, double value, const std::unordered_map< std::string, std::string > &tags) override
Record a metric with additional tags.
performance_monitor_adapter(std::shared_ptr< performance_monitor > monitor)
Construct adapter with existing performance_monitor.
common::Result< common::interfaces::metrics_snapshot > get_metrics() override
Get current metrics snapshot.
std::unordered_map< std::string, std::string > tag_map
Type alias for metric tags/labels.
std::shared_ptr< common::interfaces::IMonitor > make_monitor_adapter(std::shared_ptr< performance_monitor > monitor)
Factory function to create performance_monitor_adapter.
Performance monitoring and profiling implementation.
Basic metric structure for interface compatibility.
std::chrono::system_clock::time_point timestamp
std::variant< double, int64_t, std::string > value
std::unordered_map< std::string, std::string > tags