Add rate() function resistant to counter reset

This commit is contained in:
Alexander Zobnin
2017-06-26 11:26:13 +03:00
parent fa12b04650
commit d6b36772b6
12 changed files with 130 additions and 6 deletions

View File

@@ -3,7 +3,7 @@
System.register(['lodash', './utils', './timeseries'], function (_export, _context) {
"use strict";
var _, utils, ts, downsampleSeries, groupBy, groupBy_exported, sumSeries, delta, scale, SUM, COUNT, AVERAGE, MIN, MAX, MEDIAN, metricFunctions, aggregationFunctions;
var _, utils, ts, downsampleSeries, groupBy, groupBy_exported, sumSeries, delta, rate, scale, SUM, COUNT, AVERAGE, MIN, MAX, MEDIAN, metricFunctions, aggregationFunctions;
function limit(order, n, orderByFunc, timeseries) {
var orderByCallback = aggregationFunctions[orderByFunc];
@@ -100,6 +100,7 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
sumSeries = ts.sumSeries;
delta = ts.delta;
rate = ts.rate;
scale = function scale(factor, datapoints) {
return ts.scale(datapoints, factor);
@@ -115,6 +116,7 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
groupBy: groupByWrapper,
scale: scale,
delta: delta,
rate: rate,
aggregateBy: aggregateByWrapper,
average: _.partial(aggregateWrapper, AVERAGE),
min: _.partial(aggregateWrapper, MIN),

File diff suppressed because one or more lines are too long

View File

@@ -103,6 +103,13 @@ System.register(['lodash', 'jquery'], function (_export, _context) {
defaultParams: []
});
addFuncDef({
name: 'rate',
category: 'Transform',
params: [],
defaultParams: []
});
// Aggregate
addFuncDef({

File diff suppressed because one or more lines are too long

View File

@@ -154,6 +154,10 @@ System.register(['lodash', './utils'], function (_export, _context) {
});
}
/**
* Simple delta. Calculate value delta between points.
* @param {*} datapoints
*/
function delta(datapoints) {
var newSeries = [];
var deltaValue = void 0;
@@ -164,6 +168,33 @@ System.register(['lodash', './utils'], function (_export, _context) {
return newSeries;
}
/**
* Calculates rate per second. Resistant to counter reset.
* @param {*} datapoints
*/
function rate(datapoints) {
var newSeries = [];
var point = void 0,
point_prev = void 0;
var valueDelta = 0;
var timeDelta = 0;
for (var 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) {
@@ -292,6 +323,7 @@ System.register(['lodash', './utils'], function (_export, _context) {
sumSeries: sumSeries,
scale: scale,
delta: delta,
rate: rate,
SUM: SUM,
COUNT: COUNT,
AVERAGE: AVERAGE,

File diff suppressed because one or more lines are too long

View File

@@ -27,6 +27,7 @@ var groupBy_exported = function groupBy_exported(interval, groupFunc, datapoints
};
var sumSeries = _timeseries2.default.sumSeries;
var delta = _timeseries2.default.delta;
var rate = _timeseries2.default.rate;
var scale = function scale(factor, datapoints) {
return _timeseries2.default.scale(datapoints, factor);
};
@@ -119,6 +120,7 @@ var metricFunctions = {
groupBy: groupByWrapper,
scale: scale,
delta: delta,
rate: rate,
aggregateBy: aggregateByWrapper,
average: _lodash2.default.partial(aggregateWrapper, AVERAGE),
min: _lodash2.default.partial(aggregateWrapper, MIN),

View File

@@ -66,6 +66,13 @@ addFuncDef({
defaultParams: []
});
addFuncDef({
name: 'rate',
category: 'Transform',
params: [],
defaultParams: []
});
// Aggregate
addFuncDef({

View File

@@ -22,7 +22,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
* 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.
*
*/
@@ -178,6 +179,10 @@ function scale(datapoints, factor) {
});
}
/**
* Simple delta. Calculate value delta between points.
* @param {*} datapoints
*/
function delta(datapoints) {
var newSeries = [];
var deltaValue = void 0;
@@ -188,6 +193,33 @@ function delta(datapoints) {
return newSeries;
}
/**
* Calculates rate per second. Resistant to counter reset.
* @param {*} datapoints
*/
function rate(datapoints) {
var newSeries = [];
var point = void 0,
point_prev = void 0;
var valueDelta = 0;
var timeDelta = 0;
for (var 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;
_lodash2.default.each(values, function (value) {
@@ -307,6 +339,7 @@ var exportedFunctions = {
sumSeries: sumSeries,
scale: scale,
delta: delta,
rate: rate,
SUM: SUM,
COUNT: COUNT,
AVERAGE: AVERAGE,

View File

@@ -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),

View File

@@ -50,6 +50,13 @@ addFuncDef({
defaultParams: [],
});
addFuncDef({
name: 'rate',
category: 'Transform',
params: [],
defaultParams: [],
});
// Aggregate
addFuncDef({

View File

@@ -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,