57 lines
1.7 KiB
JavaScript
57 lines
1.7 KiB
JavaScript
// statsSocket.js
|
|
const WebSocket = require('ws');
|
|
const docker = require('../docker/dockerClient');
|
|
const calculateCPUPercent = require('../utils/calculateCPU');
|
|
|
|
let clients = new Set();
|
|
|
|
function setupWebSocket(server) {
|
|
const wss = new WebSocket.Server({ server });
|
|
wss.on('connection', (ws) => {
|
|
clients.add(ws);
|
|
ws.on('close', () => clients.delete(ws));
|
|
});
|
|
startStatsMonitoring();
|
|
}
|
|
|
|
function broadcastStats(data) {
|
|
clients.forEach(client => {
|
|
if (client.readyState === WebSocket.OPEN) {
|
|
client.send(JSON.stringify(data));
|
|
}
|
|
});
|
|
}
|
|
|
|
function startStatsMonitoring() {
|
|
setInterval(async () => {
|
|
try {
|
|
const containers = await docker.listContainers();
|
|
const statsPromises = containers.map(async (containerInfo) => {
|
|
try {
|
|
const container = docker.getContainer(containerInfo.Id);
|
|
const stats = await container.stats({ stream: false });
|
|
return {
|
|
id: containerInfo.Id,
|
|
name: containerInfo.Names[0].replace('/', ''),
|
|
stats: {
|
|
cpu_percent: calculateCPUPercent(stats),
|
|
memory: {
|
|
usage: stats.memory_stats.usage || 0,
|
|
limit: stats.memory_stats.limit || 0,
|
|
percent: stats.memory_stats.limit > 0 ? (stats.memory_stats.usage / stats.memory_stats.limit) * 100 : 0
|
|
}
|
|
}
|
|
};
|
|
} catch (error) {
|
|
return null;
|
|
}
|
|
});
|
|
const allStats = await Promise.all(statsPromises);
|
|
const validStats = allStats.filter(stat => stat !== null);
|
|
broadcastStats({ type: 'stats_update', data: validStats });
|
|
} catch (error) {}
|
|
}, 5000);
|
|
}
|
|
|
|
module.exports = setupWebSocket;
|