Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
performance_monitoring_demo.cpp File Reference

Performance monitoring with real-time metrics, analysis, and alerting. More...

#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <memory>
#include <random>
#include "database/database_manager.h"
#include "database/core/database_context.h"
#include "database/monitoring/performance_monitor.h"
Include dependency graph for performance_monitoring_demo.cpp:

Go to the source code of this file.

Functions

void demonstrate_basic_metrics (std::shared_ptr< database_context > context)
 
void demonstrate_query_metrics (std::shared_ptr< database_context > context)
 
void demonstrate_connection_pool_metrics (std::shared_ptr< database_context > context)
 
void demonstrate_real_time_monitoring (std::shared_ptr< database_context > context)
 
void demonstrate_performance_analysis (std::shared_ptr< database_context > context)
 
void demonstrate_metrics_export (std::shared_ptr< database_context > context)
 
void demonstrate_alerting_system (std::shared_ptr< database_context > context)
 
int main ()
 

Detailed Description

Performance monitoring with real-time metrics, analysis, and alerting.

Definition in file performance_monitoring_demo.cpp.

Function Documentation

◆ demonstrate_alerting_system()

void demonstrate_alerting_system ( std::shared_ptr< database_context > context)
Examples
performance_monitoring_demo.cpp.

Definition at line 261 of file performance_monitoring_demo.cpp.

261 {
262 std::cout << "\n=== Alerting and Notification System ===\n";
263
264 auto monitor = context->get_performance_monitor();
265
266 // Configure alert rules
267 alert_rule cpu_rule;
268 cpu_rule.metric_name = "cpu_usage_percent";
269 cpu_rule.threshold_value = 75.0;
270 cpu_rule.comparison = alert_comparison::greater_than;
271 cpu_rule.severity = alert_severity::warning;
272 cpu_rule.message = "High CPU usage detected";
273
274 alert_rule memory_rule;
275 memory_rule.metric_name = "memory_usage_percent";
276 memory_rule.threshold_value = 90.0;
277 memory_rule.comparison = alert_comparison::greater_than;
278 memory_rule.severity = alert_severity::critical;
279 memory_rule.message = "Critical memory usage level";
280
281 monitor->add_alert_rule(cpu_rule);
282 monitor->add_alert_rule(memory_rule);
283
284 std::cout << "Configured alert rules:\n";
285 std::cout << " • CPU usage > 75% (Warning)\n";
286 std::cout << " • Memory usage > 90% (Critical)\n";
287
288 // Simulate threshold breaches
289 std::cout << "\nSimulating alert conditions...\n";
290
291 // The monitoring system would automatically trigger alerts
292 // based on real system metrics or simulated conditions
293 std::cout << "Alert system is active and monitoring thresholds.\n";
294 std::cout << "In production, alerts would be sent via:\n";
295 std::cout << " • Email notifications\n";
296 std::cout << " • Slack/Teams integration\n";
297 std::cout << " • SMS alerts for critical issues\n";
298 std::cout << " • Webhook notifications to external systems\n";
299}

Referenced by main().

Here is the caller graph for this function:

◆ demonstrate_basic_metrics()

void demonstrate_basic_metrics ( std::shared_ptr< database_context > context)
Examples
performance_monitoring_demo.cpp.

Definition at line 33 of file performance_monitoring_demo.cpp.

33 {
34 std::cout << "=== Basic Performance Metrics Demonstration ===\n";
35
36 // Initialize performance monitor via dependency injection
37 auto monitor = context->get_performance_monitor();
38
39 // Configure monitoring settings
40 monitoring_config config;
41 config.enable_query_tracking = true;
42 config.enable_connection_tracking = true;
43 config.slow_query_threshold = std::chrono::milliseconds(100);
44 config.alert_threshold_cpu = 80.0;
45 config.alert_threshold_memory = 85.0;
46
47 monitor->configure(config);
48 std::cout << "Performance monitoring configured with:\n";
49 std::cout << " - Query tracking: enabled\n";
50 std::cout << " - Connection tracking: enabled\n";
51 std::cout << " - Slow query threshold: 100ms\n";
52 std::cout << " - CPU alert threshold: 80%\n";
53 std::cout << " - Memory alert threshold: 85%\n";
54
55 // Get current system metrics
56 const auto& system_metrics = monitor->get_system_metrics();
57 std::cout << "\nCurrent System Metrics:\n";
58 std::cout << " CPU Usage: " << system_metrics.cpu_usage_percent << "%\n";
59 std::cout << " Memory Usage: " << system_metrics.memory_usage_percent << "%\n";
60 std::cout << " Disk I/O: " << system_metrics.disk_io_bytes_per_sec << " bytes/sec\n";
61 std::cout << " Network I/O: " << system_metrics.network_io_bytes_per_sec << " bytes/sec\n";
62}

Referenced by main().

Here is the caller graph for this function:

◆ demonstrate_connection_pool_metrics()

void demonstrate_connection_pool_metrics ( std::shared_ptr< database_context > context)
Examples
performance_monitoring_demo.cpp.

Definition at line 120 of file performance_monitoring_demo.cpp.

120 {
121 std::cout << "\n=== Connection Pool Performance Monitoring ===\n";
122
123 auto monitor = context->get_performance_monitor();
124
125 // Simulate connection pool activity
126 std::cout << "Simulating connection pool operations...\n";
127
128 for (int i = 0; i < 15; ++i) {
129 // Simulate getting connection from pool
130 auto start_time = std::chrono::high_resolution_clock::now();
131
132 // Simulate connection acquisition time
133 std::this_thread::sleep_for(std::chrono::milliseconds(5 + (i % 3) * 10));
134
135 auto end_time = std::chrono::high_resolution_clock::now();
136
137 connection_metrics metrics;
138 metrics.total_connections.store(20);
139 metrics.active_connections.store(8 + (i % 5));
140 metrics.idle_connections.store(metrics.total_connections.load() - metrics.active_connections.load());
141 metrics.connections_created.store(25 + i);
142 metrics.connections_destroyed.store(5 + (i / 5));
143 metrics.connection_errors.store(i / 10);
144 metrics.average_wait_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
145 metrics.peak_connections.store(std::max(static_cast<size_t>(20), metrics.active_connections.load()));
146
147 monitor->record_connection_metrics(metrics);
148
149 std::cout << " Pool State " << (i+1) << ": "
150 << metrics.active_connections.load() << "/"
151 << metrics.total_connections.load() << " active, "
152 << "wait time: " << metrics.average_wait_time.count() << "ms\n";
153 }
154
155 // Display connection pool statistics
156 std::cout << "\nConnection Pool Performance Summary:\n";
157 const auto& pool_stats = monitor->get_connection_pool_statistics();
158
159 std::cout << " Pool Utilization: " << pool_stats.utilization_percentage << "%\n";
160 std::cout << " Average Wait Time: " << pool_stats.average_wait_time.count() << "ms\n";
161 std::cout << " Peak Connections: " << pool_stats.peak_connections << "\n";
162 std::cout << " Connection Errors: " << pool_stats.connection_errors << "\n";
163 std::cout << " Pool Efficiency Score: " << pool_stats.efficiency_score << "/100\n";
164}
Metrics for database connection usage.

References database::monitoring::connection_metrics::active_connections, database::monitoring::connection_metrics::idle_connections, and database::monitoring::connection_metrics::total_connections.

Referenced by main().

Here is the caller graph for this function:

◆ demonstrate_metrics_export()

void demonstrate_metrics_export ( std::shared_ptr< database_context > context)
Examples
performance_monitoring_demo.cpp.

Definition at line 229 of file performance_monitoring_demo.cpp.

229 {
230 std::cout << "\n=== Metrics Export for External Monitoring ===\n";
231
232 auto monitor = context->get_performance_monitor();
233
234 std::cout << "Exporting metrics in various formats...\n";
235
236 // Export Prometheus metrics
237 std::cout << "\n--- Prometheus Metrics Format ---\n";
238 const auto prometheus_metrics = monitor->export_prometheus_metrics();
239 std::cout << prometheus_metrics.substr(0, 300) << "...\n";
240
241 // Export JSON metrics
242 std::cout << "\n--- JSON Metrics Format ---\n";
243 const auto json_metrics = monitor->export_json_metrics();
244 std::cout << json_metrics.substr(0, 200) << "...\n";
245
246 // Export CSV metrics for analysis
247 std::cout << "\n--- CSV Export for Analysis ---\n";
248 const auto csv_data = monitor->export_csv_metrics();
249 std::cout << "CSV data exported: " << csv_data.size() << " bytes\n";
250 std::cout << "First few lines:\n";
251 auto first_newline = csv_data.find('\n', csv_data.find('\n') + 1);
252 std::cout << csv_data.substr(0, first_newline) << "\n";
253
254 std::cout << "\nMetrics can be integrated with:\n";
255 std::cout << " • Prometheus + Grafana for visualization\n";
256 std::cout << " • ELK Stack for log analysis\n";
257 std::cout << " • Custom monitoring dashboards\n";
258 std::cout << " • Third-party APM solutions\n";
259}

Referenced by main().

Here is the caller graph for this function:

◆ demonstrate_performance_analysis()

void demonstrate_performance_analysis ( std::shared_ptr< database_context > context)
Examples
performance_monitoring_demo.cpp.

Definition at line 201 of file performance_monitoring_demo.cpp.

201 {
202 std::cout << "\n=== Performance Analysis and Reporting ===\n";
203
204 auto monitor = context->get_performance_monitor();
205
206 // Generate performance report
207 std::cout << "Generating comprehensive performance report...\n";
208
209 const auto& report = monitor->generate_performance_report();
210
211 std::cout << "\n📊 Performance Report Summary:\n";
212 std::cout << " Report Period: " << report.report_period_minutes << " minutes\n";
213 std::cout << " Total Operations: " << report.total_operations << "\n";
214 std::cout << " Average Response Time: " << report.average_response_time.count() << "ms\n";
215 std::cout << " Peak Throughput: " << report.peak_throughput_ops_per_sec << " ops/sec\n";
216 std::cout << " Error Rate: " << report.error_rate_percentage << "%\n";
217
218 std::cout << "\n📈 Top Performance Insights:\n";
219 for (const auto& insight : report.performance_insights) {
220 std::cout << " • " << insight << "\n";
221 }
222
223 std::cout << "\n🔧 Optimization Recommendations:\n";
224 for (const auto& recommendation : report.recommendations) {
225 std::cout << " → " << recommendation << "\n";
226 }
227}

Referenced by main().

Here is the caller graph for this function:

◆ demonstrate_query_metrics()

void demonstrate_query_metrics ( std::shared_ptr< database_context > context)
Examples
performance_monitoring_demo.cpp.

Definition at line 64 of file performance_monitoring_demo.cpp.

64 {
65 std::cout << "\n=== Query Performance Tracking ===\n";
66
67 auto monitor = context->get_performance_monitor();
68
69 // Simulate various database queries with different performance characteristics
70 std::random_device rd;
71 std::mt19937 gen(rd());
72 std::uniform_int_distribution<> query_time_dist(10, 200);
73 std::uniform_int_distribution<> success_rate(1, 100);
74
75 std::cout << "Simulating database queries...\n";
76
77 for (int i = 0; i < 20; ++i) {
78 std::string query_type = (i % 4 == 0) ? "SELECT" :
79 (i % 4 == 1) ? "INSERT" :
80 (i % 4 == 2) ? "UPDATE" : "DELETE";
81
82 auto start_time = std::chrono::high_resolution_clock::now();
83
84 // Simulate query execution time
85 auto execution_time = std::chrono::milliseconds(query_time_dist(gen));
86 std::this_thread::sleep_for(execution_time);
87
88 auto end_time = std::chrono::high_resolution_clock::now();
89 bool success = success_rate(gen) > 5; // 95% success rate
90
91 // Record query metrics
92 query_metrics metrics;
93 metrics.query_type = query_type;
94 metrics.execution_time = execution_time;
95 metrics.success = success;
96 metrics.rows_affected = success ? (i * 3 + 1) : 0;
97 metrics.timestamp = start_time;
98
99 monitor->record_query_execution(metrics);
100
101 std::cout << " Query " << (i+1) << " (" << query_type << "): "
102 << execution_time.count() << "ms, "
103 << (success ? "SUCCESS" : "FAILED") << "\n";
104 }
105
106 // Display aggregated query statistics
107 std::cout << "\nQuery Performance Summary:\n";
108 const auto& query_stats = monitor->get_query_statistics();
109
110 std::cout << " Total Queries: " << query_stats.total_queries << "\n";
111 std::cout << " Successful Queries: " << query_stats.successful_queries << "\n";
112 std::cout << " Failed Queries: " << query_stats.failed_queries << "\n";
113 std::cout << " Success Rate: " <<
114 (100.0 * query_stats.successful_queries / query_stats.total_queries) << "%\n";
115 std::cout << " Average Execution Time: " <<
116 query_stats.average_execution_time.count() << "ms\n";
117 std::cout << " Slow Queries Detected: " << query_stats.slow_queries_count << "\n";
118}
Metrics for individual query execution.
std::chrono::microseconds execution_time

References database::monitoring::query_metrics::execution_time, database::monitoring::query_metrics::rows_affected, database::success, and database::monitoring::query_metrics::success.

Referenced by main().

Here is the caller graph for this function:

◆ demonstrate_real_time_monitoring()

void demonstrate_real_time_monitoring ( std::shared_ptr< database_context > context)
Examples
performance_monitoring_demo.cpp.

Definition at line 166 of file performance_monitoring_demo.cpp.

166 {
167 std::cout << "\n=== Real-Time Performance Monitoring ===\n";
168
169 auto monitor = context->get_performance_monitor();
170
171 std::cout << "Starting real-time monitoring (5 seconds)...\n";
172
173 auto start_time = std::chrono::steady_clock::now();
174 int update_count = 0;
175
176 while (std::chrono::steady_clock::now() - start_time < std::chrono::seconds(5)) {
177 std::this_thread::sleep_for(std::chrono::seconds(1));
178 update_count++;
179
180 // Get real-time metrics
181 const auto& system_metrics = monitor->get_system_metrics();
182 const auto& alerts = monitor->get_active_alerts();
183
184 std::cout << "\n[" << update_count << "s] Real-time Status:\n";
185 std::cout << " CPU: " << system_metrics.cpu_usage_percent << "%, "
186 << "Memory: " << system_metrics.memory_usage_percent << "%, "
187 << "Active Alerts: " << alerts.size() << "\n";
188
189 // Display any active alerts
190 for (const auto& alert : alerts) {
191 std::cout << " ⚠️ ALERT: " << alert.message
192 << " (Severity: " << static_cast<int>(alert.severity) << ")\n";
193 }
194
195 if (alerts.empty()) {
196 std::cout << " ✅ All systems normal\n";
197 }
198 }
199}

Referenced by main().

Here is the caller graph for this function:

◆ main()

int main ( )

Definition at line 301 of file performance_monitoring_demo.cpp.

301 {
302 std::cout << "=== Performance Monitoring Framework Demonstration ===\n";
303 std::cout << "This sample demonstrates comprehensive performance monitoring\n";
304 std::cout << "capabilities for database operations and system resources.\n";
305
306 try {
307 // Initialize database context with dependency injection
308 auto context = std::make_shared<database_context>();
309
317
318 std::cout << "\n=== Performance Monitoring Features Summary ===\n";
319 std::cout << "✓ Real-time system and database metrics collection\n";
320 std::cout << "✓ Query performance tracking and analysis\n";
321 std::cout << "✓ Connection pool monitoring and optimization\n";
322 std::cout << "✓ Slow query detection and alerting\n";
323 std::cout << "✓ Performance trend analysis and reporting\n";
324 std::cout << "✓ Multi-format metrics export (Prometheus, JSON, CSV)\n";
325 std::cout << "✓ Configurable alerting with multiple severity levels\n";
326 std::cout << "✓ Integration with external monitoring systems\n";
327
328 std::cout << "\nFor production deployment:\n";
329 std::cout << " auto context = std::make_shared<database_context>();\n";
330 std::cout << " auto monitor = context->get_performance_monitor();\n";
331 std::cout << " monitor->configure(your_config);\n";
332 std::cout << " // Metrics are automatically collected during database operations\n";
333
334 } catch (const std::exception& e) {
335 std::cout << "Error: " << e.what() << std::endl;
336 return 1;
337 }
338
339 return 0;
340}
void demonstrate_alerting_system(std::shared_ptr< database_context > context)
void demonstrate_connection_pool_metrics(std::shared_ptr< database_context > context)
void demonstrate_real_time_monitoring(std::shared_ptr< database_context > context)
void demonstrate_performance_analysis(std::shared_ptr< database_context > context)
void demonstrate_query_metrics(std::shared_ptr< database_context > context)
void demonstrate_basic_metrics(std::shared_ptr< database_context > context)
void demonstrate_metrics_export(std::shared_ptr< database_context > context)

References demonstrate_alerting_system(), demonstrate_basic_metrics(), demonstrate_connection_pool_metrics(), demonstrate_metrics_export(), demonstrate_performance_analysis(), demonstrate_query_metrics(), and demonstrate_real_time_monitoring().

Here is the call graph for this function: