extended docker stats, and no longer relying on curl
This commit is contained in:
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user