Fixed compatibility with current Docker versions
rodzic
eb665148ba
commit
ef45321c78
|
@ -1,2 +1,4 @@
|
||||||
node_modules/
|
node_modules/
|
||||||
db/
|
db/
|
||||||
|
test/
|
||||||
|
package-lock.json
|
1
httpd.js
1
httpd.js
|
@ -2,7 +2,6 @@ var DB_FILE = 'db/stats.db';
|
||||||
|
|
||||||
var sqlite3 = require('sqlite3');
|
var sqlite3 = require('sqlite3');
|
||||||
var bodyParser = require('body-parser');
|
var bodyParser = require('body-parser');
|
||||||
var exec = require('child_process').execFileSync;
|
|
||||||
var moment = require('moment');
|
var moment = require('moment');
|
||||||
var express = require("express");
|
var express = require("express");
|
||||||
|
|
||||||
|
|
66
stats.js
66
stats.js
|
@ -9,33 +9,11 @@ var moment = require('moment');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var db = new sqlite3.Database(DB_FILE);
|
var db = new sqlite3.Database(DB_FILE);
|
||||||
|
|
||||||
var getContainers = function() {
|
|
||||||
var containers = {};
|
|
||||||
var out;
|
|
||||||
if (TEST) {
|
|
||||||
out = fs.readFileSync('test/docker_ps.txt', {encoding: 'utf-8'});
|
|
||||||
} else {
|
|
||||||
out = spawn(DOCKER, ['ps', '-a']).stdout.toString();
|
|
||||||
}
|
|
||||||
var lines = out.split('\n');
|
|
||||||
for (var i=0; i<lines.length; i++) {
|
|
||||||
var line = lines[i];
|
|
||||||
var columns = line.split(/\s{3,}/g);
|
|
||||||
if (i > 0 && columns.length >= 2) {
|
|
||||||
containers[columns[0]] = {
|
|
||||||
'name': columns[columns.length-1]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return containers;
|
|
||||||
};
|
|
||||||
|
|
||||||
var getBytes = function(s) {
|
var getBytes = function(s) {
|
||||||
var tokens = s.split(' ');
|
|
||||||
var bytes = 0;
|
var bytes = 0;
|
||||||
var unit = tokens[1].trim();
|
var value = s.match(/\d+/g)[0];
|
||||||
var value = tokens[0].trim();
|
var unit = s.match(/[a-zA-Z]+/g)[0].toUpperCase();
|
||||||
if (unit == 'kB') {
|
if (unit == 'KB') {
|
||||||
return value*1024;
|
return value*1024;
|
||||||
} else if (unit == 'MB') {
|
} else if (unit == 'MB') {
|
||||||
return value*1024*1024;
|
return value*1024*1024;
|
||||||
|
@ -47,12 +25,13 @@ var getBytes = function(s) {
|
||||||
return bytes;
|
return bytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
var addStatsToContainerList = function(containers) {
|
var getContainers = function() {
|
||||||
|
var containers = {};
|
||||||
var out;
|
var out;
|
||||||
if (TEST) {
|
if (TEST) {
|
||||||
out = fs.readFileSync('test/docker_stats.txt', {encoding: 'utf-8'});
|
out = fs.readFileSync('test/docker_stats.txt', {encoding: 'utf-8'});
|
||||||
} else {
|
} else {
|
||||||
out = spawn(DOCKER, ['stats', '-a', '--no-stream']).stdout.toString();
|
out = spawn(DOCKER, ['stats', '-a', '--no-stream', '--format', 'table {{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}']).stdout.toString();
|
||||||
}
|
}
|
||||||
var lines = out.split('\n');
|
var lines = out.split('\n');
|
||||||
for (var i=0; i<lines.length; i++) {
|
for (var i=0; i<lines.length; i++) {
|
||||||
|
@ -62,25 +41,30 @@ var addStatsToContainerList = function(containers) {
|
||||||
if (columns.length >= 6) {
|
if (columns.length >= 6) {
|
||||||
var containerId = columns[0];
|
var containerId = columns[0];
|
||||||
if (containerId) {
|
if (containerId) {
|
||||||
var cpu = columns[1];
|
var name = columns[1];
|
||||||
var mem = columns[2];
|
var cpu = columns[2];
|
||||||
|
var mem = columns[3];
|
||||||
var net = columns[4];
|
var net = columns[4];
|
||||||
var block = columns[5];
|
var block = columns[5];
|
||||||
|
|
||||||
containers[containerId].cpu = cpu.replace('%', '');
|
containers[containerId] = {
|
||||||
containers[containerId].mem = getBytes(mem.split(' / ')[0]);
|
'name': name,
|
||||||
containers[containerId].net = {
|
'cpu': cpu.replace('%', ''),
|
||||||
'in': getBytes(net.split(' / ')[0]),
|
'mem': getBytes(mem.split(' / ')[0]),
|
||||||
'out': getBytes(net.split(' / ')[1])
|
'net': {
|
||||||
};
|
'in': getBytes(net.split(' / ')[0]),
|
||||||
containers[containerId].block = {
|
'out': getBytes(net.split(' / ')[1])
|
||||||
'in': getBytes(block.split(' / ')[0]),
|
},
|
||||||
'out': getBytes(block.split(' / ')[1])
|
'block': {
|
||||||
|
'in': getBytes(block.split(' / ')[0]),
|
||||||
|
'out': getBytes(block.split(' / ')[1])
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return containers;
|
||||||
};
|
};
|
||||||
|
|
||||||
var getCreateContainerId = function(name, cid, cb) {
|
var getCreateContainerId = function(name, cid, cb) {
|
||||||
|
@ -115,8 +99,8 @@ var writeStats = function(containers) {
|
||||||
|
|
||||||
var main = function() {
|
var main = function() {
|
||||||
var containers = getContainers();
|
var containers = getContainers();
|
||||||
addStatsToContainerList(containers);
|
|
||||||
writeStats(containers);
|
writeStats(containers);
|
||||||
|
setTimeout(main, INTERVAL*1000);
|
||||||
};
|
};
|
||||||
|
|
||||||
db.run("PRAGMA journal_mode=WAL");
|
db.run("PRAGMA journal_mode=WAL");
|
||||||
|
@ -135,4 +119,4 @@ db.run("CREATE TABLE IF NOT EXISTS stats ( " +
|
||||||
"block_in REAL NOT NULL, " +
|
"block_in REAL NOT NULL, " +
|
||||||
"block_out REAL NOT NULL)");
|
"block_out REAL NOT NULL)");
|
||||||
|
|
||||||
setInterval(main, INTERVAL*1000);
|
main();
|
||||||
|
|
Ładowanie…
Reference in New Issue