UNPKG

pandora-metrics

Version:
77 lines 2.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const MetricType_1 = require("../MetricType"); const EWMA_1 = require("../util/EWMA"); const BucketCounter_1 = require("./BucketCounter"); const DEFAULT_NUM_OF_BUCKET = 10; const TICK_INTERVAL = 5000; // 5s /** * A meter metric which measures mean throughput and one-, five-, and fifteen-minute * exponentially-weighted moving average throughputs. * * @see EWMA */ class BaseMeter { constructor(interval = 1, numberOfBucket = DEFAULT_NUM_OF_BUCKET) { this.type = MetricType_1.MetricType.METER; this.m1Rate = EWMA_1.EWMA.oneMinuteEWMA(); this.m5Rate = EWMA_1.EWMA.fiveMinuteEWMA(); this.m15Rate = EWMA_1.EWMA.fifteenMinuteEWMA(); this.uncounted = 0; this.startTime = this.lastTick = Date.now(); this.bucketCounter = new BucketCounter_1.BucketCounter(interval, numberOfBucket); } tickIfNecessary() { let newTick = Date.now(); let oldTick = this.lastTick; let age = newTick - oldTick; if (age > TICK_INTERVAL) { let newIntervalStartTick = newTick - age % TICK_INTERVAL; if (oldTick < newIntervalStartTick) { this.lastTick = newIntervalStartTick; let requiredTicks = age / TICK_INTERVAL; for (let i = 0; i < requiredTicks; i++) { this.m1Rate.tick(this.uncounted); this.m5Rate.tick(this.uncounted); this.m15Rate.tick(this.uncounted); this.uncounted = 0; } } } } mark(n = 1) { this.tickIfNecessary(); this.uncounted += n; this.bucketCounter.update(n); } getCount() { return this.bucketCounter.getCount(); } getInstantCount(startTime) { return this.bucketCounter.getBucketCounts(startTime); } getInstantCountInterval() { return this.bucketCounter.getBucketInterval(); } getFifteenMinuteRate() { this.tickIfNecessary(); return this.m15Rate.getRate(); } getFiveMinuteRate() { this.tickIfNecessary(); return this.m5Rate.getRate(); } getMeanRate() { if (this.getCount() === 0) { return 0; } let elapsed = Date.now() - this.startTime; return this.getCount() / elapsed * 1000; } getOneMinuteRate() { this.tickIfNecessary(); return this.m1Rate.getRate(); } } exports.BaseMeter = BaseMeter; //# sourceMappingURL=Meter.js.map