extended docker stats, and no longer relying on curl

This commit is contained in:
Sebastian Hildebrandt
2016-11-02 12:25:06 +01:00
parent 645a39991b
commit 90ddf2ec96
4 changed files with 285 additions and 140 deletions
+106
View File
@@ -0,0 +1,106 @@
'use strict';
const net = require('net');
class DockerSocket {
listContainers(all, callback) {
try {
let socket = net.createConnection({path: '/var/run/docker.sock'});
let alldata = '';
socket.on("connect", () => {
socket.write('GET http:/containers/json' + (all ? "?all=1" : "") + ' HTTP/1.0\r\n\r\n');
});
socket.on("data", data => {
alldata = alldata + data.toString();
});
socket.on("error", () => {
socket = false;
callback({});
});
socket.on('end', () => {
let startbody = alldata.indexOf("\r\n\r\n");
alldata = alldata.substring(startbody, 100000).replace(/[\n\r]/g, '');
socket = false;
callback(JSON.parse(alldata));
});
} catch (err) {
callback({});
}
}
getStats(id, callback) {
id = id || '';
if (id) {
try {
let socket = net.createConnection({path: '/var/run/docker.sock'});
let alldata = '';
socket.on("connect", () => {
socket.write('GET http:/containers/' + id + '/stats?stream=0 HTTP/1.0\r\n\r\n');
});
socket.on("data", data => {
alldata = alldata + data.toString();
});
socket.on("error", () => {
socket = false;
callback({});
});
socket.on('end', () => {
let startbody = alldata.indexOf("\r\n\r\n");
alldata = alldata.substring(startbody, 100000).replace(/[\n\r]/g, '');
socket = false;
callback(JSON.parse(alldata));
});
} catch (err) {
callback({});
}
} else {
callback({});
}
}
getProcesses(id, callback) {
id = id || '';
if (id) {
try {
let socket = net.createConnection({path: '/var/run/docker.sock'});
let alldata = '';
socket.on("connect", () => {
socket.write('GET http:/containers/' + id + '/top?ps_args=-opid,ppid,pgid,vsz,time,etime,nice,ruser,user,rgroup,group,stat,rss,args HTTP/1.0\r\n\r\n');
});
socket.on("data", data => {
alldata = alldata + data.toString();
});
socket.on("error", () => {
socket = false;
callback({});
});
socket.on('end', () => {
let startbody = alldata.indexOf("\r\n\r\n");
alldata = alldata.substring(startbody, 100000).replace(/[\n\r]/g, '');
socket = false;
callback(JSON.parse(alldata));
});
} catch (err) {
callback({});
}
} else {
callback({});
}
}
}
module.exports = DockerSocket;
+44 -16
View File
@@ -81,6 +81,7 @@
// --------------------------------
//
// version date comment
// 3.7.0 2016-11-02 extended docker stats, and no longer relying on curl (version conflicts)
// 3.6.0 2016-09-16 added versions (kernel, ssl, node, npm, pm2, ...)
// 3.5.1 2016-09-14 bugfix graphics info
// 3.5.0 2016-09-14 added graphics info (controller, display)
@@ -124,7 +125,10 @@ const os = require('os')
, exec = require('child_process').exec
, execSync = require('child_process').execSync
, fs = require('fs')
, lib_version = require('../package.json').version;
, lib_version = require('../package.json').version
, DockerSocket = require('./dockerSocket');
var _cores = 0;
var _platform = os.type();
@@ -137,6 +141,7 @@ var _fs_speed = {};
var _disk_io = {};
var _default_iface;
var _docker_container_stats = {};
var _docker_socket;
var _process_cpu = {
all: 0,
list: {},
@@ -2694,12 +2699,20 @@ function dockerContainers(all, callback) {
if (callback) { callback(NOT_SUPPORTED) }
reject(error);
}
let cmd = "curl --unix-socket /var/run/docker.sock http:/containers/json" + (all ? "?all=1" : "");
exec(cmd, function (error, stdout) {
if (!error) {
try {
let jsonString = stdout.toString();
var docker_containers = JSON.parse(jsonString);
if (!_docker_socket) {
_docker_socket = new DockerSocket();
}
_docker_socket.listContainers(all, data => {
var docker_containers = {};
// let cmd = "curl --unix-socket /var/run/docker.sock http:/containers/json" + (all ? "?all=1" : "");
// exec(cmd, function (error, stdout) {
// if (!error) {
try {
// let jsonString = stdout.toString();
// var docker_containers = JSON.parse(jsonString);
docker_containers = data;
if (docker_containers && Object.prototype.toString.call(docker_containers) === '[object Array]' && docker_containers.length > 0) {
docker_containers.forEach(function (element) {
/**
@@ -2736,7 +2749,7 @@ function dockerContainers(all, callback) {
}
} catch (err) {
}
}
// }
// GC in _docker_container_stats
for (var key in _docker_container_stats) {
@@ -2862,12 +2875,19 @@ function dockerContainerStats(containerID, callback) {
reject(error);
}
if (containerID) {
let cmd = "curl --unix-socket /var/run/docker.sock http:/containers/" + containerID + "/stats?stream=0";
exec(cmd, function (error, stdout) {
if (!error) {
let jsonString = stdout.toString();
if (!_docker_socket) {
_docker_socket = new DockerSocket();
}
_docker_socket.getStats(containerID, data => {
// let cmd = "curl --unix-socket /var/run/docker.sock http:/containers/" + containerID + "/stats?stream=0";
// exec(cmd, function (error, stdout) {
// if (!error) {
// let jsonString = stdout.toString();
try {
let stats = JSON.parse(jsonString);
// let stats = JSON.parse(jsonString);
let stats = data;
/**
* @namespace
* @property {Object} memory_stats
@@ -2886,12 +2906,16 @@ function dockerContainerStats(containerID, callback) {
result.mem_percent = (stats.memory_stats && stats.memory_stats.usage && stats.memory_stats.limit ? stats.memory_stats.usage / stats.memory_stats.limit * 100.0 : 0);
result.cpu_percent = (stats.cpu_stats ? docker_calcCPUPercent(stats.cpu_stats, containerID) : 0);
result.pids = (stats.pids_stats && stats.pids_stats.current ? stats.pids_stats.current : 0);
if (stats.networks) result.netIO = docker_calcNetworkIO(stats.networks);
if (stats.blkio_stats)result.blockIO = docker_calcBlockIO(stats.blkio_stats);
if (stats.networks) result.netIO = docker_calcNetworkIO(stats.networks);
if (stats.blkio_stats) result.blockIO = docker_calcBlockIO(stats.blkio_stats);
result.cpu_stats = (stats.cpu_stats ? stats.cpu_stats : {});
result.precpu_stats = (stats.precpu_stats ? stats.precpu_stats : {});
result.memory_stats = (stats.memory_stats ? stats.memory_stats : {});
result.networks = (stats.networks ? stats.networks : {});
}
} catch (err) {
}
}
// }
if (callback) { callback(result) }
resolve(result);
});
@@ -2926,6 +2950,10 @@ function dockerAll(callback) {
element.pids = res.pids;
element.netIO = res.netIO;
element.blockIO = res.blockIO;
element.cpu_stats = res.cpu_stats;
element.precpu_stats = res.precpu_stats;
element.memory_stats = res.memory_stats;
element.networks = res.networks;
// all done??
l -= 1;