pandora-metrics
Version:
## Overview
77 lines • 2.59 kB
JavaScript
"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