diff --git a/nodejs/package.json.in b/nodejs/package.json.in index d9fbcc9..10721d7 100644 --- a/nodejs/package.json.in +++ b/nodejs/package.json.in @@ -7,7 +7,8 @@ "stylus": "~0.53.0", "ejs": ">= 0.0.1", "socket.io": "~1.4.4", - "pty.js": "~0.3.0" + "pty.js": "~0.3.0", + "async": "~1.5.2" }, "description": "Docker as a Service", "main": "servicedock.js", diff --git a/nodejs/public/javascripts/servicedock.js b/nodejs/public/javascripts/servicedock.js index 96b9b0e..5750e43 100644 --- a/nodejs/public/javascripts/servicedock.js +++ b/nodejs/public/javascripts/servicedock.js @@ -646,6 +646,10 @@ function details(name) { showviz(docker.containers.subgraph(focused)); } +function stats(data) { + console.log("->rcv stats") +} + function images(i) { console.log("->rcv images"); docker.images.set(i); @@ -781,7 +785,7 @@ function bash_data(data) { $("#screen").append(''+ansifilter(htmlenc(data.text))+''); } $("#screen").animate({ - scrollTop: $("#screen").scrollHeight() + scrollTop: $("#screen").prop('scrollHeight') }, 500);} function overview() { @@ -814,6 +818,7 @@ function init() { .on("fail", error) .on("containers", containers) .on("images", images) + .on("stats", stats) .on("logs", logs) .on("bash-data", bash_data); start(); diff --git a/nodejs/sockets/index.js b/nodejs/sockets/index.js index 5a7a4b9..1611260 100644 --- a/nodejs/sockets/index.js +++ b/nodejs/sockets/index.js @@ -9,38 +9,53 @@ module.exports = function() { var proc = require('child_process'); function stats(ids) { - var res = []; + var res = {}; var fs = require('fs'); + var async = require('async'); var base = "/sys/fs/cgroup/"; var dataPoints = { - "cpuacct": "stat", - "memory": "usage_in_bytes", - "memory": "max_usage_in_bytes" + "cpuacct": [ + "stat" + ], + "memory": [ + "usage_in_bytes", + "max_usage_in_bytes" + ] }; - ids.forEach(function(id) { + async.each(ids, function(id, cb1) { res[id] = {}; - for (key in dataPoints) { - var file = base + key + '/docker/' + id + '/' + dataPoints[key]; - res[id][key] = {}; - fs.readFile(file, 'utf8', function(err, data) { - if (err) return; - data.trim().split('\n').forEach(function(v, i) { - var vals = v.split(' '); - switch (vals.length) { - case 1: - res[id][dataPoints[key]] = parseInt(vals[0]); - break; - case 2: - res[id][key][dataPoints[key]] = {}; - res[id][key][dataPoints[key]][vals[0]] = parseInt(vals[1]); - break; - } + async.forEachOf(dataPoints, function(val1, category, cb2) { + res[id][category] = {}; + async.each(val1, function(element, cb3) { + var file = base + category + '/docker/' + id + '/' + category + '.' + element; + res[id][category][element] = {}; + fs.readFile(file, 'utf8', function(err, data) { + if (err) {cb3(err); return} + data.trim().split('\n').forEach(function(v, i) { + var vals = v.split(' '); + switch (vals.length) { + case 1: + res[id][category][element] = vals[0]; + break; + case 2: + res[id][category][element][vals[0]] = vals[1]; + break; + } + }); + cb3(); }); + }, function(err) { + cb2(); }); - } + }, function(err) { + cb1(); + }); + }, function(err) { + if (err) return; + broadcast("stats", res); }); } - + console.log("new client"); function emit(signal, data, info) { @@ -82,7 +97,6 @@ module.exports = function() { error: error, stderr: stderr, stdout: stdout }); exec("docker inspect "+stdout.trim().replace(/\n/g, " "), containerinspect); - stats(stdout.trim().split('\n')); } function updatecontainers(error, stdout, stderr) { @@ -228,6 +242,13 @@ module.exports = function() { .on('bash-input', bash_input) .on('bash-end', bash_end); + setInterval(function() { + exec("docker ps -q --no-trunc ", function(error, stdout, stderr) { + if (error || stderr) return; // ignore + stats(stdout.trim().split('\n')); + }) + }, + 1000); }