UNPKG

qmemory

Version:

A comprehensive production-ready Node.js utility library with MongoDB document operations, user ownership enforcement, Express.js HTTP utilities, environment-aware logging, and in-memory storage. Features 96%+ test coverage with comprehensive error handli

354 lines (299 loc) 15.4 kB
/** * Enhanced Performance Monitoring Demo * Demonstrates the complete performance monitoring capabilities including singleton usage * * This demo showcases the enhanced performance monitoring system with: * - Singleton pattern for application-wide monitoring * - Individual component usage for specialized monitoring * - Real-world integration patterns * - Database operation tracking * - HTTP request monitoring * - System resource analysis * - Health check functionality */ const { DatabaseMetrics, RequestMetrics, SystemMetrics, PerformanceMonitor, performanceMonitor // Enhanced singleton instance } = require('../lib/performance-utils'); // Sample data for realistic performance testing const sampleDatabaseOperations = [ { name: 'getUserById', duration: 45, success: true }, { name: 'createUser', duration: 89, success: true }, { name: 'updateUser', duration: 67, success: true }, { name: 'deleteUser', duration: 34, success: true }, { name: 'complexQuery', duration: 156, success: true }, // Slow query { name: 'getUserById', duration: 23, success: true }, { name: 'bulkInsert', duration: 245, success: false }, // Slow + failed { name: 'indexScan', duration: 178, success: true }, // Slow query ]; const sampleHttpRequests = [ { method: 'GET', path: '/api/users', status: 200, duration: 45 }, { method: 'POST', path: '/api/users', status: 201, duration: 89 }, { method: 'PUT', path: '/api/users/:id', status: 200, duration: 67 }, { method: 'DELETE', path: '/api/users/:id', status: 204, duration: 34 }, { method: 'GET', path: '/api/users', status: 200, duration: 23 }, { method: 'GET', path: '/api/dashboard', status: 200, duration: 156 }, { method: 'POST', path: '/api/analytics', status: 500, duration: 245 }, // Error { method: 'GET', path: '/api/reports', status: 200, duration: 89 }, ]; async function demo1_singletonUsage() { console.log('\n=== Demo 1: Enhanced Singleton Performance Monitoring ==='); console.log('Demonstrating the global performance monitor instance'); console.log('\nSingleton Performance Monitor Features:'); console.log(' • Ready-to-use global instance'); console.log(' • No initialization required'); console.log(' • Consistent monitoring across application'); console.log(' • Automatic metrics collection'); // Simulate database operations using singleton console.log('\nSimulating database operations with singleton monitor:'); for (const op of sampleDatabaseOperations.slice(0, 5)) { performanceMonitor.database.recordQuery(op.name, op.duration, op.success); console.log(` ✓ Recorded ${op.name}: ${op.duration}ms (${op.success ? 'success' : 'failed'})`); } // Simulate HTTP requests using singleton console.log('\nSimulating HTTP requests with singleton monitor:'); for (const req of sampleHttpRequests.slice(0, 5)) { performanceMonitor.requests.recordRequest(req.method, req.path, req.status, req.duration); console.log(` ✓ Recorded ${req.method} ${req.path}: ${req.duration}ms (${req.status})`); } // Get immediate performance report const metrics = performanceMonitor.getComprehensiveMetrics(); console.log('\nSingleton Performance Summary:'); console.log(` Database Operations: ${metrics.database.totalQueries}`); console.log(` Slow Queries: ${metrics.database.slowQueries}`); console.log(` HTTP Requests: ${metrics.requests.totalRequests}`); console.log(` Memory Usage: ${metrics.system.memory.current.heapUsed}MB`); console.log(` CPU Usage: ${metrics.system.cpu.current}%`); } async function demo2_customInstanceUsage() { console.log('\n=== Demo 2: Custom Performance Monitor Instances ==='); console.log('Demonstrating specialized monitoring for different application components'); // Create specialized monitors for different components const apiMonitor = new PerformanceMonitor(); const backgroundTaskMonitor = new PerformanceMonitor(); console.log('\nAPI Component Monitoring:'); // Simulate API-specific operations const apiOperations = sampleDatabaseOperations.slice(0, 4); const apiRequests = sampleHttpRequests.slice(0, 4); for (const op of apiOperations) { apiMonitor.database.recordQuery(op.name, op.duration, op.success); } for (const req of apiRequests) { apiMonitor.requests.recordRequest(req.method, req.path, req.status, req.duration); } const apiMetrics = apiMonitor.getComprehensiveMetrics(); console.log(` API Database Operations: ${apiMetrics.database.totalQueries}`); console.log(` API HTTP Requests: ${apiMetrics.requests.totalRequests}`); console.log(` API Average Response Time: ${Object.values(apiMetrics.requests.endpoints)[0]?.avgDuration || 0}ms`); console.log('\nBackground Task Monitoring:'); // Simulate background task operations const backgroundOps = [ { name: 'dataSync', duration: 2340, success: true }, { name: 'reportGeneration', duration: 5670, success: true }, { name: 'cleanupTask', duration: 890, success: true }, { name: 'backupProcess', duration: 12340, success: false } ]; for (const op of backgroundOps) { backgroundTaskMonitor.database.recordQuery(op.name, op.duration, op.success); console.log(` ✓ Background task ${op.name}: ${op.duration}ms (${op.success ? 'success' : 'failed'})`); } const backgroundMetrics = backgroundTaskMonitor.getComprehensiveMetrics(); console.log(` Background Operations: ${backgroundMetrics.database.totalQueries}`); console.log(` Background Slow Queries: ${backgroundMetrics.database.slowQueries}`); // Cleanup custom instances apiMonitor.stop(); backgroundTaskMonitor.stop(); } async function demo3_realTimeAlertingSystem() { console.log('\n=== Demo 3: Real-Time Alerting and Event System ==='); console.log('Demonstrating automated alerting for performance issues'); // Create monitor with event listeners const alertingMonitor = new PerformanceMonitor(); // Set up event listeners for real-time alerts let alertCount = 0; alertingMonitor.database.on('slowQuery', (query) => { alertCount++; console.log(` 🚨 ALERT ${alertCount}: Slow query detected!`); console.log(` Query: ${query.queryName}`); console.log(` Duration: ${query.duration}ms`); console.log(` Timestamp: ${query.timestamp.toISOString()}`); console.log(` Status: ${query.success ? 'Success' : 'Failed'}`); }); console.log('\nSimulating operations that trigger alerts:'); // Simulate operations including slow queries const alertingOps = [ { name: 'normalQuery', duration: 45, success: true }, { name: 'slowAnalytics', duration: 156, success: true }, // Will trigger alert { name: 'fastLookup', duration: 12, success: true }, { name: 'timeoutQuery', duration: 234, success: false }, // Will trigger alert { name: 'batchProcess', duration: 187, success: true }, // Will trigger alert ]; for (const op of alertingOps) { alertingMonitor.database.recordQuery(op.name, op.duration, op.success); console.log(` ✓ Executed ${op.name}: ${op.duration}ms`); // Small delay to see alerts in sequence await new Promise(resolve => setTimeout(resolve, 100)); } console.log(`\nTotal alerts generated: ${alertCount}`); console.log('Real-time alerting enables immediate response to performance degradation'); alertingMonitor.stop(); } async function demo4_healthCheckIntegration() { console.log('\n=== Demo 4: Health Check Integration ==='); console.log('Demonstrating health monitoring for production deployments'); // Use singleton for health checking console.log('\nSimulating production workload:'); // Add more operations to create realistic load const productionOps = sampleDatabaseOperations.concat([ { name: 'healthCheck', duration: 5, success: true }, { name: 'metricsCollection', duration: 12, success: true }, { name: 'cacheWarmup', duration: 89, success: true }, { name: 'heavyAnalytics', duration: 234, success: true }, // Slow ]); const productionRequests = sampleHttpRequests.concat([ { method: 'GET', path: '/health', status: 200, duration: 5 }, { method: 'GET', path: '/metrics', status: 200, duration: 12 }, { method: 'POST', path: '/api/analytics', status: 200, duration: 156 }, ]); for (const op of productionOps) { performanceMonitor.database.recordQuery(op.name, op.duration, op.success); } for (const req of productionRequests) { performanceMonitor.requests.recordRequest(req.method, req.path, req.status, req.duration); } // Generate health check report const healthCheck = performanceMonitor.getHealthCheck(); console.log('\nProduction Health Check Results:'); console.log(` Overall Status: ${healthCheck.status.toUpperCase()}`); console.log(` Timestamp: ${healthCheck.timestamp}`); console.log('\nComponent Health Details:'); Object.entries(healthCheck.checks).forEach(([component, health]) => { const statusIcon = health.status === 'healthy' ? '✅' : health.status === 'warning' ? '⚠️' : '❌'; console.log(` ${statusIcon} ${component}: ${health.status}`); if (component === 'database') { console.log(` Slow Queries: ${health.slowQueries}`); console.log(` Total Queries: ${health.totalQueries}`); } else if (component === 'requests') { console.log(` Requests/Second: ${health.requestsPerSecond}`); console.log(` Total Requests: ${health.totalRequests}`); } else if (component === 'memory') { console.log(` Heap Used: ${health.heapUsedMB}MB`); console.log(` CPU Usage: ${health.cpuPercent}%`); } }); // Demonstrate health check API endpoint pattern console.log('\nHealth Check API Integration Pattern:'); console.log(' GET /health → returns health check JSON'); console.log(' Status codes: 200 (healthy), 503 (degraded)'); console.log(' Suitable for load balancer health checks'); console.log(' Integrates with monitoring systems'); } async function demo5_performanceOptimizationInsights() { console.log('\n=== Demo 5: Performance Optimization Insights ==='); console.log('Demonstrating actionable performance analytics'); // Get comprehensive metrics for analysis const metrics = performanceMonitor.getComprehensiveMetrics(); console.log('\nDatabase Performance Analysis:'); console.log(` Total Queries Executed: ${metrics.database.totalQueries}`); console.log(` Slow Queries Detected: ${metrics.database.slowQueries}`); console.log(` Connection Pool Status: Active=${metrics.database.connectionPool.active}, Available=${metrics.database.connectionPool.available}`); if (metrics.database.queryStats) { console.log('\nQuery Performance Breakdown:'); Object.entries(metrics.database.queryStats).forEach(([queryName, stats]) => { console.log(` • ${queryName}:`); console.log(` Executions: ${stats.count}`); console.log(` Average Duration: ${stats.avgDuration}ms`); console.log(` 95th Percentile: ${stats.p95Duration}ms`); console.log(` Failure Rate: ${stats.failureRate}%`); console.log(` QPS: ${stats.queriesPerSecond}`); // Provide optimization recommendations if (stats.avgDuration > 100) { console.log(` 🔍 OPTIMIZATION: Consider indexing or query optimization`); } if (stats.failureRate > 5) { console.log(` 🔍 RELIABILITY: High failure rate requires investigation`); } }); } console.log('\nHTTP Endpoint Performance Analysis:'); console.log(` Total Requests: ${metrics.requests.totalRequests}`); console.log(` Requests Per Second: ${metrics.requests.requestsPerSecond}`); console.log(` Uptime: ${metrics.requests.uptime} seconds`); if (metrics.requests.endpoints) { console.log('\nEndpoint Performance Breakdown:'); Object.entries(metrics.requests.endpoints).forEach(([endpoint, stats]) => { console.log(` • ${endpoint}:`); console.log(` Requests: ${stats.requests}`); console.log(` Average Response: ${stats.avgDuration}ms`); console.log(` 95th Percentile: ${stats.p95Duration}ms`); console.log(` Error Rate: ${stats.errorRate}%`); // Provide optimization recommendations if (stats.avgDuration > 200) { console.log(` 🔍 OPTIMIZATION: Response time above target, consider caching`); } if (stats.errorRate > 1) { console.log(` 🔍 RELIABILITY: Error rate above threshold`); } }); } console.log('\nSystem Resource Analysis:'); console.log(` Memory Usage: ${metrics.system.memory.current.heapUsed}MB heap`); console.log(` CPU Usage: ${metrics.system.cpu.current}%`); console.log(` Process Uptime: ${Math.floor(metrics.system.uptime)} seconds`); console.log(` Node.js Version: ${metrics.system.nodeVersion}`); // Resource optimization recommendations if (metrics.system.memory.current.heapUsed > 256) { console.log(` 🔍 MEMORY: Consider memory optimization or scaling`); } if (metrics.system.cpu.current > 80) { console.log(` 🔍 CPU: High CPU usage, consider performance tuning`); } } async function runAllEnhancedDemos() { console.log('🚀 Enhanced Performance Monitoring Comprehensive Demo'); console.log('====================================================='); console.log('\nThis demonstration showcases the enhanced performance monitoring'); console.log('system with singleton pattern and advanced features.'); console.log('\nEnhanced Features:'); console.log(' • Singleton instance for application-wide monitoring'); console.log(' • Custom instances for component-specific monitoring'); console.log(' • Real-time alerting system with event-driven architecture'); console.log(' • Production-ready health check integration'); console.log(' • Actionable performance optimization insights'); try { await demo1_singletonUsage(); await demo2_customInstanceUsage(); await demo3_realTimeAlertingSystem(); await demo4_healthCheckIntegration(); await demo5_performanceOptimizationInsights(); console.log('\n====================================================='); console.log('✅ All Enhanced Performance Monitoring Demos Completed!'); console.log('\nEnhancement Summary:'); console.log(' ✓ Added singleton pattern for immediate use'); console.log(' ✓ Maintained existing comprehensive functionality'); console.log(' ✓ Enhanced integration patterns demonstrated'); console.log(' ✓ Production-ready monitoring capabilities'); console.log(' ✓ Real-time alerting and health check systems'); console.log('\nThe enhanced performance monitoring system is production-ready!'); } catch (error) { console.error('\n❌ Demo execution error:', error.message); console.error('Stack trace:', error.stack); } } // Export for use in other modules or direct execution module.exports = { runAllEnhancedDemos, demo1_singletonUsage, demo2_customInstanceUsage, demo3_realTimeAlertingSystem, demo4_healthCheckIntegration, demo5_performanceOptimizationInsights }; // Run demos if this file is executed directly if (require.main === module) { runAllEnhancedDemos().catch(console.error); }