metrics.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const meter_1 = require("../utils/metrics/meter");
  4. const counter_1 = require("../utils/metrics/counter");
  5. const histogram_1 = require("../utils/metrics/histogram");
  6. const serviceManager_1 = require("../serviceManager");
  7. const constants_1 = require("../constants");
  8. const Debug = require("debug");
  9. const gauge_1 = require("../utils/metrics/gauge");
  10. var MetricType;
  11. (function (MetricType) {
  12. MetricType["meter"] = "meter";
  13. MetricType["histogram"] = "histogram";
  14. MetricType["counter"] = "counter";
  15. MetricType["gauge"] = "gauge";
  16. MetricType["metric"] = "metric";
  17. })(MetricType = exports.MetricType || (exports.MetricType = {}));
  18. var MetricMeasurements;
  19. (function (MetricMeasurements) {
  20. MetricMeasurements["min"] = "min";
  21. MetricMeasurements["max"] = "max";
  22. MetricMeasurements["sum"] = "sum";
  23. MetricMeasurements["count"] = "count";
  24. MetricMeasurements["variance"] = "variance";
  25. MetricMeasurements["mean"] = "mean";
  26. MetricMeasurements["stddev"] = "stddev";
  27. MetricMeasurements["median"] = "median";
  28. MetricMeasurements["p75"] = "p75";
  29. MetricMeasurements["p95"] = "p95";
  30. MetricMeasurements["p99"] = "p99";
  31. MetricMeasurements["p999"] = "p999";
  32. })(MetricMeasurements = exports.MetricMeasurements || (exports.MetricMeasurements = {}));
  33. class Metric {
  34. }
  35. exports.Metric = Metric;
  36. class MetricBulk extends Metric {
  37. }
  38. exports.MetricBulk = MetricBulk;
  39. class HistogramOptions extends Metric {
  40. }
  41. exports.HistogramOptions = HistogramOptions;
  42. class MetricService {
  43. constructor() {
  44. this.metrics = new Map();
  45. this.timer = null;
  46. this.transport = null;
  47. this.logger = Debug('axm:services:metrics');
  48. }
  49. init() {
  50. this.transport = serviceManager_1.ServiceManager.get('transport');
  51. if (this.transport === null)
  52. return this.logger('Failed to init metrics service cause no transporter');
  53. this.logger('init');
  54. this.timer = setInterval(() => {
  55. if (this.transport === null)
  56. return this.logger('Abort metrics update since transport is not available');
  57. this.logger('refreshing metrics value');
  58. for (let metric of this.metrics.values()) {
  59. metric.value = metric.handler();
  60. }
  61. this.logger('sending update metrics value to transporter');
  62. const metricsToSend = Array.from(this.metrics.values())
  63. .filter(metric => {
  64. if (metric === null || metric === undefined)
  65. return false;
  66. if (metric.value === undefined || metric.value === null)
  67. return false;
  68. const isNumber = typeof metric.value === 'number';
  69. const isString = typeof metric.value === 'string';
  70. const isBoolean = typeof metric.value === 'boolean';
  71. const isValidNumber = !isNaN(metric.value);
  72. return isString || isBoolean || (isNumber && isValidNumber);
  73. });
  74. this.transport.setMetrics(metricsToSend);
  75. }, constants_1.default.METRIC_INTERVAL);
  76. this.timer.unref();
  77. }
  78. registerMetric(metric) {
  79. if (typeof metric.name !== 'string') {
  80. console.error(`Invalid metric name declared: ${metric.name}`);
  81. return console.trace();
  82. }
  83. else if (typeof metric.type !== 'string') {
  84. console.error(`Invalid metric type declared: ${metric.type}`);
  85. return console.trace();
  86. }
  87. else if (typeof metric.handler !== 'function') {
  88. console.error(`Invalid metric handler declared: ${metric.handler}`);
  89. return console.trace();
  90. }
  91. if (typeof metric.historic !== 'boolean') {
  92. metric.historic = true;
  93. }
  94. this.logger(`Registering new metric: ${metric.name}`);
  95. this.metrics.set(metric.name, metric);
  96. }
  97. meter(opts) {
  98. const metric = {
  99. name: opts.name,
  100. type: MetricType.meter,
  101. id: opts.id,
  102. historic: opts.historic,
  103. implementation: new meter_1.default(opts),
  104. unit: opts.unit,
  105. handler: function () {
  106. return this.implementation.isUsed() ? this.implementation.val() : NaN;
  107. }
  108. };
  109. this.registerMetric(metric);
  110. return metric.implementation;
  111. }
  112. counter(opts) {
  113. const metric = {
  114. name: opts.name,
  115. type: MetricType.counter,
  116. id: opts.id,
  117. historic: opts.historic,
  118. implementation: new counter_1.default(opts),
  119. unit: opts.unit,
  120. handler: function () {
  121. return this.implementation.isUsed() ? this.implementation.val() : NaN;
  122. }
  123. };
  124. this.registerMetric(metric);
  125. return metric.implementation;
  126. }
  127. histogram(opts) {
  128. if (opts.measurement === undefined || opts.measurement === null) {
  129. opts.measurement = MetricMeasurements.mean;
  130. }
  131. const metric = {
  132. name: opts.name,
  133. type: MetricType.histogram,
  134. id: opts.id,
  135. historic: opts.historic,
  136. implementation: new histogram_1.default(opts),
  137. unit: opts.unit,
  138. handler: function () {
  139. return this.implementation.isUsed() ?
  140. (Math.round(this.implementation.val() * 100) / 100) : NaN;
  141. }
  142. };
  143. this.registerMetric(metric);
  144. return metric.implementation;
  145. }
  146. metric(opts) {
  147. let metric;
  148. if (typeof opts.value === 'function') {
  149. metric = {
  150. name: opts.name,
  151. type: MetricType.gauge,
  152. id: opts.id,
  153. implementation: undefined,
  154. historic: opts.historic,
  155. unit: opts.unit,
  156. handler: opts.value
  157. };
  158. }
  159. else {
  160. metric = {
  161. name: opts.name,
  162. type: MetricType.gauge,
  163. id: opts.id,
  164. historic: opts.historic,
  165. implementation: new gauge_1.default(),
  166. unit: opts.unit,
  167. handler: function () {
  168. return this.implementation.isUsed() ? this.implementation.val() : NaN;
  169. }
  170. };
  171. }
  172. this.registerMetric(metric);
  173. return metric.implementation;
  174. }
  175. deleteMetric(name) {
  176. return this.metrics.delete(name);
  177. }
  178. destroy() {
  179. if (this.timer !== null) {
  180. clearInterval(this.timer);
  181. }
  182. this.metrics.clear();
  183. }
  184. }
  185. exports.MetricService = MetricService;
  186. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQTs7QUFFWixrREFBMEM7QUFDMUMsc0RBQThDO0FBQzlDLDBEQUFrRDtBQUNsRCxzREFBMkQ7QUFDM0QsNENBQW9DO0FBRXBDLCtCQUE4QjtBQUM5QixrREFBMEM7QUFFMUMsSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ3BCLDZCQUFpQixDQUFBO0lBQ2pCLHFDQUF5QixDQUFBO0lBQ3pCLGlDQUFxQixDQUFBO0lBQ3JCLDZCQUFpQixDQUFBO0lBQ2pCLCtCQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFOVyxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQU1yQjtBQUVELElBQVksa0JBYVg7QUFiRCxXQUFZLGtCQUFrQjtJQUM1QixpQ0FBYSxDQUFBO0lBQ2IsaUNBQWEsQ0FBQTtJQUNiLGlDQUFhLENBQUE7SUFDYixxQ0FBaUIsQ0FBQTtJQUNqQiwyQ0FBdUIsQ0FBQTtJQUN2QixtQ0FBZSxDQUFBO0lBQ2YsdUNBQW1CLENBQUE7SUFDbkIsdUNBQW1CLENBQUE7SUFDbkIsaUNBQWEsQ0FBQTtJQUNiLGlDQUFhLENBQUE7SUFDYixpQ0FBYSxDQUFBO0lBQ2IsbUNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBYlcsa0JBQWtCLEdBQWxCLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFhN0I7QUF1Q0QsTUFBYSxNQUFNO0NBMEJsQjtBQTFCRCx3QkEwQkM7QUFFRCxNQUFhLFVBQVcsU0FBUSxNQUFNO0NBRXJDO0FBRkQsZ0NBRUM7QUFFRCxNQUFhLGdCQUFpQixTQUFRLE1BQU07Q0FFM0M7QUFGRCw0Q0FFQztBQUVELE1BQWEsYUFBYTtJQUExQjtRQUVVLFlBQU8sR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNoRCxVQUFLLEdBQXdCLElBQUksQ0FBQTtRQUNqQyxjQUFT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