From 39f242985b7d0886a1f99f3dbe7a9145d60e66fe Mon Sep 17 00:00:00 2001 From: vince Date: Fri, 2 Mar 2018 17:18:23 +0100 Subject: [PATCH 1/8] feature: add inspect feature, on runtime --- bin/pm2 | 7 +++++++ lib/API/Extra.js | 20 +++++++++++++++++++- lib/ProcessContainerFork.js | 20 ++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/bin/pm2 b/bin/pm2 index 809177b03..eebc8da68 100755 --- a/bin/pm2 +++ b/bin/pm2 @@ -396,6 +396,13 @@ commander.command('id ') pm2.getProcessIdByName(name); }); +// Inspect a process +commander.command('inspect ') + .description('inspect a process') + .action(function(cmd) { + pm2.inspect(cmd, commander); + }); + // // Stop and delete a process by name from database // diff --git a/lib/API/Extra.js b/lib/API/Extra.js index 00f445dde..6f70d5490 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -15,6 +15,7 @@ var fs = require('fs'); var fmt = require('../tools/fmt.js'); var moment = require('moment'); var pkg = require('../../package.json'); +const semver = require('semver'); module.exports = function(CLI) { @@ -38,7 +39,6 @@ module.exports = function(CLI) { */ CLI.prototype.report = function() { var that = this; - var semver = require('semver'); function reporting(cb) { @@ -639,4 +639,22 @@ module.exports = function(CLI) { launchMonitor(); }; + + CLI.prototype.inspect = function(app_name, cb) { + const that = this; + if(semver.satisfies(process.versions.node, '>= 8.0.0')) { + this.trigger(app_name, 'internal:inspect', function (err, res) { + if(res[0].data.return === '') { + Common.printOut(`Inspect disabled on ${app_name}`); + } else { + Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); + } + + that.exitCli(cst.SUCCESS_EXIT); + }); + } else { + Common.printOut('Inspect is available for node version >=8.x !'); + that.exitCli(cst.SUCCESS_EXIT); + } + }; }; diff --git a/lib/ProcessContainerFork.js b/lib/ProcessContainerFork.js index 6d1b0cebb..189851e9a 100644 --- a/lib/ProcessContainerFork.js +++ b/lib/ProcessContainerFork.js @@ -1,17 +1,33 @@ -/** + /** * Copyright 2013 the PM2 project authors. All rights reserved. * Use of this source code is governed by a license that * can be found in the LICENSE file. */ // Inject custom modules if (process.env.pmx !== 'false') { - require('pmx').init({ + const pmx = require('pmx'); + pmx.init({ transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, http: process.env.km_link === 'true' || false, v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, deep_metrics: process.env.deep_monitoring === 'true' || false }); + + if(require('semver').satisfies(process.versions.node, '>= 8.0.0')) { + var url = ''; + pmx.action('internal:inspect', function(reply) { + const inspector = require('inspector'); + if(url === '') { + inspector.open(); + url = inspector.url(); + } else { + inspector.close(); + url = ''; + } + reply(url); + }); + } } if (typeof(process.env.source_map_support) != "undefined" && From 33d1fb3762840795db5921683806d6b62ff6dc8a Mon Sep 17 00:00:00 2001 From: vince Date: Fri, 2 Mar 2018 17:43:47 +0100 Subject: [PATCH 2/8] feature: add inspect feature, on runtime for cluster app --- lib/API/Extra.js | 2 +- lib/ProcessContainer.js | 10 +--------- lib/ProcessContainerFork.js | 26 +------------------------- lib/ProcessUtils.js | 29 +++++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 35 deletions(-) create mode 100644 lib/ProcessUtils.js diff --git a/lib/API/Extra.js b/lib/API/Extra.js index 6f70d5490..60ced15dd 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -644,7 +644,7 @@ module.exports = function(CLI) { const that = this; if(semver.satisfies(process.versions.node, '>= 8.0.0')) { this.trigger(app_name, 'internal:inspect', function (err, res) { - if(res[0].data.return === '') { + if(res && res[0].data.return === '') { Common.printOut(`Inspect disabled on ${app_name}`); } else { Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); diff --git a/lib/ProcessContainer.js b/lib/ProcessContainer.js index db9540dd6..0d739bac9 100644 --- a/lib/ProcessContainer.js +++ b/lib/ProcessContainer.js @@ -30,15 +30,7 @@ delete process.env.pm2_env; (function ProcessContainer() { var fs = require('fs'); - if (process.env.pmx !== 'false') { - require('pmx').init({ - transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, - http: process.env.km_link === 'true' || false, - v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, - event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, - deep_metrics: process.env.deep_monitoring === 'true' || false - }); - } + require('./ProcessUtils').injectModules(); var stdFile = pm2_env.pm_log_path; var outFile = pm2_env.pm_out_log_path; diff --git a/lib/ProcessContainerFork.js b/lib/ProcessContainerFork.js index 189851e9a..59c45d3fb 100644 --- a/lib/ProcessContainerFork.js +++ b/lib/ProcessContainerFork.js @@ -4,31 +4,7 @@ * can be found in the LICENSE file. */ // Inject custom modules -if (process.env.pmx !== 'false') { - const pmx = require('pmx'); - pmx.init({ - transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, - http: process.env.km_link === 'true' || false, - v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, - event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, - deep_metrics: process.env.deep_monitoring === 'true' || false - }); - - if(require('semver').satisfies(process.versions.node, '>= 8.0.0')) { - var url = ''; - pmx.action('internal:inspect', function(reply) { - const inspector = require('inspector'); - if(url === '') { - inspector.open(); - url = inspector.url(); - } else { - inspector.close(); - url = ''; - } - reply(url); - }); - } -} +require('./ProcessUtils').injectModules(); if (typeof(process.env.source_map_support) != "undefined" && process.env.source_map_support !== "false") { diff --git a/lib/ProcessUtils.js b/lib/ProcessUtils.js new file mode 100644 index 000000000..3e90117e3 --- /dev/null +++ b/lib/ProcessUtils.js @@ -0,0 +1,29 @@ +module.exports = { + injectModules: function() { + if (process.env.pmx !== 'false') { + const pmx = require('pmx'); + pmx.init({ + transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, + http: process.env.km_link === 'true' || false, + v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, + event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, + deep_metrics: process.env.deep_monitoring === 'true' || false + }); + + if(require('semver').satisfies(process.versions.node, '>= 8.0.0')) { + var url = ''; + pmx.action('internal:inspect', function(reply) { + const inspector = require('inspector'); + if(url === '') { + inspector.open(); + url = inspector.url(); + } else { + inspector.close(); + url = ''; + } + reply(url); + }); + } + } + } +}; From dacc654207cbe494af0d12a3f9f27c3b16541802 Mon Sep 17 00:00:00 2001 From: vince Date: Mon, 5 Mar 2018 10:49:32 +0100 Subject: [PATCH 3/8] fix: improve error message if action has failed --- lib/API/Extra.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/API/Extra.js b/lib/API/Extra.js index 60ced15dd..c6c057ec1 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -644,10 +644,15 @@ module.exports = function(CLI) { const that = this; if(semver.satisfies(process.versions.node, '>= 8.0.0')) { this.trigger(app_name, 'internal:inspect', function (err, res) { - if(res && res[0].data.return === '') { - Common.printOut(`Inspect disabled on ${app_name}`); + + if(res && res[0]) { + if (res[0].data.return === '') { + Common.printOut(`Inspect disabled on ${app_name}`); + } else { + Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); + } } else { - Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); + Common.printOut(`Impossible to enabled inspect mode on ${app_name} !!!`); } that.exitCli(cst.SUCCESS_EXIT); From 5f78ecbf90f9f46a7feb2a169968e86b0ecac91e Mon Sep 17 00:00:00 2001 From: vince Date: Mon, 5 Mar 2018 11:14:11 +0100 Subject: [PATCH 4/8] chore: wording on error message --- lib/API/Extra.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/API/Extra.js b/lib/API/Extra.js index c6c057ec1..cf7a23fcf 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -652,7 +652,7 @@ module.exports = function(CLI) { Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); } } else { - Common.printOut(`Impossible to enabled inspect mode on ${app_name} !!!`); + Common.printOut(`Unable to activate inspect mode on ${app_name} !!!`); } that.exitCli(cst.SUCCESS_EXIT); From c3ae6aa8b45a5e8bcf408c07473d19379a10c53e Mon Sep 17 00:00:00 2001 From: vince Date: Fri, 2 Mar 2018 17:18:23 +0100 Subject: [PATCH 5/8] feature: add inspect feature, on runtime --- bin/pm2 | 7 +++++++ lib/API/Extra.js | 20 +++++++++++++++++++- lib/ProcessContainerFork.js | 20 ++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/bin/pm2 b/bin/pm2 index 9bcae4e6b..840dc84c6 100755 --- a/bin/pm2 +++ b/bin/pm2 @@ -396,6 +396,13 @@ commander.command('id ') pm2.getProcessIdByName(name); }); +// Inspect a process +commander.command('inspect ') + .description('inspect a process') + .action(function(cmd) { + pm2.inspect(cmd, commander); + }); + // // Stop and delete a process by name from database // diff --git a/lib/API/Extra.js b/lib/API/Extra.js index 00f445dde..6f70d5490 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -15,6 +15,7 @@ var fs = require('fs'); var fmt = require('../tools/fmt.js'); var moment = require('moment'); var pkg = require('../../package.json'); +const semver = require('semver'); module.exports = function(CLI) { @@ -38,7 +39,6 @@ module.exports = function(CLI) { */ CLI.prototype.report = function() { var that = this; - var semver = require('semver'); function reporting(cb) { @@ -639,4 +639,22 @@ module.exports = function(CLI) { launchMonitor(); }; + + CLI.prototype.inspect = function(app_name, cb) { + const that = this; + if(semver.satisfies(process.versions.node, '>= 8.0.0')) { + this.trigger(app_name, 'internal:inspect', function (err, res) { + if(res[0].data.return === '') { + Common.printOut(`Inspect disabled on ${app_name}`); + } else { + Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); + } + + that.exitCli(cst.SUCCESS_EXIT); + }); + } else { + Common.printOut('Inspect is available for node version >=8.x !'); + that.exitCli(cst.SUCCESS_EXIT); + } + }; }; diff --git a/lib/ProcessContainerFork.js b/lib/ProcessContainerFork.js index 6d1b0cebb..189851e9a 100644 --- a/lib/ProcessContainerFork.js +++ b/lib/ProcessContainerFork.js @@ -1,17 +1,33 @@ -/** + /** * Copyright 2013 the PM2 project authors. All rights reserved. * Use of this source code is governed by a license that * can be found in the LICENSE file. */ // Inject custom modules if (process.env.pmx !== 'false') { - require('pmx').init({ + const pmx = require('pmx'); + pmx.init({ transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, http: process.env.km_link === 'true' || false, v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, deep_metrics: process.env.deep_monitoring === 'true' || false }); + + if(require('semver').satisfies(process.versions.node, '>= 8.0.0')) { + var url = ''; + pmx.action('internal:inspect', function(reply) { + const inspector = require('inspector'); + if(url === '') { + inspector.open(); + url = inspector.url(); + } else { + inspector.close(); + url = ''; + } + reply(url); + }); + } } if (typeof(process.env.source_map_support) != "undefined" && From e1f7224d9bc0c627a42f813d651a06c71d43c67c Mon Sep 17 00:00:00 2001 From: vince Date: Fri, 2 Mar 2018 17:43:47 +0100 Subject: [PATCH 6/8] feature: add inspect feature, on runtime for cluster app --- lib/API/Extra.js | 2 +- lib/ProcessContainer.js | 10 +--------- lib/ProcessContainerFork.js | 26 +------------------------- lib/ProcessUtils.js | 29 +++++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 35 deletions(-) create mode 100644 lib/ProcessUtils.js diff --git a/lib/API/Extra.js b/lib/API/Extra.js index 6f70d5490..60ced15dd 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -644,7 +644,7 @@ module.exports = function(CLI) { const that = this; if(semver.satisfies(process.versions.node, '>= 8.0.0')) { this.trigger(app_name, 'internal:inspect', function (err, res) { - if(res[0].data.return === '') { + if(res && res[0].data.return === '') { Common.printOut(`Inspect disabled on ${app_name}`); } else { Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); diff --git a/lib/ProcessContainer.js b/lib/ProcessContainer.js index db9540dd6..0d739bac9 100644 --- a/lib/ProcessContainer.js +++ b/lib/ProcessContainer.js @@ -30,15 +30,7 @@ delete process.env.pm2_env; (function ProcessContainer() { var fs = require('fs'); - if (process.env.pmx !== 'false') { - require('pmx').init({ - transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, - http: process.env.km_link === 'true' || false, - v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, - event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, - deep_metrics: process.env.deep_monitoring === 'true' || false - }); - } + require('./ProcessUtils').injectModules(); var stdFile = pm2_env.pm_log_path; var outFile = pm2_env.pm_out_log_path; diff --git a/lib/ProcessContainerFork.js b/lib/ProcessContainerFork.js index 189851e9a..59c45d3fb 100644 --- a/lib/ProcessContainerFork.js +++ b/lib/ProcessContainerFork.js @@ -4,31 +4,7 @@ * can be found in the LICENSE file. */ // Inject custom modules -if (process.env.pmx !== 'false') { - const pmx = require('pmx'); - pmx.init({ - transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, - http: process.env.km_link === 'true' || false, - v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, - event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, - deep_metrics: process.env.deep_monitoring === 'true' || false - }); - - if(require('semver').satisfies(process.versions.node, '>= 8.0.0')) { - var url = ''; - pmx.action('internal:inspect', function(reply) { - const inspector = require('inspector'); - if(url === '') { - inspector.open(); - url = inspector.url(); - } else { - inspector.close(); - url = ''; - } - reply(url); - }); - } -} +require('./ProcessUtils').injectModules(); if (typeof(process.env.source_map_support) != "undefined" && process.env.source_map_support !== "false") { diff --git a/lib/ProcessUtils.js b/lib/ProcessUtils.js new file mode 100644 index 000000000..3e90117e3 --- /dev/null +++ b/lib/ProcessUtils.js @@ -0,0 +1,29 @@ +module.exports = { + injectModules: function() { + if (process.env.pmx !== 'false') { + const pmx = require('pmx'); + pmx.init({ + transactions: (process.env.km_link === 'true' && (process.env.trace === 'true' || process.env.deep_monitoring === 'true')) || false, + http: process.env.km_link === 'true' || false, + v8: process.env.v8 === 'true' || process.env.deep_monitoring === 'true' || false, + event_loop_dump: process.env.event_loop_inspector === 'true' || process.env.deep_monitoring === 'true' || false, + deep_metrics: process.env.deep_monitoring === 'true' || false + }); + + if(require('semver').satisfies(process.versions.node, '>= 8.0.0')) { + var url = ''; + pmx.action('internal:inspect', function(reply) { + const inspector = require('inspector'); + if(url === '') { + inspector.open(); + url = inspector.url(); + } else { + inspector.close(); + url = ''; + } + reply(url); + }); + } + } + } +}; From d9f44f170f115c2d6dfb6a7fe71dc31bd7fb66fb Mon Sep 17 00:00:00 2001 From: vince Date: Mon, 5 Mar 2018 10:49:32 +0100 Subject: [PATCH 7/8] fix: improve error message if action has failed --- lib/API/Extra.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/API/Extra.js b/lib/API/Extra.js index 60ced15dd..c6c057ec1 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -644,10 +644,15 @@ module.exports = function(CLI) { const that = this; if(semver.satisfies(process.versions.node, '>= 8.0.0')) { this.trigger(app_name, 'internal:inspect', function (err, res) { - if(res && res[0].data.return === '') { - Common.printOut(`Inspect disabled on ${app_name}`); + + if(res && res[0]) { + if (res[0].data.return === '') { + Common.printOut(`Inspect disabled on ${app_name}`); + } else { + Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); + } } else { - Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); + Common.printOut(`Impossible to enabled inspect mode on ${app_name} !!!`); } that.exitCli(cst.SUCCESS_EXIT); From c251c8c97e6f18aae584cac6b7f3c83cf4f2de9c Mon Sep 17 00:00:00 2001 From: vince Date: Mon, 5 Mar 2018 11:14:11 +0100 Subject: [PATCH 8/8] chore: wording on error message --- lib/API/Extra.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/API/Extra.js b/lib/API/Extra.js index c6c057ec1..cf7a23fcf 100644 --- a/lib/API/Extra.js +++ b/lib/API/Extra.js @@ -652,7 +652,7 @@ module.exports = function(CLI) { Common.printOut(`Inspect enabled on ${app_name} => go to chrome : chrome://inspect !!!`); } } else { - Common.printOut(`Impossible to enabled inspect mode on ${app_name} !!!`); + Common.printOut(`Unable to activate inspect mode on ${app_name} !!!`); } that.exitCli(cst.SUCCESS_EXIT);