7#include <kcenon/monitoring/core/performance_monitor.h>
8#include <kcenon/monitoring/exporters/metric_exporters.h>
41 , max_latency_samples_(10000)
42 , active_connections_(0)
43 , idle_connections_(0)
44 , total_connections_(0)
45 , active_transactions_(0)
68 monitor_ = std::make_unique<kcenon::monitoring::performance_monitor>(
"database_system");
71 auto init_result =
monitor_->initialize();
72 if (!init_result.is_ok())
74 return make_error(
"Failed to initialize monitoring_system: " +
75 std::string(init_result.error().message));
82 catch (
const std::exception& e)
84 return make_error(
"Exception during initialization: " + std::string(e.what()));
97 std::lock_guard<std::mutex> lock(
mutex_);
101 auto cleanup_result =
monitor_->cleanup();
102 if (!cleanup_result.is_ok())
115 catch (
const std::exception& e)
117 return make_error(
"Exception during shutdown: " + std::string(e.what()));
130 return make_error(
"Monitoring backend not initialized");
133 std::lock_guard<std::mutex> lock(
mutex_);
138 auto duration_ns =
static_cast<std::int64_t
>(value * 1000.0);
139 monitor_->get_profiler().record_sample(
141 std::chrono::nanoseconds(duration_ns),
145 catch (
const std::exception& e)
147 return make_error(
"Failed to record metric: " + std::string(e.what()));
152 const std::string& name,
double value,
153 const std::unordered_map<std::string, std::string>& )
164 return make_error_result<metrics_snapshot>(
"Monitoring backend not initialized");
167 std::lock_guard<std::mutex> lock(
mutex_);
204 catch (
const std::exception& e)
206 return make_error_result<metrics_snapshot>(
"Failed to get metrics: " + std::string(e.what()));
214 return make_error_result<health_check_result>(
"Monitoring backend not initialized");
217 std::lock_guard<std::mutex> lock(
mutex_);
221 result.
message =
"Database system healthy";
227 result.
message =
"Connection pool usage critical";
228 result.
metadata[
"connection_usage"] =
236 result.
message =
"Query latency critical";
244 result.
message =
"Query success rate low";
255 return make_error(
"Monitoring backend not initialized");
258 std::lock_guard<std::mutex> lock(
mutex_);
276 catch (
const std::exception& e)
278 return make_error(
"Failed to reset metrics: " + std::string(e.what()));
284 std::lock_guard<std::mutex> lock(
mutex_);
307 auto duration_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(duration);
308 monitor_->get_profiler().record_sample(
"query_execution", duration_ns,
success);
324 std::lock_guard<std::mutex> lock(
mutex_);
330 std::lock_guard<std::mutex> lock(
mutex_);
336 std::lock_guard<std::mutex> lock(
mutex_);
359 std::lock_guard<std::mutex> lock(
mutex_);
366 std::lock_guard<std::mutex> lock(
mutex_);
387 std::lock_guard<std::mutex> lock(
mutex_);
410 return make_error_result<database_metrics>(
"Monitoring backend not initialized");
413 std::lock_guard<std::mutex> lock(
mutex_);
419 auto elapsed = std::chrono::steady_clock::now() -
start_time_;
420 auto elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(elapsed).count();
422 if (elapsed_seconds > 0)
436 std::lock_guard<std::mutex> lock(
mutex_);
438 std::ostringstream ss;
441 ss <<
"# HELP db_connections_active Number of active database connections\n";
442 ss <<
"# TYPE db_connections_active gauge\n";
445 ss <<
"# HELP db_connections_idle Number of idle database connections\n";
446 ss <<
"# TYPE db_connections_idle gauge\n";
449 ss <<
"# HELP db_connections_total Total number of connections in pool\n";
450 ss <<
"# TYPE db_connections_total gauge\n";
453 ss <<
"# HELP db_connection_usage_percent Connection pool usage percentage\n";
454 ss <<
"# TYPE db_connection_usage_percent gauge\n";
458 ss <<
"# HELP db_queries_total Total number of queries executed\n";
459 ss <<
"# TYPE db_queries_total counter\n";
462 ss <<
"# HELP db_queries_successful Number of successful queries\n";
463 ss <<
"# TYPE db_queries_successful counter\n";
466 ss <<
"# HELP db_queries_failed Number of failed queries\n";
467 ss <<
"# TYPE db_queries_failed counter\n";
470 ss <<
"# HELP db_query_success_rate Query success rate (0-1)\n";
471 ss <<
"# TYPE db_query_success_rate gauge\n";
475 ss <<
"# HELP db_query_latency_avg_us Average query latency in microseconds\n";
476 ss <<
"# TYPE db_query_latency_avg_us gauge\n";
479 ss <<
"# HELP db_query_latency_min_us Minimum query latency in microseconds\n";
480 ss <<
"# TYPE db_query_latency_min_us gauge\n";
483 ss <<
"# HELP db_query_latency_max_us Maximum query latency in microseconds\n";
484 ss <<
"# TYPE db_query_latency_max_us gauge\n";
487 ss <<
"# HELP db_query_latency_p95_us 95th percentile query latency in microseconds\n";
488 ss <<
"# TYPE db_query_latency_p95_us gauge\n";
491 ss <<
"# HELP db_query_latency_p99_us 99th percentile query latency in microseconds\n";
492 ss <<
"# TYPE db_query_latency_p99_us gauge\n";
496 ss <<
"# HELP db_transactions_active Number of active transactions\n";
497 ss <<
"# TYPE db_transactions_active gauge\n";
500 ss <<
"# HELP db_transactions_committed Total number of committed transactions\n";
501 ss <<
"# TYPE db_transactions_committed counter\n";
504 ss <<
"# HELP db_transactions_rolled_back Total number of rolled back transactions\n";
505 ss <<
"# TYPE db_transactions_rolled_back counter\n";
508 ss <<
"# HELP db_transaction_commit_rate Transaction commit rate (0-1)\n";
509 ss <<
"# TYPE db_transaction_commit_rate gauge\n";
513 ss <<
"# HELP db_queries_per_second Query throughput (queries/second)\n";
514 ss <<
"# TYPE db_queries_per_second gauge\n";
517 ss <<
"# HELP db_transactions_per_second Transaction throughput (transactions/second)\n";
518 ss <<
"# TYPE db_transactions_per_second gauge\n";
533 std::sort(sorted_latencies.begin(), sorted_latencies.end());
540 auto total_latency = std::accumulate(
541 sorted_latencies.begin(),
542 sorted_latencies.end(),
543 std::chrono::microseconds(0));
547 auto calc_percentile = [&sorted_latencies](
double percentile) -> std::chrono::microseconds {
548 if (sorted_latencies.empty())
549 return std::chrono::microseconds(0);
552 static_cast<std::size_t
>((percentile / 100.0) * (sorted_latencies.size() - 1));
553 return sorted_latencies[index];
561 const kcenon::monitoring::metrics_snapshot& snapshot)
566 for (
const auto& metric : snapshot.metrics)
568 const auto& name = metric.name;
569 const auto value = metric.value;
571 if (name ==
"query_execution_count")
573 db_metrics.
total_queries =
static_cast<std::uint64_t
>(value);
bool is_initialized() const override
Check if backend is initialized.
std::size_t total_connections_
common::VoidResult initialize() override
Initialize the monitoring backend.
common::Result< health_check_result > check_health() override
Perform health check.
const db_monitoring_config & config_
void record_connection_released() override
Record connection release.
std::vector< std::chrono::microseconds > recent_query_latencies_
void update_pool_stats(std::size_t active, std::size_t idle, std::size_t total) override
Update connection pool statistics.
std::string export_prometheus_metrics() override
Export metrics in Prometheus format.
std::chrono::steady_clock::time_point start_time_
std::unique_ptr< kcenon::monitoring::performance_monitor > monitor_
void record_query_execution(std::chrono::microseconds duration, bool success) override
Record query execution.
void record_transaction_commit() override
Record transaction commit.
std::size_t idle_connections_
system_monitoring_backend(const db_monitoring_config &config)
Construct system monitoring backend.
common::VoidResult record_metric(const std::string &name, double value) override
Record a metric value.
database_metrics convert_to_database_metrics(const kcenon::monitoring::metrics_snapshot &snapshot)
Convert monitoring_system metrics to database_metrics format.
database_metrics current_metrics_
std::size_t active_connections_
common::Result< database_metrics > get_database_metrics() override
Get database-specific metrics.
std::size_t max_latency_samples_
void record_connection_acquired() override
Record connection acquisition.
void record_transaction_begin() override
Record transaction begin.
void record_transaction_rollback() override
Record transaction rollback.
common::Result< metrics_snapshot > get_metrics() override
Get current metrics snapshot.
common::VoidResult shutdown() override
Shutdown the monitoring backend gracefully.
void calculate_derived_metrics()
Calculate derived metrics from collected data.
common::VoidResult reset() override
Reset all metrics.
~system_monitoring_backend() override
std::size_t active_transactions_
Result< std::monostate > VoidResult
async_result< T > make_error_result(const std::exception &error)
Health check result structure.
std::unordered_map< std::string, std::string > metadata
Simple metrics snapshot structure.
std::unordered_map< std::string, uint64_t > counters
std::unordered_map< std::string, double > gauges
Database-specific metrics structure.
std::uint64_t active_transactions
Currently active transactions.
std::size_t idle_connections
Idle connections in pool.
double connection_usage_percent
Percentage of connections in use.
std::size_t total_connections
Total pool size.
std::uint64_t failed_queries
Failed queries.
std::size_t active_connections
Currently active connections.
std::uint64_t rolled_back_transactions
Total rolled-back transactions.
std::uint64_t total_queries
Total queries executed.
std::chrono::microseconds p99_query_latency
99th percentile latency
std::uint64_t successful_queries
Successfully completed queries.
double queries_per_second
Query throughput.
double transaction_commit_rate
Commit rate (0.0 to 1.0)
std::chrono::system_clock::time_point timestamp
When metrics were collected.
std::chrono::microseconds p95_query_latency
95th percentile latency
std::chrono::microseconds max_query_latency
Maximum query latency.
double transactions_per_second
Transaction throughput.
double query_success_rate
Success rate (0.0 to 1.0)
std::chrono::microseconds avg_query_latency
Average query latency.
std::uint64_t committed_transactions
Total committed transactions.
std::chrono::microseconds min_query_latency
Minimum query latency.
Monitoring and metrics configuration.
std::chrono::milliseconds query_latency_warning
Warn when query latency exceeds this threshold.
double connection_usage_warning_threshold
Warn when connection pool usage exceeds this percentage (0.0-1.0)
Monitoring backend using kcenon/monitoring_system.