From ef45321c787553b3f8b351ebeb9349c4882e1510 Mon Sep 17 00:00:00 2001 From: Heiner Date: Thu, 23 Apr 2020 20:35:55 +0200 Subject: [PATCH] Fixed compatibility with current Docker versions --- .gitignore | 2 ++ httpd.js | 1 - stats.js | 66 +++++++++++++++++++++--------------------------------- 3 files changed, 27 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index 7ee311a..e019949 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules/ db/ +test/ +package-lock.json \ No newline at end of file diff --git a/httpd.js b/httpd.js index fbed9e0..ee04a27 100644 --- a/httpd.js +++ b/httpd.js @@ -2,7 +2,6 @@ var DB_FILE = 'db/stats.db'; var sqlite3 = require('sqlite3'); var bodyParser = require('body-parser'); -var exec = require('child_process').execFileSync; var moment = require('moment'); var express = require("express"); diff --git a/stats.js b/stats.js index 95b2650..d9dce1a 100644 --- a/stats.js +++ b/stats.js @@ -9,33 +9,11 @@ var moment = require('moment'); var fs = require('fs'); 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 0 && columns.length >= 2) { - containers[columns[0]] = { - 'name': columns[columns.length-1] - }; - } - } - return containers; -}; - var getBytes = function(s) { - var tokens = s.split(' '); var bytes = 0; - var unit = tokens[1].trim(); - var value = tokens[0].trim(); - if (unit == 'kB') { + var value = s.match(/\d+/g)[0]; + var unit = s.match(/[a-zA-Z]+/g)[0].toUpperCase(); + if (unit == 'KB') { return value*1024; } else if (unit == 'MB') { return value*1024*1024; @@ -47,12 +25,13 @@ var getBytes = function(s) { return bytes; }; -var addStatsToContainerList = function(containers) { +var getContainers = function() { + var containers = {}; var out; if (TEST) { out = fs.readFileSync('test/docker_stats.txt', {encoding: 'utf-8'}); } 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'); for (var i=0; i= 6) { var containerId = columns[0]; if (containerId) { - var cpu = columns[1]; - var mem = columns[2]; + var name = columns[1]; + var cpu = columns[2]; + var mem = columns[3]; var net = columns[4]; var block = columns[5]; - - containers[containerId].cpu = cpu.replace('%', ''); - containers[containerId].mem = getBytes(mem.split(' / ')[0]); - containers[containerId].net = { - 'in': getBytes(net.split(' / ')[0]), - 'out': getBytes(net.split(' / ')[1]) - }; - containers[containerId].block = { - 'in': getBytes(block.split(' / ')[0]), - 'out': getBytes(block.split(' / ')[1]) + + containers[containerId] = { + 'name': name, + 'cpu': cpu.replace('%', ''), + 'mem': getBytes(mem.split(' / ')[0]), + 'net': { + 'in': getBytes(net.split(' / ')[0]), + 'out': getBytes(net.split(' / ')[1]) + }, + 'block': { + 'in': getBytes(block.split(' / ')[0]), + 'out': getBytes(block.split(' / ')[1]) + } }; } } } } + return containers; }; var getCreateContainerId = function(name, cid, cb) { @@ -115,8 +99,8 @@ var writeStats = function(containers) { var main = function() { var containers = getContainers(); - addStatsToContainerList(containers); writeStats(containers); + setTimeout(main, INTERVAL*1000); }; db.run("PRAGMA journal_mode=WAL"); @@ -135,4 +119,4 @@ db.run("CREATE TABLE IF NOT EXISTS stats ( " + "block_in REAL NOT NULL, " + "block_out REAL NOT NULL)"); -setInterval(main, INTERVAL*1000); +main();