statistics.js 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { MongoInternals } from 'meteor/mongo';
  2. if (Meteor.isServer) {
  3. Meteor.methods({
  4. getStatistics() {
  5. if (Meteor.user() && Meteor.user().isAdmin) {
  6. const os = require('os');
  7. const pjson = require('/package.json');
  8. const statistics = {};
  9. let wekanVersion = pjson.version;
  10. wekanVersion = wekanVersion.replace('v', '');
  11. statistics.version = wekanVersion;
  12. statistics.os = {
  13. type: os.type(),
  14. platform: os.platform(),
  15. arch: os.arch(),
  16. release: os.release(),
  17. uptime: os.uptime(),
  18. loadavg: os.loadavg(),
  19. totalmem: os.totalmem(),
  20. freemem: os.freemem(),
  21. cpus: os.cpus(),
  22. };
  23. let nodeVersion = process.version;
  24. nodeVersion = nodeVersion.replace('v', '');
  25. statistics.process = {
  26. nodeVersion,
  27. pid: process.pid,
  28. uptime: process.uptime(),
  29. };
  30. const v8 = require('v8'); // Import the v8 module
  31. statistics.nodeHeapStats = {
  32. totalHeapSize: v8.getHeapStatistics().total_heap_size,
  33. totalHeapSizeExecutable: v8.getHeapStatistics().total_heap_size_executable,
  34. totalPhysicalSize: v8.getHeapStatistics().total_physical_size,
  35. totalAvailableSize: v8.getHeapStatistics().total_available_size,
  36. usedHeapSize: v8.getHeapStatistics().used_heap_size,
  37. heapSizeLimit: v8.getHeapStatistics().heap_size_limit,
  38. mallocedMemory: v8.getHeapStatistics().malloced_memory,
  39. peakMallocedMemory: v8.getHeapStatistics().peak_malloced_memory,
  40. doesZapGarbage: v8.getHeapStatistics().does_zap_garbage,
  41. numberOfNativeContexts: v8.getHeapStatistics().number_of_native_contexts,
  42. numberOfDetachedContexts: v8.getHeapStatistics().number_of_detached_contexts,
  43. };
  44. let memoryUsage = process.memoryUsage();
  45. statistics.nodeMemoryUsage = {
  46. rss: memoryUsage.rss,
  47. heapTotal: memoryUsage.heapTotal,
  48. heapUsed: memoryUsage.heapUsed,
  49. external: memoryUsage.external,
  50. };
  51. // Remove beginning of Meteor release text METEOR@
  52. let meteorVersion = Meteor.release;
  53. meteorVersion = meteorVersion.replace('METEOR@', '');
  54. statistics.meteor = {
  55. meteorVersion,
  56. };
  57. // Thanks to RocketChat for MongoDB version detection !
  58. // https://github.com/RocketChat/Rocket.Chat/blob/develop/app/utils/server/functions/getMongoInfo.js
  59. let mongoVersion;
  60. let mongoStorageEngine;
  61. let mongoOplogEnabled;
  62. try {
  63. const { mongo } = MongoInternals.defaultRemoteCollectionDriver();
  64. oplogEnabled = Boolean(
  65. mongo._oplogHandle && mongo._oplogHandle.onOplogEntry,
  66. );
  67. const { version, storageEngine } = Promise.await(
  68. mongo.db.command({ serverStatus: 1 }),
  69. );
  70. mongoVersion = version;
  71. mongoStorageEngine = storageEngine.name;
  72. mongoOplogEnabled = oplogEnabled;
  73. } catch (e) {
  74. try {
  75. const { version } = Promise.await(
  76. mongo.db.command({ buildinfo: 1 }),
  77. );
  78. mongoVersion = version;
  79. mongoStorageEngine = 'unknown';
  80. } catch (e) {
  81. mongoVersion = 'unknown';
  82. mongoStorageEngine = 'unknown';
  83. }
  84. }
  85. statistics.mongo = {
  86. mongoVersion,
  87. mongoStorageEngine,
  88. mongoOplogEnabled,
  89. };
  90. return statistics;
  91. } else {
  92. return false;
  93. }
  94. },
  95. });
  96. }