From 7c6bb314def66c49f3b7c457478c2b1d271c8666 Mon Sep 17 00:00:00 2001 From: Sebastian Hildebrandt Date: Fri, 4 Nov 2016 12:03:16 +0100 Subject: [PATCH] added dockerContainerProcesses --- CHANGELOG.md | 2 ++ README.md | 18 +++++++++- lib/docker.js | 95 +++++++++++++++++++++++++++++++++++++++++++++++---- lib/index.js | 2 ++ 4 files changed, 110 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ced00f..b5004bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ New Functions +- `dockerContainerProcesses`: returns processes for a specific docker container (new in version 3.8) - `versions`: returns object of versions - kernel, ssl, node, npm, ...(new in version 3.6) - `graphics`: returns arrays of graphics controllers and displays (new in version 3.5) - `networkInterfaceDefault`: returns default network interface (new in version 3.4) @@ -87,6 +88,7 @@ Other changes | Version | Date | Comment | | -------------- | -------------- | -------- | +| 3.8.0 | 2016-11-04 | added dockerContainerProcesses | | 3.7.1 | 2016-11-03 | code refactoring | | 3.7.0 | 2016-11-02 | extended docker stats, and no longer relying on curl | | 3.6.0 | 2016-09-14 | added versions (kernel, ssl, node, npm, pm2, ...) | diff --git a/README.md b/README.md index 9f9572e..84f79a2 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ si.cpu() ### Latest Activity +- Version 3.8.0: added dockerContainerProcesses (docker process inside container). - Version 3.7.0: extended docker stats. - Version 3.6.0: added versions (kernel, ssl, node, npm, pm2, ...). - Version 3.5.0: added graphics info (controller and display). @@ -260,7 +261,22 @@ This library is splitted in several sections: | - percpu_stats | X | X | detailed per cpu stats | | - memory_stats | X | X | detailed memory stats | | - networks | X | X | detailed network stats per interface | -| si.dockerAll(cb) | X | X | list of all containers including their stats
in one single array | +| si.dockerContainerProcesses(id, cb) | X | X | array of processes inside a container | +| - [0].pid_host | X | X | process ID (host) | +| - [0].ppid | X | X | parent process ID | +| - [0].pgid | X | X | process group ID | +| - [0].user | X | X | effective user name | +| - [0].ruser | X | X | real user name | +| - [0].group | X | X | effective group name | +| - [0].rgroup | X | X | real group name | +| - [0].stat | X | X | process state | +| - [0].time | X | X | accumulated CPU time | +| - [0].elapsed | X | X | elapsed running time | +| - [0].nice | X | X | nice value | +| - [0].rss | X | X | resident set size | +| - [0].vsz | X | X | virtual size in Kbytes | +| - [0].command | X | X | command and arguments | +| si.dockerAll(cb) | X | X | list of all containers including their stats
and processes in one single array | | si.getStaticData(cb) | X | X | all static data at once | | si.getDynamicData(srv,iface,cb) | X | X | all dynamic data at once | | si.getAllData(srv,iface,cb) | X | X | all data at once | diff --git a/lib/docker.js b/lib/docker.js index ec0ed4a..3d74609 100644 --- a/lib/docker.js +++ b/lib/docker.js @@ -204,7 +204,7 @@ function docker_calcBlockIO(blkio_stats) { } // -------------------------- -// container Stats (for one container) +// container stats (for one container) function dockerContainerStats(containerID, callback) { containerID = containerID || ''; @@ -286,6 +286,85 @@ function dockerContainerStats(containerID, callback) { exports.dockerContainerStats = dockerContainerStats; +// -------------------------- +// container processes (for one container) + +function dockerContainerProcesses(containerID, callback) { + containerID = containerID || ''; + var result = []; + return new Promise((resolve, reject) => { + process.nextTick(() => { + if (_windows) { + let error = new Error(NOT_SUPPORTED); + if (callback) { callback(NOT_SUPPORTED) } + reject(error); + } + if (containerID) { + + if (!_docker_socket) { + _docker_socket = new DockerSocket(); + } + + _docker_socket.getProcesses(containerID, data => { + /** + * @namespace + * @property {Array} Titles + * @property {Array} Processes + **/ + try { + if (data && data.Titles && data.Processes) { + let titles = data.Titles.map(function(value) { + return value.toUpperCase(); + }); + var pos_pid = titles.indexOf('PID'); + var pos_ppid = titles.indexOf('PPID'); + var pos_pgid = titles.indexOf('PGID'); + var pos_vsz = titles.indexOf('VSZ'); + var pos_time = titles.indexOf('TIME'); + var pos_elapsed = titles.indexOf('ELAPSED'); + var pos_ni = titles.indexOf('NI'); + var pos_ruser = titles.indexOf('RUSER'); + var pos_user = titles.indexOf('USER'); + var pos_rgroup = titles.indexOf('RGROUP'); + var pos_group = titles.indexOf('GROUP'); + var pos_stat = titles.indexOf('STAT'); + var pos_rss = titles.indexOf('RSS'); + var pos_command = titles.indexOf('COMMAND'); + + data.Processes.forEach(process => { + result.push({ + pid_host: (pos_pid >= 0 ? process[pos_pid] : ''), + ppid: (pos_ppid >= 0 ? process[pos_ppid] : ''), + pgid: (pos_pgid >= 0 ? process[pos_pgid] : ''), + user: (pos_user >= 0 ? process[pos_user] : ''), + ruser: (pos_ruser >= 0 ? process[pos_ruser] : ''), + group: (pos_group >= 0 ? process[pos_group] : ''), + rgroup: (pos_rgroup >= 0 ? process[pos_rgroup] : ''), + stat: (pos_stat >= 0 ? process[pos_stat] : ''), + time: (pos_time >= 0 ? process[pos_time] : ''), + elapsed: (pos_elapsed >= 0 ? process[pos_elapsed] : ''), + nice: (pos_ni >= 0 ? process[pos_ni] : ''), + rss: (pos_rss >= 0 ? process[pos_rss] : ''), + vsz: (pos_vsz >= 0 ? process[pos_vsz] : ''), + command: (pos_command >= 0 ? process[pos_command] : '') + }) + }) + } + } catch (err) { + } + if (callback) { callback(result) } + resolve(result); + }); + } else { + if (callback) { callback(result) } + resolve(result); + } + }); + }); +} + +exports.dockerContainerProcesses = dockerContainerProcesses; + function dockerAll(callback) { return new Promise((resolve, reject) => { process.nextTick(() => { @@ -312,12 +391,16 @@ function dockerAll(callback) { element.memory_stats = res.memory_stats; element.networks = res.networks; + dockerContainerProcesses(element.id).then(processes => { + element.processes = processes; + + l -= 1; + if (l == 0) { + if (callback) { callback(result) } + resolve(result); + } + }); // all done?? - l -= 1; - if (l == 0) { - if (callback) { callback(result) } - resolve(result); - } }) }) } else { diff --git a/lib/index.js b/lib/index.js index 4581c8e..0a8dfe0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -81,6 +81,7 @@ // -------------------------------- // // version date comment +// 3.8.0 2016-11-04 added dockerContainerProcesses // 3.7.1 2016-11-03 code refactoring // 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, ...) @@ -414,6 +415,7 @@ exports.inetLatency = internet.inetLatency; exports.dockerContainers = docker.dockerContainers; exports.dockerContainerStats = docker.dockerContainerStats; +exports.dockerContainerProcesses = docker.dockerContainerProcesses; exports.dockerAll = docker.dockerAll; exports.getStaticData = getStaticData;