35 : config_(config), initialized_(false)
66 std::lock_guard<std::mutex> lock(
mutex_);
83 return make_error(
"Monitoring backend not initialized");
86 std::lock_guard<std::mutex> lock(
mutex_);
92 const std::string& name,
double value,
93 const std::unordered_map<std::string, std::string>& )
103 return make_error_result<metrics_snapshot>(
"Monitoring backend not initialized");
106 std::lock_guard<std::mutex> lock(
mutex_);
109 snapshot.
source_id =
"database_fallback";
131 snapshot.
gauges[name] = value;
141 return make_error_result<health_check_result>(
"Monitoring backend not initialized");
144 std::lock_guard<std::mutex> lock(
mutex_);
148 result.
message =
"Database system healthy";
154 result.
message =
"Connection pool usage critical";
162 result.
message =
"Query latency critical";
170 result.
message =
"Query success rate low";
181 return make_error(
"Monitoring backend not initialized");
184 std::lock_guard<std::mutex> lock(
mutex_);
193 std::lock_guard<std::mutex> lock(
mutex_);
213 const size_t max_samples = 1000;
234 std::lock_guard<std::mutex> lock(
mutex_);
248 std::lock_guard<std::mutex> lock(
mutex_);
254 std::lock_guard<std::mutex> lock(
mutex_);
264 std::lock_guard<std::mutex> lock(
mutex_);
276 return make_error_result<database_metrics>(
"Monitoring backend not initialized");
279 std::lock_guard<std::mutex> lock(
mutex_);
286 std::lock_guard<std::mutex> lock(
mutex_);
288 std::ostringstream oss;
289 oss <<
"# TYPE db_connections_active gauge\n";
292 oss <<
"# TYPE db_connections_idle gauge\n";
295 oss <<
"# TYPE db_queries_total counter\n";
298 oss <<
"# TYPE db_queries_success_rate gauge\n";
301 oss <<
"# TYPE db_query_latency_avg_us gauge\n";
311 return std::chrono::microseconds(0);
315 std::sort(sorted.begin(), sorted.end());
317 size_t idx =
static_cast<size_t>(sorted.size() * percentile);
318 if (idx >= sorted.size())
320 idx = sorted.size() - 1;
333 auto sum = std::accumulate(
341 std::sort(sorted.begin(), sorted.end());
343 size_t p95_idx =
static_cast<size_t>(sorted.size() * 0.95);
344 size_t p99_idx =
static_cast<size_t>(sorted.size() * 0.99);
346 if (p95_idx < sorted.size())
350 if (p99_idx < sorted.size())
fallback_monitoring_backend(const db_monitoring_config &config)
void record_transaction_rollback() override
Record transaction rollback.
bool is_initialized() const override
Check if backend is initialized.
void record_connection_acquired() override
Record connection acquisition.
void record_transaction_begin() override
Record transaction begin.
common::VoidResult initialize() override
Initialize the monitoring backend.
void update_pool_stats(std::size_t active, std::size_t idle, std::size_t total) override
Update connection pool statistics.
common::Result< metrics_snapshot > get_metrics() override
Get current metrics snapshot.
std::chrono::steady_clock::time_point start_time_
database_metrics metrics_
void record_transaction_commit() override
Record transaction commit.
std::unordered_map< std::string, double > generic_metrics_
void record_query_execution(std::chrono::microseconds duration, bool success) override
Record query execution.
void record_connection_released() override
Record connection release.
~fallback_monitoring_backend() override
std::chrono::microseconds calculate_percentile(double percentile)
Calculate percentile from latency samples.
std::vector< std::chrono::microseconds > query_latencies_
const db_monitoring_config & config_
std::string export_prometheus_metrics() override
Export metrics in Prometheus format.
common::VoidResult reset() override
Reset all metrics.
common::Result< database_metrics > get_database_metrics() override
Get database-specific metrics.
void update_avg_latency()
Update average query latency.
common::VoidResult shutdown() override
Shutdown the monitoring backend gracefully.
common::Result< health_check_result > check_health() override
Perform health check.
common::VoidResult record_metric(const std::string &name, double value) override
Record a metric value.
Fallback monitoring backend using internal metrics tracking.
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.
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 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)