-
8,241
+
8,354
Lines of code
diff --git a/lib/docker.js b/lib/docker.js
index 4ef0e79..3934b41 100644
--- a/lib/docker.js
+++ b/lib/docker.js
@@ -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);
diff --git a/lib/dockerSocket.js b/lib/dockerSocket.js
index 0c6bfb2..fa3b7e3 100644
--- a/lib/dockerSocket.js
+++ b/lib/dockerSocket.js
@@ -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) {
diff --git a/lib/index.d.ts b/lib/index.d.ts
index 9188456..4c69072 100644
--- a/lib/index.d.ts
+++ b/lib/index.d.ts
@@ -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,