statistics.js 4.5 KB

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