network.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const netModule = require("net");
  4. const metrics_1 = require("../services/metrics");
  5. const Debug = require("debug");
  6. const meter_1 = require("../utils/metrics/meter");
  7. const shimmer = require("shimmer");
  8. const serviceManager_1 = require("../serviceManager");
  9. class NetworkTrafficConfig {
  10. }
  11. exports.NetworkTrafficConfig = NetworkTrafficConfig;
  12. const defaultConfig = {
  13. upload: false,
  14. download: false
  15. };
  16. const allEnabled = {
  17. upload: true,
  18. download: true
  19. };
  20. class NetworkMetric {
  21. constructor() {
  22. this.logger = Debug('axm:features:metrics:network');
  23. }
  24. init(config) {
  25. if (config === false)
  26. return;
  27. if (config === true) {
  28. config = allEnabled;
  29. }
  30. if (config === undefined) {
  31. config = defaultConfig;
  32. }
  33. this.metricService = serviceManager_1.ServiceManager.get('metrics');
  34. if (this.metricService === undefined) {
  35. return this.logger(`Failed to load metric service`);
  36. }
  37. if (config.download === true) {
  38. this.catchDownload();
  39. }
  40. if (config.upload === true) {
  41. this.catchUpload();
  42. }
  43. this.logger('init');
  44. }
  45. destroy() {
  46. if (this.timer !== undefined) {
  47. clearTimeout(this.timer);
  48. }
  49. if (this.socketProto !== undefined && this.socketProto !== null) {
  50. shimmer.unwrap(this.socketProto, 'read');
  51. shimmer.unwrap(this.socketProto, 'write');
  52. }
  53. this.logger('destroy');
  54. }
  55. catchDownload() {
  56. if (this.metricService === undefined)
  57. return this.logger(`Failed to load metric service`);
  58. const downloadMeter = new meter_1.default({});
  59. this.metricService.registerMetric({
  60. name: 'Network In',
  61. id: 'internal/network/in',
  62. historic: true,
  63. type: metrics_1.MetricType.meter,
  64. implementation: downloadMeter,
  65. unit: 'kb/s',
  66. handler: function () {
  67. return Math.floor(this.implementation.val() / 1024 * 1000) / 1000;
  68. }
  69. });
  70. setTimeout(() => {
  71. const property = netModule.Socket.prototype.read;
  72. const isWrapped = property && property.__wrapped === true;
  73. if (isWrapped) {
  74. return this.logger(`Already patched socket read, canceling`);
  75. }
  76. shimmer.wrap(netModule.Socket.prototype, 'read', function (original) {
  77. return function () {
  78. this.on('data', (data) => {
  79. if (typeof data.length === 'number') {
  80. downloadMeter.mark(data.length);
  81. }
  82. });
  83. return original.apply(this, arguments);
  84. };
  85. });
  86. }, 500);
  87. }
  88. catchUpload() {
  89. if (this.metricService === undefined)
  90. return this.logger(`Failed to load metric service`);
  91. const uploadMeter = new meter_1.default();
  92. this.metricService.registerMetric({
  93. name: 'Network Out',
  94. id: 'internal/network/out',
  95. type: metrics_1.MetricType.meter,
  96. historic: true,
  97. implementation: uploadMeter,
  98. unit: 'kb/s',
  99. handler: function () {
  100. return Math.floor(this.implementation.val() / 1024 * 1000) / 1000;
  101. }
  102. });
  103. setTimeout(() => {
  104. const property = netModule.Socket.prototype.write;
  105. const isWrapped = property && property.__wrapped === true;
  106. if (isWrapped) {
  107. return this.logger(`Already patched socket write, canceling`);
  108. }
  109. shimmer.wrap(netModule.Socket.prototype, 'write', function (original) {
  110. return function (data) {
  111. if (typeof data.length === 'number') {
  112. uploadMeter.mark(data.length);
  113. }
  114. return original.apply(this, arguments);
  115. };
  116. });
  117. }, 500);
  118. }
  119. }
  120. exports.default = NetworkMetric;
  121. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRyaWNzL25ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBZ0M7QUFDaEMsaURBQStEO0FBRS9ELCtCQUE4QjtBQUM5QixrREFBMEM7QUFDMUMsbUNBQWtDO0FBQ2xDLHNEQUFrRDtBQUVsRCxNQUFhLG9CQUFvQjtDQUdoQztBQUhELG9EQUdDO0FBRUQsTUFBTSxhQUFhLEdBQXlCO0lBQzFDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsUUFBUSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQTtBQUVELE1BQU0sVUFBVSxHQUF5QjtJQUN2QyxNQUFNLEVBQUUsSUFBSTtJQUNaLFFBQVEsRUFBRSxJQUFJO0NBQ2YsQ0FBQTtBQUVELE1BQXFCLGFBQWE7SUFBbEM7UUFHVSxXQUFNLEdBQWEsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUEyR2xFLENBQUM7SUF4R0MsSUFBSSxDQUFFLE1BQXVDO1FBQzNDLElBQUksTUFBTSxLQUFLLEtBQUs7WUFBRSxPQUFNO1FBQzVCLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNuQixNQUFNLEdBQUcsVUFBVSxDQUFBO1NBQ3BCO1FBQ0QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sR0FBRyxhQUFhLENBQUE7U0FDdkI7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLCtCQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2xELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUE7U0FDcEQ7UUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtTQUNyQjtRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxJ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