27using namespace std::chrono;
30 std::cout <<
"\n" << std::string(70,
'=') <<
"\n";
31 std::cout << title <<
"\n";
32 std::cout << std::string(70,
'=') <<
"\n\n";
36 std::cout << std::string(70,
'-') <<
"\n";
43 std::cout <<
"Health Check Report:\n";
46 std::cout <<
" Overall Status: ";
48 case health_status::healthy:
49 std::cout <<
"ā
Healthy\n";
51 case health_status::degraded:
52 std::cout <<
"ā ļø Degraded\n";
54 case health_status::failed:
55 std::cout <<
"ā Failed\n";
57 case health_status::critical:
58 std::cout <<
"š„ Critical\n";
61 std::cout <<
"ā Unknown\n";
64 std::cout <<
" Database Connected: " << (health.
is_connected ?
"Yes ā" :
"No ā") <<
"\n";
67 std::cout <<
"\n Component Health:\n";
68 std::cout <<
" Logger: " << (health.
logger_healthy ?
"ā Healthy" :
"ā Unhealthy") <<
"\n";
69 std::cout <<
" Monitor: " << (health.
monitor_healthy ?
"ā Healthy" :
"ā Unhealthy") <<
"\n";
70 std::cout <<
" Thread Pool: " << (health.
thread_pool_healthy ?
"ā Healthy" :
"ā Unhealthy") <<
"\n";
72 std::cout <<
"\n Connection Pool:\n";
73 std::cout <<
" Utilization: " << std::fixed << std::setprecision(1)
77 if (!health.
issues.empty()) {
78 std::cout <<
"\n ā ļø Issues Detected:\n";
79 for (
const auto& issue : health.
issues) {
80 std::cout <<
" - " << issue <<
"\n";
92 std::cout <<
"Database Metrics:\n";
95 std::cout <<
" Query Statistics:\n";
96 std::cout <<
" Total Queries: " << std::setw(10) << metrics.
total_queries <<
"\n";
98 std::cout <<
" Failed: " << std::setw(10) << metrics.
failed_queries <<
"\n";
102 std::cout <<
" Success Rate: " << std::fixed << std::setprecision(2)
103 << std::setw(9) << success_rate <<
" %\n";
106 std::cout <<
"\n Performance:\n";
107 std::cout <<
" Queries/sec: " << std::fixed << std::setprecision(2)
109 std::cout <<
" Avg Latency: " << std::fixed << std::setprecision(3)
110 << std::setw(10) << (metrics.
average_latency.count() / 1000.0) <<
" ms\n";
111 std::cout <<
" Min Latency: " << std::fixed << std::setprecision(3)
112 << std::setw(10) << (metrics.
min_latency.count() / 1000.0) <<
" ms\n";
113 std::cout <<
" Max Latency: " << std::fixed << std::setprecision(3)
114 << std::setw(10) << (metrics.
max_latency.count() / 1000.0) <<
" ms\n";
117 std::cout <<
"\n Connection Pool:\n";
118 std::cout <<
" Pool Size: " << std::setw(10) << metrics.
pool_size <<
"\n";
120 std::cout <<
" Idle: " << std::setw(10) << metrics.
idle_connections <<
"\n";
121 std::cout <<
" Wait Queue: " << std::setw(10) << metrics.
wait_queue_size <<
"\n";
123 std::cout <<
"\n Transactions:\n";
138 std::cout <<
"Monitoring database for 10 seconds...\n";
139 std::cout <<
"Press Ctrl+C to stop\n\n";
141 const int duration_seconds = 10;
142 const int interval_ms = 1000;
144 for (
int i = 0; i < duration_seconds; ++i) {
147 std::cout <<
"[" << std::setw(2) << (i + 1) <<
"s] "
148 <<
"QPS: " << std::fixed << std::setprecision(1) << std::setw(6)
150 <<
" | Latency: " << std::fixed << std::setprecision(3) << std::setw(8)
151 << (metrics.average_latency.count() / 1000.0) <<
" ms"
152 <<
" | Active: " << std::setw(2) << metrics.active_connections
153 <<
" | Idle: " << std::setw(2) << metrics.idle_connections
154 <<
" | Total: " << std::setw(4) << metrics.total_queries
157 std::this_thread::sleep_for(milliseconds(interval_ms));
160 std::cout <<
"\nā
Monitoring complete\n";
169 std::cout <<
"Performing periodic health checks...\n\n";
171 for (
int i = 0; i < 3; ++i) {
172 std::cout <<
"Health Check #" << (i + 1) <<
":\n";
178 std::this_thread::sleep_for(seconds(2));
182 std::cout <<
"\nā
Health checks complete\n";
191 std::cout <<
"Running performance test...\n";
195 auto start = steady_clock::now();
198 const int num_queries = 100;
202 std::cout <<
"Executing " << num_queries <<
" test queries...\n";
204 for (
int i = 0; i < num_queries; ++i) {
205 auto result = db.
execute(
"SELECT 1");
206 if (result.is_ok()) {
214 std::this_thread::sleep_for(milliseconds(10));
218 auto duration = duration_cast<milliseconds>(steady_clock::now() - start);
223 std::cout <<
"\nPerformance Report:\n";
226 std::cout <<
" Execution:\n";
227 std::cout <<
" Duration: " << duration.count() <<
" ms\n";
228 std::cout <<
" Queries Executed: " << num_queries <<
"\n";
229 std::cout <<
" Succeeded: " << succeeded <<
"\n";
230 std::cout <<
" Failed: " <<
failed <<
"\n";
231 std::cout <<
" Throughput: " << std::fixed << std::setprecision(2)
232 << (num_queries * 1000.0 / duration.count()) <<
" queries/sec\n";
234 std::cout <<
"\n Metrics Delta:\n";
235 std::cout <<
" Total Queries: +" << (metrics_after.total_queries - metrics_before.total_queries) <<
"\n";
236 std::cout <<
" Successful: +" << (metrics_after.successful_queries - metrics_before.successful_queries) <<
"\n";
237 std::cout <<
" Failed: +" << (metrics_after.failed_queries - metrics_before.failed_queries) <<
"\n";
241 std::cout <<
"\nā
Performance profiling complete\n";
250 std::cout <<
"Monitoring for alert conditions...\n\n";
253 const double high_latency_threshold = 100.0;
254 const double high_pool_utilization = 0.8;
255 const double low_success_rate = 0.95;
260 bool alerts_triggered =
false;
263 double avg_latency_ms = metrics.average_latency.count() / 1000.0;
264 if (avg_latency_ms > high_latency_threshold) {
265 std::cout <<
"ā ļø ALERT: High query latency detected!\n";
266 std::cout <<
" Current: " << std::fixed << std::setprecision(3)
267 << avg_latency_ms <<
" ms\n";
268 std::cout <<
" Threshold: " << high_latency_threshold <<
" ms\n\n";
269 alerts_triggered =
true;
273 if (health.connection_pool_utilization > high_pool_utilization) {
274 std::cout <<
"ā ļø ALERT: High connection pool utilization!\n";
275 std::cout <<
" Current: " << (health.connection_pool_utilization * 100) <<
"%\n";
276 std::cout <<
" Threshold: " << (high_pool_utilization * 100) <<
"%\n\n";
277 alerts_triggered =
true;
281 if (metrics.total_queries > 0) {
282 double success_rate =
static_cast<double>(metrics.successful_queries) / metrics.total_queries;
283 if (success_rate < low_success_rate) {
284 std::cout <<
"ā ļø ALERT: Low query success rate!\n";
285 std::cout <<
" Current: " << (success_rate * 100) <<
"%\n";
286 std::cout <<
" Threshold: " << (low_success_rate * 100) <<
"%\n\n";
287 alerts_triggered =
true;
292 if (health.status != health_status::healthy) {
293 std::cout <<
"ā ļø ALERT: System health degraded!\n";
294 std::cout <<
" Status: ";
295 switch (health.status) {
296 case health_status::degraded: std::cout <<
"Degraded\n";
break;
297 case health_status::failed: std::cout <<
"Failed\n";
break;
298 case health_status::critical: std::cout <<
"Critical\n";
break;
299 default: std::cout <<
"Unknown\n";
302 alerts_triggered =
true;
305 if (!alerts_triggered) {
306 std::cout <<
"ā
No alerts triggered - system operating normally\n";
309 std::cout <<
"\nā
Alert monitoring complete\n";
312int main(
int argc,
char* argv[]) {
313 print_header(
"Unified Database System - Monitoring Example");
316 std::cout <<
"Creating database instance with monitoring...\n";
326 if (db_result.is_err()) {
327 std::cerr <<
"Failed to create database instance: " << db_result.error().message <<
"\n";
330 auto db = std::move(db_result.value());
332 std::cout <<
"ā
Database instance created\n";
336 auto health = db->check_health();
341 auto metrics = db->get_metrics();
346 std::string conn_string = argv[1];
347 std::cout <<
"\nConnecting to database...\n";
349 auto connect_result = db->connect(conn_string);
351 if (connect_result.is_ok()) {
352 std::cout <<
"ā
Connected successfully\n";
362 health = db->check_health();
365 metrics = db->get_metrics();
370 std::cout <<
"\nā
Disconnected\n";
373 std::cout <<
"ā Connection failed: " << connect_result.error().message <<
"\n";
374 std::cout <<
"\nNote: This example requires a real database connection.\n";
378 std::cout <<
"\nā No connection string provided.\n";
379 std::cout <<
"Usage: " << argv[0] <<
" [connection_string]\n";
384 std::cout <<
"ā
All monitoring examples completed!\n\n";
builder & enable_monitoring(bool enable=true)
Enable monitoring and metrics collection.
builder & set_pool_size(size_t min_size, size_t max_size)
Set connection pool size.
builder & enable_async(size_t worker_threads=4)
Enable async operations.
builder & set_slow_query_threshold(std::chrono::milliseconds threshold)
Set slow query threshold.
kcenon::common::Result< std::unique_ptr< unified_database_system > > build()
Build and return the configured database system.
builder & enable_logging(db_log_level level, const std::string &log_dir="./logs")
Enable logging.
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.
static builder create_builder()
Create a builder for custom configuration.
void example_health_monitoring(unified_database_system &db)
void example_realtime_monitoring(unified_database_system &db)
void print_health_check(const health_check &health, bool detailed=true)
void print_header(const std::string &title)
void example_alerting(unified_database_system &db)
void example_performance_profiling(unified_database_system &db)
void print_metrics(const database_metrics &metrics, bool detailed=true)
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)