21#include <unordered_map>
29#include <shared_mutex>
36#include <kcenon/common/interfaces/monitoring_interface.h>
38namespace kcenon {
namespace monitoring {
46using tag_map = std::unordered_map<std::string, std::string>;
75 ,
timestamp(std::chrono::system_clock::now()) {}
80 std::string
key()
const {
83 std::vector<std::pair<std::string, std::string>> sorted_tags(
85 std::sort(sorted_tags.begin(), sorted_tags.end());
86 for (
const auto& [tag_key, tag_value] : sorted_tags) {
87 k +=
";" + tag_key +
"=" + tag_value;
98 std::chrono::nanoseconds
min_duration{std::chrono::nanoseconds::max()};
99 std::chrono::nanoseconds
max_duration{std::chrono::nanoseconds::zero()};
103 std::chrono::nanoseconds
p95_duration{std::chrono::nanoseconds::zero()};
104 std::chrono::nanoseconds
p99_duration{std::chrono::nanoseconds::zero()};
146 std::atomic<std::chrono::steady_clock::rep>
last_access_time{std::chrono::steady_clock::now().time_since_epoch().count()};
150 std::unordered_map<std::string, std::unique_ptr<profile_data>>
profiles_;
164 const std::string& operation_name,
165 std::chrono::nanoseconds duration,
173 const std::string& operation_name
248 ,
start_time_(std::chrono::high_resolution_clock::now()) {}
267 auto end_time = std::chrono::high_resolution_clock::now();
268 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(
283 auto now = std::chrono::high_resolution_clock::now();
284 return std::chrono::duration_cast<std::chrono::nanoseconds>(
296 std::unique_ptr<monitor_impl>
impl_;
319 std::chrono::milliseconds interval = std::chrono::milliseconds(1000)
337 std::chrono::seconds duration = std::chrono::seconds(60)
363 double cpu_threshold{80.0};
364 double memory_threshold{90.0};
365 std::chrono::milliseconds latency_threshold{1000};
376 std::size_t max_histogram_samples{1000};
407 if (result.is_err()) {
408 return common::VoidResult::err(result.error());
415 if (result.is_err()) {
416 return common::VoidResult::err(result.error());
421 common::Result<metrics_snapshot>
collect()
override;
459 std::lock_guard<std::mutex> lock(thresholds_mutex_);
460 thresholds_.cpu_threshold = threshold;
464 std::lock_guard<std::mutex> lock(thresholds_mutex_);
465 thresholds_.memory_threshold = threshold;
469 std::lock_guard<std::mutex> lock(thresholds_mutex_);
470 thresholds_.latency_threshold = threshold;
478 std::lock_guard<std::mutex> lock(thresholds_mutex_);
615#define PERF_TIMER(operation_name) \
616 kcenon::monitoring::scoped_timer _perf_timer( \
617 &kcenon::monitoring::global_performance_monitor().get_profiler(), \
621#define PERF_TIMER_CUSTOM(profiler, operation_name) \
622 kcenon::monitoring::scoped_timer _perf_timer(profiler, operation_name)
631 std::uint32_t iterations_{1000};
632 std::uint32_t warmup_iterations_{100};
643 iterations_ = iterations;
651 warmup_iterations_ = warmup;
657 template<
typename Func>
658 common::Result<performance_metrics>
run(
659 const std::string& operation_name,
663 for (std::uint32_t i = 0; i < warmup_iterations_; ++i) {
668 for (std::uint32_t i = 0; i < iterations_; ++i) {
669 auto start = std::chrono::high_resolution_clock::now();
675 auto end = std::chrono::high_resolution_clock::now();
676 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(
683 auto end = std::chrono::high_resolution_clock::now();
684 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(
696 template<
typename Func1,
typename Func2>
697 common::Result<std::pair<performance_metrics, performance_metrics>>
compare(
698 const std::string& operation1_name,
700 const std::string& operation2_name,
703 auto result1 = run(operation1_name, std::forward<Func1>(func1));
704 if (result1.is_err()) {
705 return common::Result<std::pair<performance_metrics, performance_metrics>>::err(result1.error());
708 auto result2 = run(operation2_name, std::forward<Func2>(func2));
709 if (result2.is_err()) {
710 return common::Result<std::pair<performance_metrics, performance_metrics>>::err(result2.error());
713 return common::ok(std::make_pair(result1.value(), result2.value()));
718#if defined(__linux__)
723common::Result<system_metrics> get_linux_system_metrics();
731common::Result<system_metrics> get_windows_system_metrics();
Abstract base class for metric collectors.
Scoped performance timer.
std::chrono::high_resolution_clock::time_point start_time_
std::chrono::nanoseconds elapsed() const
Get elapsed time without completing.
std::string operation_name_
void complete()
Manually complete the timing.
performance_profiler * profiler_
void mark_failed()
Mark the operation as failed.
scoped_timer(performance_profiler *profiler, const std::string &operation_name)
std::vector< system_metrics > get_history(std::chrono::seconds duration=std::chrono::seconds(60)) const
Get historical metrics.
common::Result< bool > start_monitoring(std::chrono::milliseconds interval=std::chrono::milliseconds(1000))
Start monitoring system resources.
common::Result< bool > stop_monitoring()
Stop monitoring.
system_monitor(const system_monitor &)=delete
system_monitor & operator=(const system_monitor &)=delete
system_monitor(system_monitor &&) noexcept
std::unique_ptr< monitor_impl > impl_
common::Result< system_metrics > get_current_metrics() const
Get current system metrics.
bool is_monitoring() const
Check if monitoring is active.
Monitoring system specific error codes.
Core monitoring system interface definitions.
performance_monitor & global_performance_monitor()
Global performance monitor instance.
std::unordered_map< std::string, std::string > tag_map
Type alias for metric tags/labels.
recorded_metric_type
Types of recorded metrics.
@ gauge
Instantaneous value that can go up and down.
@ counter
Monotonically increasing counter.
@ histogram
Distribution of values with buckets.
Result pattern type definitions for monitoring system.
std::size_t memory_usage_bytes
double disk_io_write_rate
std::chrono::system_clock::time_point timestamp
double network_io_send_rate
std::uint32_t handle_count
double network_io_recv_rate
double memory_usage_percent
std::uint32_t thread_count
std::size_t available_memory_bytes
Represents a metric value with associated tags.
std::string key() const
Generate unique key for aggregation based on name and sorted tags.
tagged_metric(const std::string &n, double v, recorded_metric_type t, const tag_map &tgs={})
recorded_metric_type type
std::chrono::system_clock::time_point timestamp