histogram.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const EDS_1 = require("../EDS");
  4. class Histogram {
  5. constructor(opts) {
  6. this._sample = new EDS_1.default();
  7. this._count = 0;
  8. this._sum = 0;
  9. this._varianceM = 0;
  10. this._varianceS = 0;
  11. this._ema = 0;
  12. this.used = false;
  13. opts = opts || {};
  14. this._measurement = opts.measurement;
  15. this._callFn = null;
  16. const methods = {
  17. min: this.getMin,
  18. max: this.getMax,
  19. sum: this.getSum,
  20. count: this.getCount,
  21. variance: this._calculateVariance,
  22. mean: this._calculateMean,
  23. ema: this.getEma()
  24. };
  25. if (methods.hasOwnProperty(this._measurement)) {
  26. this._callFn = methods[this._measurement];
  27. }
  28. else {
  29. this._callFn = function () {
  30. const percentiles = this.percentiles([0.5, 0.75, 0.95, 0.99, 0.999]);
  31. const medians = {
  32. median: percentiles[0.5],
  33. p75: percentiles[0.75],
  34. p95: percentiles[0.95],
  35. p99: percentiles[0.99],
  36. p999: percentiles[0.999]
  37. };
  38. return medians[this._measurement];
  39. };
  40. }
  41. }
  42. update(value) {
  43. this.used = true;
  44. this._count++;
  45. this._sum += value;
  46. this._sample.update(value);
  47. this._updateMin(value);
  48. this._updateMax(value);
  49. this._updateVariance(value);
  50. this._updateEma(value);
  51. }
  52. percentiles(percentiles) {
  53. const values = this._sample
  54. .toArray()
  55. .sort(function (a, b) {
  56. return (a === b)
  57. ? 0
  58. : a - b;
  59. });
  60. const results = {};
  61. for (let i = 0; i < percentiles.length; i++) {
  62. const percentile = percentiles[i];
  63. if (!values.length) {
  64. results[percentile] = null;
  65. continue;
  66. }
  67. const pos = percentile * (values.length + 1);
  68. if (pos < 1) {
  69. results[percentile] = values[0];
  70. }
  71. else if (pos >= values.length) {
  72. results[percentile] = values[values.length - 1];
  73. }
  74. else {
  75. const lower = values[Math.floor(pos) - 1];
  76. const upper = values[Math.ceil(pos) - 1];
  77. results[percentile] = lower + (pos - Math.floor(pos)) * (upper - lower);
  78. }
  79. }
  80. return results;
  81. }
  82. val() {
  83. if (typeof (this._callFn) === 'function') {
  84. return this._callFn();
  85. }
  86. else {
  87. return this._callFn;
  88. }
  89. }
  90. getMin() {
  91. return this._min;
  92. }
  93. getMax() {
  94. return this._max;
  95. }
  96. getSum() {
  97. return this._sum;
  98. }
  99. getCount() {
  100. return this._count;
  101. }
  102. getEma() {
  103. return this._ema;
  104. }
  105. fullResults() {
  106. const percentiles = this.percentiles([0.5, 0.75, 0.95, 0.99, 0.999]);
  107. return {
  108. min: this._min,
  109. max: this._max,
  110. sum: this._sum,
  111. variance: this._calculateVariance(),
  112. mean: this._calculateMean(),
  113. count: this._count,
  114. median: percentiles[0.5],
  115. p75: percentiles[0.75],
  116. p95: percentiles[0.95],
  117. p99: percentiles[0.99],
  118. p999: percentiles[0.999],
  119. ema: this._ema
  120. };
  121. }
  122. _updateMin(value) {
  123. if (this._min === undefined || value < this._min) {
  124. this._min = value;
  125. }
  126. }
  127. _updateMax(value) {
  128. if (this._max === undefined || value > this._max) {
  129. this._max = value;
  130. }
  131. }
  132. _updateVariance(value) {
  133. if (this._count === 1)
  134. return this._varianceM = value;
  135. const oldM = this._varianceM;
  136. this._varianceM += ((value - oldM) / this._count);
  137. this._varianceS += ((value - oldM) * (value - this._varianceM));
  138. }
  139. _updateEma(value) {
  140. if (this._count <= 1)
  141. return this._ema = this._calculateMean();
  142. const alpha = 2 / (1 + this._count);
  143. this._ema = value * alpha + this._ema * (1 - alpha);
  144. }
  145. _calculateMean() {
  146. return (this._count === 0)
  147. ? 0
  148. : this._sum / this._count;
  149. }
  150. _calculateVariance() {
  151. return (this._count <= 1)
  152. ? null
  153. : this._varianceS / (this._count - 1);
  154. }
  155. isUsed() {
  156. return this.used;
  157. }
  158. }
  159. exports.default = Histogram;
  160. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9ncmFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21ldHJpY3MvaGlzdG9ncmFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsZ0NBQXdCO0FBRXhCLE1BQXFCLFNBQVM7SUFrQjVCLFlBQWEsSUFBSztRQWRWLFlBQU8sR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFBO1FBR25CLFdBQU0sR0FBVyxDQUFDLENBQUE7UUFDbEIsU0FBSSxHQUFXLENBQUMsQ0FBQTtRQUloQixlQUFVLEdBQVcsQ0FBQyxDQUFBO1FBQ3RCLGVBQVUsR0FBVyxDQUFDLENBQUE7UUFDdEIsU0FBSSxHQUFXLENBQUMsQ0FBQTtRQUVoQixTQUFJLEdBQVksS0FBSyxDQUFBO1FBRzNCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBRWpCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQTtRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUVuQixNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsRUFBUSxJQUFJLENBQUMsTUFBTTtZQUN0QixHQUFHLEVBQVEsSUFBSSxDQUFDLE1BQU07WUFDdEIsR0FBRyxFQUFRLElBQUksQ0FBQyxNQUFNO1lBQ3RCLEtBQUssRUFBTSxJQUFJLENBQUMsUUFBUTtZQUN4QixRQUFRLEVBQUcsSUFBSSxDQUFDLGtCQUFrQjtZQUNsQyxJQUFJLEVBQU8sSUFBSSxDQUFDLGNBQWM7WUFFOUIsR0FBRyxFQUFRLElBQUksQ0FBQyxNQUFNLEVBQUU7U0FDekIsQ0FBQTtRQUVELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1NBQzFDO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxHQUFHO2dCQUNi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