Add rate() function resistant to counter reset
This commit is contained in:
@@ -7,6 +7,7 @@ let groupBy = ts.groupBy_perf;
|
||||
let groupBy_exported = (interval, groupFunc, datapoints) => groupBy(datapoints, interval, groupFunc);
|
||||
let sumSeries = ts.sumSeries;
|
||||
let delta = ts.delta;
|
||||
let rate = ts.rate;
|
||||
let scale = (factor, datapoints) => ts.scale(datapoints, factor);
|
||||
|
||||
let SUM = ts.SUM;
|
||||
@@ -100,6 +101,7 @@ let metricFunctions = {
|
||||
groupBy: groupByWrapper,
|
||||
scale: scale,
|
||||
delta: delta,
|
||||
rate: rate,
|
||||
aggregateBy: aggregateByWrapper,
|
||||
average: _.partial(aggregateWrapper, AVERAGE),
|
||||
min: _.partial(aggregateWrapper, MIN),
|
||||
|
||||
@@ -50,6 +50,13 @@ addFuncDef({
|
||||
defaultParams: [],
|
||||
});
|
||||
|
||||
addFuncDef({
|
||||
name: 'rate',
|
||||
category: 'Transform',
|
||||
params: [],
|
||||
defaultParams: [],
|
||||
});
|
||||
|
||||
// Aggregate
|
||||
|
||||
addFuncDef({
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
* This module contains functions for working with time series.
|
||||
*
|
||||
* datapoints - array of points where point is [value, timestamp]. In almost all cases (if other wasn't
|
||||
* explicitly said) we assume datapoints are sorted by timestamp.
|
||||
* explicitly said) we assume datapoints are sorted by timestamp. Timestamp is the number of milliseconds
|
||||
* since 1 January 1970 00:00:00 UTC.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -168,6 +169,10 @@ function scale(datapoints, factor) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple delta. Calculate value delta between points.
|
||||
* @param {*} datapoints
|
||||
*/
|
||||
function delta(datapoints) {
|
||||
let newSeries = [];
|
||||
let deltaValue;
|
||||
@@ -178,6 +183,32 @@ function delta(datapoints) {
|
||||
return newSeries;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates rate per second. Resistant to counter reset.
|
||||
* @param {*} datapoints
|
||||
*/
|
||||
function rate(datapoints) {
|
||||
let newSeries = [];
|
||||
let point, point_prev;
|
||||
let valueDelta = 0;
|
||||
let timeDelta = 0;
|
||||
for (let i = 1; i < datapoints.length; i++) {
|
||||
point = datapoints[i];
|
||||
point_prev = datapoints[i - 1];
|
||||
|
||||
// Convert ms to seconds
|
||||
timeDelta = (point[POINT_TIMESTAMP] - point_prev[POINT_TIMESTAMP]) / 1000;
|
||||
|
||||
// Handle counter reset - use previous value
|
||||
if (point[POINT_VALUE] >= point_prev[POINT_VALUE]) {
|
||||
valueDelta = (point[POINT_VALUE] - point_prev[POINT_VALUE]) / timeDelta;
|
||||
}
|
||||
|
||||
newSeries.push([valueDelta, point[POINT_TIMESTAMP]]);
|
||||
}
|
||||
return newSeries;
|
||||
}
|
||||
|
||||
function SUM(values) {
|
||||
var sum = 0;
|
||||
_.each(values, function (value) {
|
||||
@@ -297,6 +328,7 @@ const exportedFunctions = {
|
||||
sumSeries,
|
||||
scale,
|
||||
delta,
|
||||
rate,
|
||||
SUM,
|
||||
COUNT,
|
||||
AVERAGE,
|
||||
|
||||
Reference in New Issue
Block a user