pm2-describe.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. const Table = require('cli-tableau')
  2. const chalk = require('chalk')
  3. const UxHelpers = require('./helpers.js')
  4. const Common = require('../../Common.js')
  5. var postModuleInfos = function(module_name, human_info) {
  6. var table = new Table({
  7. style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
  8. })
  9. var disp = {}
  10. human_info.unshift(['Module name', module_name])
  11. human_info.forEach(function(info) {
  12. var obj = {}
  13. obj[chalk.bold.cyan(info[0])] = info[1]
  14. table.push(obj)
  15. })
  16. console.log()
  17. console.log(chalk.bold.inverse(' Module %s infos '), module_name)
  18. console.log(table.toString())
  19. }
  20. /**
  21. * Description
  22. * @method describeTable
  23. * @param {Object} proc process list
  24. */
  25. module.exports = function(proc) {
  26. var table = new Table({
  27. style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
  28. })
  29. var pm2_env = proc.pm2_env
  30. var created_at = 'N/A'
  31. if (pm2_env.axm_options && pm2_env.axm_options.human_info) {
  32. postModuleInfos(pm2_env.name, pm2_env.axm_options.human_info)
  33. }
  34. try {
  35. if (pm2_env.created_at != null)
  36. created_at = new Date(pm2_env.created_at).toISOString()
  37. } catch (e) {
  38. }
  39. console.log(chalk.bold.inverse(' Describing process with id %d - name %s '), pm2_env.pm_id, pm2_env.name)
  40. UxHelpers.safe_push(table,
  41. { 'status' : UxHelpers.colorStatus(pm2_env.status) },
  42. { 'name': pm2_env.name },
  43. { 'namespace': pm2_env.namespace },
  44. { 'version': pm2_env.version },
  45. { 'restarts' : pm2_env.restart_time },
  46. { 'uptime' : (pm2_env.pm_uptime && pm2_env.status == 'online') ? UxHelpers.timeSince(pm2_env.pm_uptime) : 0 },
  47. { 'script path' : pm2_env.pm_exec_path },
  48. { 'script args' : pm2_env.args ? (typeof pm2_env.args == 'string' ? JSON.parse(pm2_env.args.replace(/'/g, '"')):pm2_env.args).join(' ') : null },
  49. { 'error log path' : pm2_env.pm_err_log_path },
  50. { 'out log path' : pm2_env.pm_out_log_path },
  51. { 'pid path' : pm2_env.pm_pid_path },
  52. { 'interpreter' : pm2_env.exec_interpreter },
  53. { 'interpreter args' : pm2_env.node_args.length != 0 ? pm2_env.node_args : null },
  54. { 'script id' : pm2_env.pm_id },
  55. { 'exec cwd' : pm2_env.pm_cwd },
  56. { 'exec mode' : pm2_env.exec_mode },
  57. { 'node.js version' : pm2_env.node_version },
  58. { 'node env': pm2_env.env.NODE_ENV },
  59. { 'watch & reload' : pm2_env.watch ? chalk.green.bold('✔') : '✘' },
  60. { 'unstable restarts' : pm2_env.unstable_restarts },
  61. { 'created at' : created_at }
  62. )
  63. if ('pm_log_path' in pm2_env){
  64. table.splice(6, 0, {'entire log path': pm2_env.pm_log_path})
  65. }
  66. if ('cron_restart' in pm2_env){
  67. table.splice(5, 0, {'cron restart': pm2_env.cron_restart})
  68. }
  69. console.log(table.toString())
  70. /**
  71. * Module conf display
  72. */
  73. if (pm2_env.axm_options &&
  74. pm2_env.axm_options.module_conf &&
  75. Object.keys(pm2_env.axm_options.module_conf).length > 0) {
  76. var table_conf = new Table({
  77. style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
  78. })
  79. console.log('Process configuration')
  80. Object.keys(pm2_env.axm_options.module_conf).forEach(function(key) {
  81. var tmp = {}
  82. tmp[key] = pm2_env.axm_options.module_conf[key]
  83. UxHelpers.safe_push(table_conf, tmp)
  84. })
  85. console.log(table_conf.toString())
  86. }
  87. /**
  88. * Versioning metadata
  89. */
  90. if (pm2_env.versioning) {
  91. var table2 = new Table({
  92. style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
  93. })
  94. console.log(chalk.inverse.bold(' Revision control metadata '))
  95. UxHelpers.safe_push(table2,
  96. { 'revision control' : pm2_env.versioning.type },
  97. { 'remote url' : pm2_env.versioning.url },
  98. { 'repository root' : pm2_env.versioning.repo_path },
  99. { 'last update' : pm2_env.versioning.update_time },
  100. { 'revision' : pm2_env.versioning.revision },
  101. { 'comment' : pm2_env.versioning.comment ? pm2_env.versioning.comment.trim().slice(0, 60) : '' },
  102. { 'branch' : pm2_env.versioning.branch }
  103. )
  104. console.log(table2.toString())
  105. }
  106. if (pm2_env.axm_actions && Object.keys(pm2_env.axm_actions).length > 0) {
  107. var table_actions = new Table({
  108. style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
  109. })
  110. console.log(chalk.inverse.bold(' Actions available '))
  111. pm2_env.axm_actions.forEach(function(action_set) {
  112. UxHelpers.safe_push(table_actions, [action_set.action_name])
  113. })
  114. console.log(table_actions.toString())
  115. Common.printOut(chalk.white.italic(' Trigger via: pm2 trigger %s <action_name>\n'), pm2_env.name)
  116. }
  117. if (pm2_env.axm_monitor && Object.keys(pm2_env.axm_monitor).length > 0) {
  118. var table_probes = new Table({
  119. style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
  120. })
  121. console.log(chalk.inverse.bold(' Code metrics value '))
  122. Object.keys(pm2_env.axm_monitor).forEach(function(key) {
  123. var obj = {}
  124. var metric_name = pm2_env.axm_monitor[key].hasOwnProperty("value") ? pm2_env.axm_monitor[key].value : pm2_env.axm_monitor[key]
  125. var metric_unit = pm2_env.axm_monitor[key].hasOwnProperty("unit") ? pm2_env.axm_monitor[key].unit : ''
  126. var value = `${metric_name} ${metric_unit}`
  127. obj[key] = value
  128. UxHelpers.safe_push(table_probes, obj)
  129. })
  130. console.log(table_probes.toString())
  131. }
  132. var table_env = new Table({
  133. style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
  134. })
  135. console.log(chalk.inverse.bold(' Divergent env variables from local env '))
  136. var _env = Common.safeExtend({}, pm2_env)
  137. var diff_env = {}
  138. Object.keys(process.env).forEach(k => {
  139. if (!_env[k] || _env[k] != process.env[k]) {
  140. diff_env[k] = process.env[k]
  141. }
  142. })
  143. Object.keys(diff_env).forEach(function(key) {
  144. var obj = {}
  145. if (_env[key]) {
  146. obj[key] = _env[key].slice(0, process.stdout.columns - 60)
  147. UxHelpers.safe_push(table_env, obj)
  148. }
  149. })
  150. console.log(table_env.toString())
  151. console.log()
  152. Common.printOut(chalk.white.italic(' Add your own code metrics: http://bit.ly/code-metrics'))
  153. Common.printOut(chalk.white.italic(' Use `pm2 logs %s [--lines 1000]` to display logs'), pm2_env.name)
  154. Common.printOut(chalk.white.italic(' Use `pm2 env %s` to display environment variables'), pm2_env.pm_id)
  155. Common.printOut(chalk.white.italic(' Use `pm2 monit` to monitor CPU and Memory usage'), pm2_env.name)
  156. }