const { MetricTypes } = require('./Metric'); const TimeUnits = require('../util/units'); /** * A Cached Gauge takes a function that returns a promise that resolves a * value that should be cached and updated on a given interval. * * toJSON() will return the currently cached value. * * @example * const cpuAverageCachedGauge = new CachedGauge(() => { * return new Promise(resolve => { * //Grab first CPU Measure * const startMeasure = cpuAverage(); * setTimeout(() => { * //Grab second Measure * const endMeasure = cpuAverage(); * const percentageCPU = calculateCpuUsagePercent(startMeasure, endMeasure); * resolve(percentageCPU); * }, sampleTimeInSeconds); * }); * }, updateIntervalInSeconds); * * @implements {Metric} */ class CachedGauge { /** * @param {function} valueProducingPromiseCallback A function that returns a promise than when * resolved supplies the value that should be cached in this gauge. * @param {number} updateIntervalInSeconds How often the cached gauge should update it's value. * @param {number} [timeUnitOverride] by default this function takes updateIntervalInSeconds and multiplies it by TimeUnits.SECONDS (1000), * You can override it here. */ constructor(valueProducingPromiseCallback, updateIntervalInSeconds, timeUnitOverride) { const timeUnit = timeUnitOverride || TimeUnits.SECONDS; this._valueProducingPromiseCallback = valueProducingPromiseCallback; this._value = 0; this._updateValue(); this._interval = setInterval(() => { this._updateValue(); }, updateIntervalInSeconds * timeUnit); } /** * Calls the promise producing callback and sets the value when it gets resolved. * @private */ _updateValue() { this._valueProducingPromiseCallback().then(value => { this._value = value; }); } /** * @return {number} Gauges directly return the value which should be a number. */ toJSON() { return this._value; } /** * The type of the Metric Impl. {@link MetricTypes}. * @return {string} The type of the Metric Impl. */ getType() { return MetricTypes.GAUGE; } /** * Clears the interval, so that it doesn't keep any processes alive. */ end() { clearInterval(this._interval); this._interval = null; } } module.exports = CachedGauge;