dockerContainers() dockerStats() added restartCount
This commit is contained in:
+132
-64
@@ -27,6 +27,7 @@ let _docker_last_read = 0;
|
||||
// --------------------------
|
||||
// get containers (parameter all: get also inactive/exited containers)
|
||||
|
||||
|
||||
function dockerContainers(all, callback) {
|
||||
|
||||
function inContainers(containers, id) {
|
||||
@@ -53,63 +54,123 @@ function dockerContainers(all, callback) {
|
||||
if (!_docker_socket) {
|
||||
_docker_socket = new DockerSocket();
|
||||
}
|
||||
const workload = [];
|
||||
|
||||
_docker_socket.listContainers(all, data => {
|
||||
let docker_containers = {};
|
||||
try {
|
||||
docker_containers = data;
|
||||
if (docker_containers && Object.prototype.toString.call(docker_containers) === '[object Array]' && docker_containers.length > 0) {
|
||||
// GC in _docker_container_stats
|
||||
for (let key in _docker_container_stats) {
|
||||
if (_docker_container_stats.hasOwnProperty(key)) {
|
||||
if (!inContainers(docker_containers, key)) delete _docker_container_stats[key];
|
||||
}
|
||||
}
|
||||
|
||||
docker_containers.forEach(function (element) {
|
||||
/**
|
||||
* @namespace
|
||||
* @property {string} Id
|
||||
* @property {string} Name
|
||||
* @property {string} Image
|
||||
* @property {string} ImageID
|
||||
* @property {string} Command
|
||||
* @property {number} Created
|
||||
* @property {string} State
|
||||
* @property {Array} Names
|
||||
* @property {Array} Ports
|
||||
* @property {Array} Mounts
|
||||
*/
|
||||
|
||||
if (element.Names && Object.prototype.toString.call(element.Names) === '[object Array]' && element.Names.length > 0) {
|
||||
element.Name = element.Names[0].replace(/^\/|\/$/g, '');
|
||||
}
|
||||
result.push({
|
||||
id: element.Id,
|
||||
name: element.Name,
|
||||
image: element.Image,
|
||||
imageID: element.ImageID,
|
||||
command: element.Command,
|
||||
created: element.Created,
|
||||
state: element.State,
|
||||
ports: element.Ports,
|
||||
mounts: element.Mounts,
|
||||
// hostconfig: element.HostConfig,
|
||||
// network: element.NetworkSettings
|
||||
});
|
||||
workload.push(dockerContainerInspect(element.Id.trim(), element));
|
||||
// result.push({
|
||||
// id: element.Id,
|
||||
// name: element.Name,
|
||||
// image: element.Image,
|
||||
// imageID: element.ImageID,
|
||||
// command: element.Command,
|
||||
// created: element.Created,
|
||||
// state: element.State,
|
||||
// ports: element.Ports,
|
||||
// mounts: element.Mounts,
|
||||
// // hostconfig: element.HostConfig,
|
||||
// // network: element.NetworkSettings
|
||||
// });
|
||||
});
|
||||
if (workload.length) {
|
||||
Promise.all(
|
||||
workload
|
||||
).then(data => {
|
||||
if (callback) { callback(data); }
|
||||
resolve(data);
|
||||
});
|
||||
} else {
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
util.noop();
|
||||
}
|
||||
// }
|
||||
|
||||
// GC in _docker_container_stats
|
||||
for (let key in _docker_container_stats) {
|
||||
if (_docker_container_stats.hasOwnProperty(key)) {
|
||||
if (!inContainers(docker_containers, key)) delete _docker_container_stats[key];
|
||||
// GC in _docker_container_stats
|
||||
for (let key in _docker_container_stats) {
|
||||
if (_docker_container_stats.hasOwnProperty(key)) {
|
||||
if (!inContainers(docker_containers, key)) delete _docker_container_stats[key];
|
||||
}
|
||||
}
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// --------------------------
|
||||
// container inspect (for one container)
|
||||
|
||||
function dockerContainerInspect(containerID, payload) {
|
||||
containerID = containerID || '';
|
||||
let result = {
|
||||
id: containerID,
|
||||
mem_usage: 0,
|
||||
mem_limit: 0,
|
||||
mem_percent: 0,
|
||||
cpu_percent: 0,
|
||||
pids: 0,
|
||||
};
|
||||
return new Promise((resolve) => {
|
||||
process.nextTick(() => {
|
||||
if (containerID) {
|
||||
|
||||
if (!_docker_socket) {
|
||||
_docker_socket = new DockerSocket();
|
||||
}
|
||||
|
||||
_docker_socket.getInspect(containerID.trim(), data => {
|
||||
try {
|
||||
// console.log('========================================================')
|
||||
// console.log(payload)
|
||||
// console.log('---------------------------------------------')
|
||||
// console.log(data)
|
||||
// console.log('========================================================')
|
||||
|
||||
resolve({
|
||||
id: payload.Id,
|
||||
name: payload.Name,
|
||||
image: payload.Image,
|
||||
imageID: payload.ImageID,
|
||||
command: payload.Command,
|
||||
created: payload.Created,
|
||||
state: payload.State,
|
||||
restartCount: data.RestartCount || 0,
|
||||
platform: data.Platform || '',
|
||||
driver: data.Driver || '',
|
||||
ports: payload.Ports,
|
||||
mounts: payload.Mounts,
|
||||
// hostconfig: payload.HostConfig,
|
||||
// network: payload.NetworkSettings
|
||||
})
|
||||
} catch (err) {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
exports.dockerContainers = dockerContainers;
|
||||
|
||||
// --------------------------
|
||||
@@ -283,39 +344,46 @@ function dockerContainerStatsSingle(containerID) {
|
||||
_docker_socket = new DockerSocket();
|
||||
}
|
||||
|
||||
_docker_socket.getStats(containerID, data => {
|
||||
_docker_socket.getInspect(containerID, dataInspect => {
|
||||
try {
|
||||
let stats = data;
|
||||
/**
|
||||
* @namespace
|
||||
* @property {Object} memory_stats
|
||||
* @property {number} memory_stats.usage
|
||||
* @property {number} memory_stats.limit
|
||||
* @property {Object} cpu_stats
|
||||
* @property {Object} pids_stats
|
||||
* @property {number} pids_stats.current
|
||||
* @property {Object} networks
|
||||
* @property {Object} blkio_stats
|
||||
*/
|
||||
_docker_socket.getStats(containerID, data => {
|
||||
try {
|
||||
let stats = data;
|
||||
/**
|
||||
* @namespace
|
||||
* @property {Object} memory_stats
|
||||
* @property {number} memory_stats.usage
|
||||
* @property {number} memory_stats.limit
|
||||
* @property {Object} cpu_stats
|
||||
* @property {Object} pids_stats
|
||||
* @property {number} pids_stats.current
|
||||
* @property {Object} networks
|
||||
* @property {Object} blkio_stats
|
||||
*/
|
||||
|
||||
if (!stats.message) {
|
||||
result.mem_usage = (stats.memory_stats && stats.memory_stats.usage ? stats.memory_stats.usage : 0);
|
||||
result.mem_limit = (stats.memory_stats && stats.memory_stats.limit ? stats.memory_stats.limit : 0);
|
||||
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 && stats.precpu_stats ? docker_calcCPUPercent(stats.cpu_stats, stats.precpu_stats) : 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);
|
||||
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 : {});
|
||||
}
|
||||
if (!stats.message) {
|
||||
result.mem_usage = (stats.memory_stats && stats.memory_stats.usage ? stats.memory_stats.usage : 0);
|
||||
result.mem_limit = (stats.memory_stats && stats.memory_stats.limit ? stats.memory_stats.limit : 0);
|
||||
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 && stats.precpu_stats ? docker_calcCPUPercent(stats.cpu_stats, stats.precpu_stats) : 0);
|
||||
result.pids = (stats.pids_stats && stats.pids_stats.current ? stats.pids_stats.current : 0);
|
||||
result.restartCount = (dataInspect.RestartCount ? dataInspect.RestartCount : 0);
|
||||
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) {
|
||||
util.noop();
|
||||
}
|
||||
// }
|
||||
resolve(result);
|
||||
});
|
||||
} catch (err) {
|
||||
util.noop();
|
||||
}
|
||||
// }
|
||||
resolve(result);
|
||||
});
|
||||
} else {
|
||||
resolve(result);
|
||||
|
||||
@@ -95,6 +95,46 @@ class DockerSocket {
|
||||
}
|
||||
}
|
||||
|
||||
getInspect(id, callback) {
|
||||
id = id || '';
|
||||
if (id) {
|
||||
try {
|
||||
let socket = net.createConnection({ path: socketPath });
|
||||
let alldata = '';
|
||||
let data;
|
||||
|
||||
socket.on('connect', () => {
|
||||
socket.write('GET http:/containers/' + id + '/json?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 + 4);
|
||||
socket = false;
|
||||
try {
|
||||
data = JSON.parse(alldata);
|
||||
callback(data);
|
||||
} catch (err) {
|
||||
callback({});
|
||||
}
|
||||
});
|
||||
} catch (err) {
|
||||
callback({});
|
||||
}
|
||||
} else {
|
||||
callback({});
|
||||
}
|
||||
}
|
||||
|
||||
getProcesses(id, callback) {
|
||||
id = id || '';
|
||||
if (id) {
|
||||
|
||||
Vendored
+5
@@ -192,6 +192,7 @@ export namespace Systeminformation {
|
||||
logofile: string;
|
||||
serial: string;
|
||||
build: string;
|
||||
servicepack: string;
|
||||
}
|
||||
|
||||
interface UuidData {
|
||||
@@ -421,6 +422,9 @@ export namespace Systeminformation {
|
||||
command: string;
|
||||
created: number;
|
||||
state: string;
|
||||
restartCount: number;
|
||||
platform: string;
|
||||
driver: string;
|
||||
ports: number[];
|
||||
mounts: DockerContainerMountData[];
|
||||
}
|
||||
@@ -448,6 +452,7 @@ export namespace Systeminformation {
|
||||
r: number;
|
||||
w: number;
|
||||
};
|
||||
restartCount: number;
|
||||
cpu_stats: any;
|
||||
precpu_stats: any;
|
||||
memory_stats: any,
|
||||
|
||||
Reference in New Issue
Block a user