diff --git a/dashcaddy-api/src/managers/resource-monitor.js b/dashcaddy-api/src/managers/resource-monitor.js index 9ae480a..4278870 100644 --- a/dashcaddy-api/src/managers/resource-monitor.js +++ b/dashcaddy-api/src/managers/resource-monitor.js @@ -9,6 +9,7 @@ const EventEmitter = require('events'); const fs = require('fs'); const path = require('path'); const platformPaths = require('../../platform-paths'); +const { log } = require('../utils/logging'); const docker = new Docker(); @@ -59,17 +60,17 @@ class ResourceMonitor extends EventEmitter { */ start() { if (this.monitoring) { - console.log('[ResourceMonitor] Already monitoring'); + log.info('monitor', 'Already monitoring'); return; } - console.log('[ResourceMonitor] Starting container monitoring'); + log.info('monitor', 'Starting container monitoring'); this.monitoring = true; this.monitoringInterval = setInterval(() => this.collectStats(), MONITORING_INTERVAL); // Hourly rollup — fires once an hour, computes the previous full hour this.hourlyRollupTimer = setInterval(() => { - try { this.rollupHourly(); } catch (e) { console.error('[ResourceMonitor] hourly rollup error:', e.message); } + try { this.rollupHourly(); } catch (e) { log.error('monitor', e, { rollup: 'hourly' }); } }, ROLLUP_HOURLY_INTERVAL); // Daily rollup — schedule first run at the next midnight, then fire every 24h @@ -77,9 +78,9 @@ class ResourceMonitor extends EventEmitter { const nextMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 5); const msUntilMidnight = nextMidnight.getTime() - now.getTime(); setTimeout(() => { - try { this.rollupDaily(); } catch (e) { console.error('[ResourceMonitor] daily rollup error:', e.message); } + try { this.rollupDaily(); } catch (e) { log.error('monitor', e, { rollup: 'daily' }); } this.dailyRollupTimer = setInterval(() => { - try { this.rollupDaily(); } catch (e) { console.error('[ResourceMonitor] daily rollup error:', e.message); } + try { this.rollupDaily(); } catch (e) { log.error('monitor', e, { rollup: 'daily' }); } }, ROLLUP_DAILY_INTERVAL); }, msUntilMidnight); @@ -93,7 +94,7 @@ class ResourceMonitor extends EventEmitter { stop() { if (!this.monitoring) return; - console.log('[ResourceMonitor] Stopping container monitoring'); + log.info('monitor', 'Stopping container monitoring'); this.monitoring = false; if (this.monitoringInterval) { @@ -131,7 +132,7 @@ class ResourceMonitor extends EventEmitter { this.checkAlerts(containerInfo.Id, containerInfo.Names[0], stats); } } catch (error) { - console.error(`[ResourceMonitor] Error collecting stats for ${containerInfo.Names[0]}:`, error.message); + log.error('monitor', error, { container: containerInfo.Names[0] }); } } @@ -143,7 +144,7 @@ class ResourceMonitor extends EventEmitter { this.saveStats(); } } catch (error) { - console.error('[ResourceMonitor] Error collecting container stats:', error.message); + log.error('monitor', error, { phase: 'collectStats' }); } } @@ -329,7 +330,7 @@ class ResourceMonitor extends EventEmitter { // Send notification if manager is configured if (this.notificationManager) { this.notificationManager.sendAlert(alertPayload).catch(err => { - console.error('[ResourceMonitor] Failed to send alert notification:', err.message); + log.error('monitor', err, { phase: 'sendAlert' }); }); } @@ -357,7 +358,7 @@ class ResourceMonitor extends EventEmitter { */ async restartContainer(containerId, containerName, alerts) { try { - console.log(`[ResourceMonitor] Auto-restarting ${containerName} due to alerts:`, alerts.map(a => a.type).join(', ')); + log.info('monitor', 'Auto-restarting container', { container: containerName, alerts: alerts.map(a => a.type) }); const container = docker.getContainer(containerId); await container.restart(); @@ -377,11 +378,11 @@ class ResourceMonitor extends EventEmitter { timestamp: new Date().toISOString(), reason: alerts }).catch(err => { - console.error('[ResourceMonitor] Failed to send auto-restart notification:', err.message); + log.error('monitor', err, { phase: 'sendAutoRestart' }); }); } } catch (error) { - console.error(`[ResourceMonitor] Failed to restart ${containerName}:`, error.message); + log.error('monitor', error, { container: containerName, phase: 'restart' }); } } @@ -390,7 +391,7 @@ class ResourceMonitor extends EventEmitter { */ triggerWorkflows(eventType, eventData) { if (!this.workflowEngine) { - console.log('[ResourceMonitor] Workflow engine not set, skipping workflow trigger'); + log.info('monitor', 'Workflow engine not set, skipping workflow trigger'); return; } @@ -398,14 +399,14 @@ class ResourceMonitor extends EventEmitter { this.workflowEngine.triggerForEvent(eventType, eventData) .then(results => { if (results && results.length > 0) { - console.log(`[ResourceMonitor] Triggered ${results.length} workflow(s) for ${eventType}`); + log.info('monitor', `Triggered workflows for ${eventType}`, { count: results.length }); } }) .catch(err => { - console.error('[ResourceMonitor] Workflow trigger error:', err.message); + log.error('monitor', err, { phase: 'workflowTrigger' }); }); } catch (error) { - console.error('[ResourceMonitor] Error triggering workflows:', error.message); + log.error('monitor', error, { phase: 'workflowTrigger' }); } } @@ -414,7 +415,7 @@ class ResourceMonitor extends EventEmitter { */ setWorkflowEngine(workflowEngine) { this.workflowEngine = workflowEngine; - console.log('[ResourceMonitor] Workflow engine configured'); + log.info('monitor', 'Workflow engine configured'); } /** @@ -562,10 +563,10 @@ class ResourceMonitor extends EventEmitter { if (fs.existsSync(ALERT_HISTORY_FILE)) { const data = JSON.parse(fs.readFileSync(ALERT_HISTORY_FILE, 'utf8')); this.alertHistory = Array.isArray(data) ? data : []; - console.log(`[ResourceMonitor] Loaded ${this.alertHistory.length} alert history entries`); + log.info('monitor', 'Loaded alert history', { count: this.alertHistory.length }); } } catch (error) { - console.error('[ResourceMonitor] Error loading alert history:', error.message); + log.error('monitor', error, { operation: 'loadAlertHistory' }); } } @@ -576,7 +577,7 @@ class ResourceMonitor extends EventEmitter { try { fs.writeFileSync(ALERT_HISTORY_FILE, JSON.stringify(this.alertHistory, null, 2)); } catch (error) { - console.error('[ResourceMonitor] Error saving alert history:', error.message); + log.error('monitor', error, { operation: 'saveAlertHistory' }); } } @@ -606,10 +607,10 @@ class ResourceMonitor extends EventEmitter { if (fs.existsSync(STATS_FILE)) { const data = JSON.parse(fs.readFileSync(STATS_FILE, 'utf8')); this.stats = new Map(Object.entries(data)); - console.log(`[ResourceMonitor] Loaded stats for ${this.stats.size} containers`); + log.info('monitor', 'Loaded stats', { containerCount: this.stats.size }); } } catch (error) { - console.error('[ResourceMonitor] Error loading stats:', error.message); + log.error('monitor', error, { operation: 'loadStats' }); } } @@ -621,7 +622,7 @@ class ResourceMonitor extends EventEmitter { const data = Object.fromEntries(this.stats); fs.writeFileSync(STATS_FILE, JSON.stringify(data, null, 2)); } catch (error) { - console.error('[ResourceMonitor] Error saving stats:', error.message); + log.error('monitor', error, { operation: 'saveStats' }); } } @@ -633,10 +634,10 @@ class ResourceMonitor extends EventEmitter { if (fs.existsSync(ALERT_CONFIG_FILE)) { const data = JSON.parse(fs.readFileSync(ALERT_CONFIG_FILE, 'utf8')); this.alerts = new Map(Object.entries(data)); - console.log(`[ResourceMonitor] Loaded alert config for ${this.alerts.size} containers`); + log.info('monitor', 'Loaded alert config', { containerCount: this.alerts.size }); } } catch (error) { - console.error('[ResourceMonitor] Error loading alert config:', error.message); + log.error('monitor', error, { operation: 'loadAlertConfig' }); } } @@ -648,7 +649,7 @@ class ResourceMonitor extends EventEmitter { const data = Object.fromEntries(this.alerts); fs.writeFileSync(ALERT_CONFIG_FILE, JSON.stringify(data, null, 2)); } catch (error) { - console.error('[ResourceMonitor] Error saving alert config:', error.message); + log.error('monitor', error, { operation: 'saveAlertConfig' }); } } @@ -902,10 +903,10 @@ class ResourceMonitor extends EventEmitter { if (fs.existsSync(STATS_HOURLY_FILE)) { const data = JSON.parse(fs.readFileSync(STATS_HOURLY_FILE, 'utf8')); this.hourlyHistory = new Map(Object.entries(data)); - console.log(`[ResourceMonitor] Loaded hourly rollups for ${this.hourlyHistory.size} containers`); + log.info('monitor', 'Loaded hourly rollups', { containerCount: this.hourlyHistory.size }); } } catch (error) { - console.error('[ResourceMonitor] Error loading hourly stats:', error.message); + log.error('monitor', error, { operation: 'loadHourlyStats' }); } } @@ -917,7 +918,7 @@ class ResourceMonitor extends EventEmitter { const data = Object.fromEntries(this.hourlyHistory); fs.writeFileSync(STATS_HOURLY_FILE, JSON.stringify(data, null, 2)); } catch (error) { - console.error('[ResourceMonitor] Error saving hourly stats:', error.message); + log.error('monitor', error, { operation: 'saveHourlyStats' }); } } @@ -929,10 +930,10 @@ class ResourceMonitor extends EventEmitter { if (fs.existsSync(STATS_DAILY_FILE)) { const data = JSON.parse(fs.readFileSync(STATS_DAILY_FILE, 'utf8')); this.dailyHistory = new Map(Object.entries(data)); - console.log(`[ResourceMonitor] Loaded daily rollups for ${this.dailyHistory.size} containers`); + log.info('monitor', 'Loaded daily rollups', { containerCount: this.dailyHistory.size }); } } catch (error) { - console.error('[ResourceMonitor] Error loading daily stats:', error.message); + log.error('monitor', error, { operation: 'loadDailyStats' }); } } @@ -944,7 +945,7 @@ class ResourceMonitor extends EventEmitter { const data = Object.fromEntries(this.dailyHistory); fs.writeFileSync(STATS_DAILY_FILE, JSON.stringify(data, null, 2)); } catch (error) { - console.error('[ResourceMonitor] Error saving daily stats:', error.message); + log.error('monitor', error, { operation: 'saveDailyStats' }); } }