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 static common::Result<std::shared_ptr<performance_monitor_adapter>> create(
53 std::shared_ptr<performance_monitor> monitor) {
54 if (!monitor) {
55 return common::Result<std::shared_ptr<performance_monitor_adapter>>::err(
56 common::error_info{
58 "performance_monitor cannot be null",
59 "performance_monitor_adapter"});
60 }
61 return common::ok(std::shared_ptr<performance_monitor_adapter>(
62 new performance_monitor_adapter(std::move(monitor), validated_tag{})));
63 }
64
71 explicit performance_monitor_adapter(std::shared_ptr<performance_monitor> monitor)
72 : monitor_(std::move(monitor)) {
73 if (!monitor_) {
74 throw std::invalid_argument("performance_monitor cannot be null");
75 }
76 }
77
89 common::VoidResult record_metric(const std::string& name, double value) override {
90 // performance_monitor is specifically designed for timing operations,
91 // not recording arbitrary metric values. For IMonitor compatibility,
92 // we accept the call but don't store it.
93 (void)name; // Suppress unused parameter warning
94 (void)value;
95 return common::ok();
96 }
97
110 common::VoidResult record_metric(
111 const std::string& name,
112 double value,
113 const std::unordered_map<std::string, std::string>& tags) override {
114 // Convert to tag_map and record as counter with tags
115 tag_map converted_tags(tags.begin(), tags.end());
116 auto result = monitor_->record_counter(name, value, converted_tags);
117 if (result.is_err()) {
118 const auto& err = result.error();
119 return common::VoidResult(
120 common::error_info{static_cast<int>(err.code), err.message, "performance_monitor_adapter"}
121 );
122 }
123 return common::ok();
124 }
125
131 common::Result<common::interfaces::metrics_snapshot> get_metrics() override {
132 try {
133 // Get all recorded metrics from the performance_monitor
134 common::interfaces::metrics_snapshot snapshot;
135 snapshot.source_id = monitor_->get_name();
136 snapshot.capture_time = std::chrono::system_clock::now();
137
138 // Get performance metrics from the monitor's profiler
139 const auto& perf_metrics = monitor_->get_profiler().get_all_metrics();
140
141 // Convert each performance_metrics (operation timing) into multiple metric_value entries
142 for (const auto& perf : perf_metrics) {
143 // Add various duration metrics as gauges
144 snapshot.add_metric(perf.operation_name + "_min_ns",
145 static_cast<double>(perf.min_duration.count()));
146 snapshot.add_metric(perf.operation_name + "_max_ns",
147 static_cast<double>(perf.max_duration.count()));
148 snapshot.add_metric(perf.operation_name + "_mean_ns",
149 static_cast<double>(perf.mean_duration.count()));
150 snapshot.add_metric(perf.operation_name + "_median_ns",
151 static_cast<double>(perf.median_duration.count()));
152 snapshot.add_metric(perf.operation_name + "_p95_ns",
153 static_cast<double>(perf.p95_duration.count()));
154 snapshot.add_metric(perf.operation_name + "_p99_ns",
155 static_cast<double>(perf.p99_duration.count()));
156
157 // Add count metrics as counters (conceptually)
158 snapshot.add_metric(perf.operation_name + "_call_count",
159 static_cast<double>(perf.call_count));
160 snapshot.add_metric(perf.operation_name + "_error_count",
161 static_cast<double>(perf.error_count));
162 }
163
164 // Add tagged metrics (counters, gauges, histograms with tags)
165 const auto& tagged_metrics = monitor_->get_all_tagged_metrics();
166 for (const auto& metric : tagged_metrics) {
167 // Create metric_value with tags directly
168 common::interfaces::metric_value mv(metric.name, metric.value);
169 mv.tags = std::unordered_map<std::string, std::string>(
170 metric.tags.begin(), metric.tags.end());
171 mv.timestamp = metric.timestamp;
172 snapshot.metrics.push_back(std::move(mv));
173 }
174
175 return common::ok(std::move(snapshot));
176 } catch (const std::exception& e) {
177 return common::Result<common::interfaces::metrics_snapshot>(
178 common::error_info{3, std::string("Exception in get_metrics: ") + e.what(), "performance_monitor_adapter"}
179 );
180 }
181 }
182
188 common::Result<common::interfaces::health_check_result> check_health() override {
189 try {
190 common::interfaces::health_check_result result;
191 result.timestamp = std::chrono::system_clock::now();
192
193 if (monitor_->is_enabled()) {
194 result.status = common::interfaces::health_status::healthy;
195 result.message = "Performance monitor is operational";
196 } else {
197 result.status = common::interfaces::health_status::degraded;
198 result.message = "Performance monitor is disabled";
199 }
200
201 return common::ok(std::move(result));
202 } catch (const std::exception& e) {
203 common::interfaces::health_check_result result;
204 result.status = common::interfaces::health_status::unhealthy;
205 result.message = std::string("Health check failed: ") + e.what();
206 result.timestamp = std::chrono::system_clock::now();
207 return common::ok(std::move(result));
208 }
209 }
210
216 common::VoidResult reset() override {
217 try {
218 monitor_->reset();
219 return common::ok();
220 } catch (const std::exception& e) {
221 return common::VoidResult(
222 common::error_info{4, std::string("Failed to reset monitor: ") + e.what(), "performance_monitor_adapter"}
223 );
224 }
225 }
226
231 std::shared_ptr<performance_monitor> get_wrapped_monitor() const {
232 return monitor_;
233 }
234
235private:
236 struct validated_tag {};
237
238 // Private constructor for validated creation via create()
239 performance_monitor_adapter(std::shared_ptr<performance_monitor> monitor, validated_tag)
240 : monitor_(std::move(monitor)) {}
241
242 std::shared_ptr<performance_monitor> monitor_;
243};
244
250inline common::Result<std::shared_ptr<common::interfaces::IMonitor>> make_monitor_adapter(
251 std::shared_ptr<performance_monitor> monitor) {
252 auto result = performance_monitor_adapter::create(std::move(monitor));
253 if (result.is_err()) {
254 return common::Result<std::shared_ptr<common::interfaces::IMonitor>>::err(
255 result.error());
256 }
257 return common::ok(
258 std::shared_ptr<common::interfaces::IMonitor>(result.value()));
259}
260
261} } // namespace kcenon::monitoring
Adapter that wraps performance_monitor to implement IMonitor interface.
performance_monitor_adapter(std::shared_ptr< performance_monitor > monitor, validated_tag)
static common::Result< std::shared_ptr< performance_monitor_adapter > > create(std::shared_ptr< performance_monitor > monitor)
Create an adapter with validated monitor pointer.
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.
common::Result< std::shared_ptr< common::interfaces::IMonitor > > make_monitor_adapter(std::shared_ptr< performance_monitor > monitor)
Factory function to create performance_monitor_adapter.
std::unordered_map< std::string, std::string > tag_map
Type alias for metric tags/labels.
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