#include <iostream>
#include <iomanip>
#include <thread>
#include <chrono>
using namespace std::chrono;
std::cout << "\n" << std::string(70, '=') << "\n";
std::cout << title << "\n";
std::cout << std::string(70, '=') << "\n\n";
}
std::cout << std::string(70, '-') << "\n";
}
std::cout << "Health Check Report:\n";
std::cout << " Overall Status: ";
case health_status::healthy:
std::cout << "ā
Healthy\n";
break;
case health_status::degraded:
std::cout << "ā ļø Degraded\n";
break;
case health_status::failed:
std::cout << "ā Failed\n";
break;
case health_status::critical:
std::cout << "š„ Critical\n";
break;
default:
std::cout << "ā Unknown\n";
}
std::cout <<
" Database Connected: " << (health.
is_connected ?
"Yes ā" :
"No ā") <<
"\n";
if (detailed) {
std::cout << "\n Component Health:\n";
std::cout <<
" Logger: " << (health.
logger_healthy ?
"ā Healthy" :
"ā Unhealthy") <<
"\n";
std::cout <<
" Monitor: " << (health.
monitor_healthy ?
"ā Healthy" :
"ā Unhealthy") <<
"\n";
std::cout <<
" Thread Pool: " << (health.
thread_pool_healthy ?
"ā Healthy" :
"ā Unhealthy") <<
"\n";
std::cout << "\n Connection Pool:\n";
std::cout << " Utilization: " << std::fixed << std::setprecision(1)
std::cout << "\n ā ļø Issues Detected:\n";
for (
const auto& issue : health.
issues) {
std::cout << " - " << issue << "\n";
}
}
}
}
std::cout << "Database Metrics:\n";
std::cout << " Query Statistics:\n";
std::cout <<
" Total Queries: " << std::setw(10) << metrics.
total_queries <<
"\n";
std::cout <<
" Failed: " << std::setw(10) << metrics.
failed_queries <<
"\n";
std::cout << " Success Rate: " << std::fixed << std::setprecision(2)
<< std::setw(9) << success_rate << " %\n";
}
std::cout << "\n Performance:\n";
std::cout << " Queries/sec: " << std::fixed << std::setprecision(2)
std::cout << " Avg Latency: " << std::fixed << std::setprecision(3)
std::cout << " Min Latency: " << std::fixed << std::setprecision(3)
<< std::setw(10) << (metrics.
min_latency.count() / 1000.0) <<
" ms\n";
std::cout << " Max Latency: " << std::fixed << std::setprecision(3)
<< std::setw(10) << (metrics.
max_latency.count() / 1000.0) <<
" ms\n";
if (detailed) {
std::cout << "\n Connection Pool:\n";
std::cout <<
" Pool Size: " << std::setw(10) << metrics.
pool_size <<
"\n";
std::cout <<
" Wait Queue: " << std::setw(10) << metrics.
wait_queue_size <<
"\n";
std::cout << "\n Transactions:\n";
}
}
std::cout << "Monitoring database for 10 seconds...\n";
std::cout << "Press Ctrl+C to stop\n\n";
const int duration_seconds = 10;
const int interval_ms = 1000;
for (int i = 0; i < duration_seconds; ++i) {
std::cout << "[" << std::setw(2) << (i + 1) << "s] "
<< "QPS: " << std::fixed << std::setprecision(1) << std::setw(6)
<< " | Latency: " << std::fixed << std::setprecision(3) << std::setw(8)
<< "\n";
std::this_thread::sleep_for(milliseconds(interval_ms));
}
std::cout << "\nā
Monitoring complete\n";
}
std::cout << "Performing periodic health checks...\n\n";
for (int i = 0; i < 3; ++i) {
std::cout << "Health Check #" << (i + 1) << ":\n";
if (i < 2) {
std::this_thread::sleep_for(seconds(2));
}
}
std::cout << "\nā
Health checks complete\n";
}
std::cout << "Running performance test...\n";
auto start = steady_clock::now();
const int num_queries = 100;
int succeeded = 0;
std::cout << "Executing " << num_queries << " test queries...\n";
for (int i = 0; i < num_queries; ++i) {
auto result = db.
execute(
"SELECT 1");
if (result.is_ok()) {
succeeded++;
} else {
}
if (i % 10 == 0) {
std::this_thread::sleep_for(milliseconds(10));
}
}
auto duration = duration_cast<milliseconds>(steady_clock::now() - start);
std::cout << "\nPerformance Report:\n";
std::cout << " Execution:\n";
std::cout << " Duration: " << duration.count() << " ms\n";
std::cout << " Queries Executed: " << num_queries << "\n";
std::cout << " Succeeded: " << succeeded << "\n";
std::cout <<
" Failed: " <<
failed <<
"\n";
std::cout << " Throughput: " << std::fixed << std::setprecision(2)
<< (num_queries * 1000.0 / duration.count()) << " queries/sec\n";
std::cout << "\n Metrics Delta:\n";
std::cout << " Total Queries: +" << (metrics_after.total_queries - metrics_before.total_queries) << "\n";
std::cout << " Successful: +" << (metrics_after.successful_queries - metrics_before.successful_queries) << "\n";
std::cout << " Failed: +" << (metrics_after.failed_queries - metrics_before.failed_queries) << "\n";
std::cout << "\nā
Performance profiling complete\n";
}
std::cout << "Monitoring for alert conditions...\n\n";
const double high_latency_threshold = 100.0;
const double high_pool_utilization = 0.8;
const double low_success_rate = 0.95;
bool alerts_triggered = false;
if (avg_latency_ms > high_latency_threshold) {
std::cout << "ā ļø ALERT: High query latency detected!\n";
std::cout << " Current: " << std::fixed << std::setprecision(3)
<< avg_latency_ms << " ms\n";
std::cout << " Threshold: " << high_latency_threshold << " ms\n\n";
alerts_triggered = true;
}
if (health.connection_pool_utilization > high_pool_utilization) {
std::cout << "ā ļø ALERT: High connection pool utilization!\n";
std::cout << " Current: " << (health.connection_pool_utilization * 100) << "%\n";
std::cout << " Threshold: " << (high_pool_utilization * 100) << "%\n\n";
alerts_triggered = true;
}
if (success_rate < low_success_rate) {
std::cout << "ā ļø ALERT: Low query success rate!\n";
std::cout << " Current: " << (success_rate * 100) << "%\n";
std::cout << " Threshold: " << (low_success_rate * 100) << "%\n\n";
alerts_triggered = true;
}
}
if (health.status != health_status::healthy) {
std::cout << "ā ļø ALERT: System health degraded!\n";
std::cout << " Status: ";
switch (health.status) {
case health_status::degraded: std::cout << "Degraded\n"; break;
case health_status::failed: std::cout << "Failed\n"; break;
case health_status::critical: std::cout << "Critical\n"; break;
default: std::cout << "Unknown\n";
}
std::cout << "\n";
alerts_triggered = true;
}
if (!alerts_triggered) {
std::cout << "ā
No alerts triggered - system operating normally\n";
}
std::cout << "\nā
Alert monitoring complete\n";
}
int main(
int argc,
char* argv[]) {
print_header(
"Unified Database System - Monitoring Example");
std::cout << "Creating database instance with monitoring...\n";
auto db_result = unified_database_system::create_builder()
.enable_logging(db_log_level::info, "./logs")
.enable_monitoring(true)
.enable_async(4)
.set_pool_size(5, 20)
.set_slow_query_threshold(milliseconds(100))
.build();
if (db_result.is_err()) {
std::cerr << "Failed to create database instance: " << db_result.error().message << "\n";
return 1;
}
auto db = std::move(db_result.value());
std::cout << "ā
Database instance created\n";
if (argc > 1) {
std::string conn_string = argv[1];
std::cout << "\nConnecting to database...\n";
auto connect_result = db->
connect(conn_string);
if (connect_result.is_ok()) {
std::cout << "ā
Connected successfully\n";
std::cout << "\nā
Disconnected\n";
} else {
std::cout << "ā Connection failed: " << connect_result.error().message << "\n";
std::cout << "\nNote: This example requires a real database connection.\n";
}
} else {
std::cout << "\nā No connection string provided.\n";
std::cout << "Usage: " << argv[0] << " [connection_string]\n";
return 1;
}
std::cout << "ā
All monitoring examples completed!\n\n";
return 0;
}
void print_header(const std::string &title)
Main unified database system class.
database_metrics get_metrics() const
Get current performance metrics.
kcenon::common::Result< query_result > execute(const std::string &query, const std::vector< query_param > ¶ms={})
health_check check_health() const
Perform health check.
kcenon::common::VoidResult connect(const std::string &connection_string)
Connect to database.
kcenon::common::VoidResult disconnect()
Disconnect from database.
void print_metrics(const database_metrics &metrics)
void print_health_check(const health_check &health)
void example_health_monitoring(unified_database_system &db)
void example_realtime_monitoring(unified_database_system &db)
void example_alerting(unified_database_system &db)
void example_performance_profiling(unified_database_system &db)
Database performance metrics.
std::chrono::microseconds max_latency
size_t successful_queries
size_t active_connections
size_t transactions_committed
size_t transactions_started
std::chrono::microseconds min_latency
size_t transactions_rolled_back
double queries_per_second
std::chrono::microseconds average_latency
bool connection_pool_healthy
double connection_pool_utilization
std::vector< std::string > issues
Zero-configuration database system with integrated adapters (Phase 6)