v8.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const v8 = require("v8");
  4. const debug_1 = require("debug");
  5. const serviceManager_1 = require("../serviceManager");
  6. class V8MetricsConfig {
  7. }
  8. exports.V8MetricsConfig = V8MetricsConfig;
  9. const defaultOptions = {
  10. new_space: false,
  11. old_space: false,
  12. map_space: false,
  13. code_space: false,
  14. large_object_space: false,
  15. heap_total_size: true,
  16. heap_used_size: true,
  17. heap_used_percent: true
  18. };
  19. class V8Metric {
  20. constructor() {
  21. this.TIME_INTERVAL = 800;
  22. this.logger = debug_1.default('axm:features:metrics:v8');
  23. this.metricStore = new Map();
  24. this.unitKB = 'MiB';
  25. this.metricsDefinitions = {
  26. total_heap_size: {
  27. name: 'Heap Size',
  28. id: 'internal/v8/heap/total',
  29. unit: this.unitKB,
  30. historic: true
  31. },
  32. heap_used_percent: {
  33. name: 'Heap Usage',
  34. id: 'internal/v8/heap/usage',
  35. unit: '%',
  36. historic: true
  37. },
  38. used_heap_size: {
  39. name: 'Used Heap Size',
  40. id: 'internal/v8/heap/used',
  41. unit: this.unitKB,
  42. historic: true
  43. }
  44. };
  45. }
  46. init(config) {
  47. if (config === false)
  48. return;
  49. if (config === undefined) {
  50. config = defaultOptions;
  51. }
  52. if (config === true) {
  53. config = defaultOptions;
  54. }
  55. this.metricService = serviceManager_1.ServiceManager.get('metrics');
  56. if (this.metricService === undefined)
  57. return this.logger('Failed to load metric service');
  58. this.logger('init');
  59. if (!v8.hasOwnProperty('getHeapStatistics')) {
  60. return this.logger(`V8.getHeapStatistics is not available, aborting`);
  61. }
  62. for (let metricName in this.metricsDefinitions) {
  63. if (config[metricName] === false)
  64. continue;
  65. const isEnabled = config[metricName];
  66. if (isEnabled === false)
  67. continue;
  68. let metric = this.metricsDefinitions[metricName];
  69. this.metricStore.set(metricName, this.metricService.metric(metric));
  70. }
  71. this.timer = setInterval(() => {
  72. const stats = v8.getHeapStatistics();
  73. for (let metricName in this.metricsDefinitions) {
  74. if (typeof stats[metricName] !== 'number')
  75. continue;
  76. const gauge = this.metricStore.get(metricName);
  77. if (gauge === undefined)
  78. continue;
  79. gauge.set(this.formatMiBytes(stats[metricName]));
  80. }
  81. const usage = (stats.used_heap_size / stats.total_heap_size * 100).toFixed(2);
  82. const usageMetric = this.metricStore.get('heap_used_percent');
  83. if (usageMetric !== undefined) {
  84. usageMetric.set(parseFloat(usage));
  85. }
  86. }, this.TIME_INTERVAL);
  87. this.timer.unref();
  88. }
  89. destroy() {
  90. if (this.timer !== undefined) {
  91. clearInterval(this.timer);
  92. }
  93. this.logger('destroy');
  94. }
  95. formatMiBytes(val) {
  96. return (val / 1024 / 1024).toFixed(2);
  97. }
  98. }
  99. exports.default = V8Metric;
  100. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy92OC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlCQUF3QjtBQUd4QixpQ0FBeUI7QUFDekIsc0RBQWtEO0FBSWxELE1BQWEsZUFBZTtDQVMzQjtBQVRELDBDQVNDO0FBR0QsTUFBTSxjQUFjLEdBQW9CO0lBQ3RDLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLGtCQUFrQixFQUFFLEtBQUs7SUFDekIsZUFBZSxFQUFFLElBQUk7SUFDckIsY0FBYyxFQUFFLElBQUk7SUFDcEIsaUJBQWlCLEVBQUUsSUFBSTtDQUN4QixDQUFBO0FBRUQsTUFBcUIsUUFBUTtJQUE3QjtRQUdVLGtCQUFhLEdBQVcsR0FBRyxDQUFBO1FBRTNCLFdBQU0sR0FBYSxlQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUNuRCxnQkFBVyxHQUF1QixJQUFJLEdBQUcsRUFBaUIsQ0FBQTtRQUUxRCxXQUFNLEdBQUcsS0FBSyxDQUFBO1FBRWQsdUJBQWtCLEdBQUc7WUFnQzNCLGVBQWUsRUFBRTtnQkFDZixJQUFJLEVBQUUsV0FBVztnQkFDakIsRUFBRSxFQUFFLHdCQUF3QjtnQkFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNqQixRQUFRLEVBQUUsSUFBSTthQUNmO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2pCLElBQUksRUFBRSxZQUFZO2dCQUNsQixFQUFFLEVBQUUsd0JBQXdCO2dCQUM1QixJQUFJLEVBQUUsR0FBRztnQkFDVCxRQUFRLEVBQUUsSUFBSTthQUNmO1lBQ0QsY0FBYyxFQUFFO2dCQUNkLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLEVBQUUsRUFBRSx1QkFBdUI7Z0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDakIsUUFBUSxFQUFF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