bitstream/ws/statsSocket.js

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;