runtime.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const metrics_1 = require("../services/metrics");
  4. const serviceManager_1 = require("../serviceManager");
  5. const Debug = require("debug");
  6. const histogram_1 = require("../utils/metrics/histogram");
  7. class RuntimeMetricsOptions {
  8. }
  9. exports.RuntimeMetricsOptions = RuntimeMetricsOptions;
  10. const defaultOptions = {
  11. gcNewPause: true,
  12. gcOldPause: true,
  13. pageFaults: true,
  14. contextSwitchs: true
  15. };
  16. class RuntimeMetrics {
  17. constructor() {
  18. this.logger = Debug('axm:features:metrics:runtime');
  19. this.metrics = new Map();
  20. }
  21. init(config) {
  22. if (config === false)
  23. return;
  24. if (config === undefined) {
  25. config = defaultOptions;
  26. }
  27. if (config === true) {
  28. config = defaultOptions;
  29. }
  30. this.metricService = serviceManager_1.ServiceManager.get('metrics');
  31. if (this.metricService === undefined)
  32. return this.logger('Failed to load metric service');
  33. this.runtimeStatsService = serviceManager_1.ServiceManager.get('runtimeStats');
  34. if (this.runtimeStatsService === undefined)
  35. return this.logger('Failed to load runtime stats service');
  36. this.logger('init');
  37. const newHistogram = new histogram_1.default();
  38. if (config.gcNewPause === true) {
  39. this.metricService.registerMetric({
  40. name: 'GC New Space Pause',
  41. id: 'internal/v8/gc/new/pause/p50',
  42. type: metrics_1.MetricType.histogram,
  43. historic: true,
  44. implementation: newHistogram,
  45. unit: 'ms',
  46. handler: function () {
  47. const percentiles = this.implementation.percentiles([0.5]);
  48. return percentiles[0.5];
  49. }
  50. });
  51. this.metricService.registerMetric({
  52. name: 'GC New Space Pause p95',
  53. id: 'internal/v8/gc/new/pause/p95',
  54. type: metrics_1.MetricType.histogram,
  55. historic: true,
  56. implementation: newHistogram,
  57. unit: 'ms',
  58. handler: function () {
  59. const percentiles = this.implementation.percentiles([0.95]);
  60. return percentiles[0.95];
  61. }
  62. });
  63. }
  64. const oldHistogram = new histogram_1.default();
  65. if (config.gcOldPause === true) {
  66. this.metricService.registerMetric({
  67. name: 'GC Old Space Pause',
  68. id: 'internal/v8/gc/old/pause/p50',
  69. type: metrics_1.MetricType.histogram,
  70. historic: true,
  71. implementation: oldHistogram,
  72. unit: 'ms',
  73. handler: function () {
  74. const percentiles = this.implementation.percentiles([0.5]);
  75. return percentiles[0.5];
  76. }
  77. });
  78. this.metricService.registerMetric({
  79. name: 'GC Old Space Pause p95',
  80. id: 'internal/v8/gc/old/pause/p95',
  81. type: metrics_1.MetricType.histogram,
  82. historic: true,
  83. implementation: oldHistogram,
  84. unit: 'ms',
  85. handler: function () {
  86. const percentiles = this.implementation.percentiles([0.95]);
  87. return percentiles[0.95];
  88. }
  89. });
  90. }
  91. if (config.contextSwitchs === true) {
  92. const volontarySwitchs = this.metricService.histogram({
  93. name: 'Volontary CPU Context Switch',
  94. id: 'internal/uv/cpu/contextswitch/volontary',
  95. measurement: metrics_1.MetricMeasurements.mean
  96. });
  97. const inVolontarySwitchs = this.metricService.histogram({
  98. name: 'Involuntary CPU Context Switch',
  99. id: 'internal/uv/cpu/contextswitch/involontary',
  100. measurement: metrics_1.MetricMeasurements.mean
  101. });
  102. this.metrics.set('inVolontarySwitchs', inVolontarySwitchs);
  103. this.metrics.set('volontarySwitchs', volontarySwitchs);
  104. }
  105. if (config.pageFaults === true) {
  106. const softPageFault = this.metricService.histogram({
  107. name: 'Minor Page Fault',
  108. id: 'internal/uv/memory/pagefault/minor',
  109. measurement: metrics_1.MetricMeasurements.mean
  110. });
  111. const hardPageFault = this.metricService.histogram({
  112. name: 'Major Page Fault',
  113. id: 'internal/uv/memory/pagefault/major',
  114. measurement: metrics_1.MetricMeasurements.mean
  115. });
  116. this.metrics.set('softPageFault', softPageFault);
  117. this.metrics.set('hardPageFault', hardPageFault);
  118. }
  119. this.handle = (stats) => {
  120. if (typeof stats !== 'object' || typeof stats.gc !== 'object')
  121. return;
  122. newHistogram.update(stats.gc.newPause);
  123. oldHistogram.update(stats.gc.oldPause);
  124. if (typeof stats.usage !== 'object')
  125. return;
  126. const volontarySwitchs = this.metrics.get('volontarySwitchs');
  127. if (volontarySwitchs !== undefined) {
  128. volontarySwitchs.update(stats.usage.ru_nvcsw);
  129. }
  130. const inVolontarySwitchs = this.metrics.get('inVolontarySwitchs');
  131. if (inVolontarySwitchs !== undefined) {
  132. inVolontarySwitchs.update(stats.usage.ru_nivcsw);
  133. }
  134. const softPageFault = this.metrics.get('softPageFault');
  135. if (softPageFault !== undefined) {
  136. softPageFault.update(stats.usage.ru_minflt);
  137. }
  138. const hardPageFault = this.metrics.get('hardPageFault');
  139. if (hardPageFault !== undefined) {
  140. hardPageFault.update(stats.usage.ru_majflt);
  141. }
  142. };
  143. this.runtimeStatsService.on('data', this.handle);
  144. }
  145. destroy() {
  146. if (this.runtimeStatsService !== undefined) {
  147. this.runtimeStatsService.removeListener('data', this.handle);
  148. }
  149. this.logger('destroy');
  150. }
  151. }
  152. exports.default = RuntimeMetrics;
  153. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRyaWNzL3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFBOztBQUVaLGlEQUFtRjtBQUNuRixzREFBa0Q7QUFDbEQsK0JBQThCO0FBRTlCLDBEQUFrRDtBQUdsRCxNQUFhLHFCQUFxQjtDQWFqQztBQWJELHNEQWFDO0FBRUQsTUFBTSxjQUFjLEdBQTBCO0lBQzVDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLGNBQWMsRUFBRSxJQUFJO0NBQ3JCLENBQUE7QUFFRCxNQUFxQixjQUFjO0lBQW5DO1FBR1UsV0FBTSxHQUFRLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1FBR25ELFlBQU8sR0FBMkIsSUFBSSxHQUFHLEVBQXFCLENBQUE7SUF5SXhFLENBQUM7SUF2SUMsSUFBSSxDQUFFLE1BQXdDO1FBQzVDLElBQUksTUFBTSxLQUFLLEtBQUs7WUFBRSxPQUFNO1FBQzVCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixNQUFNLEdBQUcsY0FBYyxDQUFBO1NBQ3hCO1FBQ0QsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ25CLE1BQU0sR0FBRyxjQUFjLENBQUE7U0FDeEI7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLCtCQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2xELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFFekYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLCtCQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzdELElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQyxN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