addonProfiler.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const module_1 = require("../utils/module");
  4. const configuration_1 = require("../configuration");
  5. const serviceManager_1 = require("../serviceManager");
  6. const miscellaneous_1 = require("../utils/miscellaneous");
  7. const Debug = require("debug");
  8. class CurrentProfile {
  9. }
  10. class AddonProfiler {
  11. constructor() {
  12. this.profiler = null;
  13. this.modules = ['v8-profiler-node8', 'v8-profiler'];
  14. this.currentProfile = null;
  15. this.logger = Debug('axm:features:profiling:addon');
  16. }
  17. init() {
  18. for (const moduleName of this.modules) {
  19. let path = module_1.default.detectModule(moduleName);
  20. if (path === null)
  21. continue;
  22. let profiler = module_1.default.loadModule(moduleName);
  23. if (profiler instanceof Error)
  24. continue;
  25. this.profiler = profiler;
  26. break;
  27. }
  28. if (this.profiler === null) {
  29. configuration_1.default.configureModule({
  30. heapdump: false,
  31. 'feature.profiler.heap_snapshot': false,
  32. 'feature.profiler.heap_sampling': false,
  33. 'feature.profiler.cpu_js': false
  34. });
  35. return this.logger(`Failed to require the profiler via addon, disabling profiling ...`);
  36. }
  37. this.logger('init');
  38. this.actionService = serviceManager_1.ServiceManager.get('actions');
  39. if (this.actionService === undefined) {
  40. return this.logger(`Fail to get action service`);
  41. }
  42. this.transport = serviceManager_1.ServiceManager.get('transport');
  43. if (this.transport === undefined) {
  44. return this.logger(`Fail to get transport service`);
  45. }
  46. configuration_1.default.configureModule({
  47. heapdump: true,
  48. 'feature.profiler.heapsnapshot': true,
  49. 'feature.profiler.heapsampling': false,
  50. 'feature.profiler.cpu_js': true
  51. });
  52. this.register();
  53. }
  54. register() {
  55. if (this.actionService === undefined) {
  56. return this.logger(`Fail to get action service`);
  57. }
  58. this.logger('register');
  59. this.actionService.registerAction('km:heapdump', this.onHeapdump.bind(this));
  60. this.actionService.registerAction('km:cpu:profiling:start', this.onCPUProfileStart.bind(this));
  61. this.actionService.registerAction('km:cpu:profiling:stop', this.onCPUProfileStop.bind(this));
  62. }
  63. destroy() {
  64. this.logger('Addon Profiler destroyed !');
  65. if (this.profiler === null)
  66. return;
  67. this.profiler.deleteAllProfiles();
  68. }
  69. onCPUProfileStart(opts, cb) {
  70. if (typeof cb !== 'function') {
  71. cb = opts;
  72. opts = {};
  73. }
  74. if (typeof opts !== 'object' || opts === null) {
  75. opts = {};
  76. }
  77. if (this.currentProfile !== null) {
  78. return cb({
  79. err: 'A profiling is already running',
  80. success: false
  81. });
  82. }
  83. this.currentProfile = new CurrentProfile();
  84. this.currentProfile.uuid = miscellaneous_1.default.generateUUID();
  85. this.currentProfile.startTime = Date.now();
  86. this.currentProfile.initiated = typeof opts.initiated === 'string'
  87. ? opts.initiated : 'manual';
  88. cb({ success: true, uuid: this.currentProfile.uuid });
  89. this.profiler.startProfiling();
  90. if (isNaN(parseInt(opts.timeout, 10)))
  91. return;
  92. const duration = parseInt(opts.timeout, 10);
  93. setTimeout(_ => {
  94. this.onCPUProfileStop(_ => {
  95. return;
  96. });
  97. }, duration);
  98. }
  99. onCPUProfileStop(cb) {
  100. if (this.currentProfile === null) {
  101. return cb({
  102. err: 'No profiling are already running',
  103. success: false
  104. });
  105. }
  106. if (this.transport === undefined) {
  107. return cb({
  108. err: 'No profiling are already running',
  109. success: false
  110. });
  111. }
  112. const profile = this.profiler.stopProfiling();
  113. const data = JSON.stringify(profile);
  114. cb({ success: true, uuid: this.currentProfile.uuid });
  115. this.transport.send('profilings', {
  116. uuid: this.currentProfile.uuid,
  117. duration: Date.now() - this.currentProfile.startTime,
  118. at: this.currentProfile.startTime,
  119. data,
  120. dump_file_size: data.length,
  121. success: true,
  122. initiated: this.currentProfile.initiated,
  123. type: 'cpuprofile',
  124. cpuprofile: true
  125. });
  126. this.currentProfile = null;
  127. }
  128. onHeapdump(opts, cb) {
  129. if (typeof cb !== 'function') {
  130. cb = opts;
  131. opts = {};
  132. }
  133. if (typeof opts !== 'object' || opts === null) {
  134. opts = {};
  135. }
  136. cb({ success: true });
  137. setTimeout(() => {
  138. const startTime = Date.now();
  139. this.takeSnapshot()
  140. .then((data) => {
  141. return this.transport.send('profilings', {
  142. data,
  143. at: startTime,
  144. initiated: typeof opts.initiated === 'string' ? opts.initiated : 'manual',
  145. duration: Date.now() - startTime,
  146. type: 'heapdump'
  147. });
  148. }).catch(err => {
  149. return cb({
  150. success: err.message,
  151. err: err
  152. });
  153. });
  154. }, 200);
  155. }
  156. takeSnapshot() {
  157. return new Promise((resolve, reject) => {
  158. const snapshot = this.profiler.takeSnapshot();
  159. snapshot.export((err, data) => {
  160. if (err) {
  161. reject(err);
  162. }
  163. else {
  164. resolve(data);
  165. }
  166. snapshot.delete();
  167. });
  168. });
  169. }
  170. }
  171. exports.default = AddonProfiler;
  172. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkb25Qcm9maWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm9maWxlcnMvYWRkb25Qcm9maWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDRDQUFtQztBQUNuQyxvREFBNEM7QUFDNUMsc0RBQWtEO0FBR2xELDBEQUE4QztBQUM5QywrQkFBOEI7QUFFOUIsTUFBTSxjQUFjO0NBSW5CO0FBRUQsTUFBcUIsYUFBYTtJQUFsQztRQUVVLGFBQVEsR0FBUSxJQUFJLENBQUE7UUFNcEIsWUFBTyxHQUFHLENBQUUsbUJBQW1CLEVBQUUsYUFBYSxDQUFFLENBQUE7UUFHaEQsbUJBQWMsR0FBMEIsSUFBSSxDQUFBO1FBQzVDLFdBQU0sR0FBYSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQW9MbEUsQ0FBQztJQWxMQyxJQUFJO1FBQ0YsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3JDLElBQUksSUFBSSxHQUFHLGdCQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXpDLElBQUksSUFBSSxLQUFLLElBQUk7Z0JBQUUsU0FBUTtZQUMzQixJQUFJLFFBQVEsR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUUzQyxJQUFJLFFBQVEsWUFBWSxLQUFLO2dCQUFFLFNBQVE7WUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7WUFDeEIsTUFBSztTQUNOO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtZQUMxQix1QkFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDNUIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsZ0NBQWdDLEVBQUUsS0FBSztnQkFDdkMsZ0NBQWdDLEVBQUUsS0FBSztnQkFDdkMseUJBQXlCLEVBQUUsS0FBSzthQUNqQyxDQUFDLENBQUE7WUFDRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMs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