statistics.js 4.2 KB

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