Add rate() function resistant to counter reset
This commit is contained in:
4
dist/datasource-zabbix/dataProcessor.js
vendored
4
dist/datasource-zabbix/dataProcessor.js
vendored
@@ -3,7 +3,7 @@
|
|||||||
System.register(['lodash', './utils', './timeseries'], function (_export, _context) {
|
System.register(['lodash', './utils', './timeseries'], function (_export, _context) {
|
||||||
"use strict";
|
"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) {
|
function limit(order, n, orderByFunc, timeseries) {
|
||||||
var orderByCallback = aggregationFunctions[orderByFunc];
|
var orderByCallback = aggregationFunctions[orderByFunc];
|
||||||
@@ -100,6 +100,7 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
|
|||||||
|
|
||||||
sumSeries = ts.sumSeries;
|
sumSeries = ts.sumSeries;
|
||||||
delta = ts.delta;
|
delta = ts.delta;
|
||||||
|
rate = ts.rate;
|
||||||
|
|
||||||
scale = function scale(factor, datapoints) {
|
scale = function scale(factor, datapoints) {
|
||||||
return ts.scale(datapoints, factor);
|
return ts.scale(datapoints, factor);
|
||||||
@@ -115,6 +116,7 @@ System.register(['lodash', './utils', './timeseries'], function (_export, _conte
|
|||||||
groupBy: groupByWrapper,
|
groupBy: groupByWrapper,
|
||||||
scale: scale,
|
scale: scale,
|
||||||
delta: delta,
|
delta: delta,
|
||||||
|
rate: rate,
|
||||||
aggregateBy: aggregateByWrapper,
|
aggregateBy: aggregateByWrapper,
|
||||||
average: _.partial(aggregateWrapper, AVERAGE),
|
average: _.partial(aggregateWrapper, AVERAGE),
|
||||||
min: _.partial(aggregateWrapper, MIN),
|
min: _.partial(aggregateWrapper, MIN),
|
||||||
|
|||||||
2
dist/datasource-zabbix/dataProcessor.js.map
vendored
2
dist/datasource-zabbix/dataProcessor.js.map
vendored
File diff suppressed because one or more lines are too long
7
dist/datasource-zabbix/metricFunctions.js
vendored
7
dist/datasource-zabbix/metricFunctions.js
vendored
@@ -103,6 +103,13 @@ System.register(['lodash', 'jquery'], function (_export, _context) {
|
|||||||
defaultParams: []
|
defaultParams: []
|
||||||
});
|
});
|
||||||
|
|
||||||
|
addFuncDef({
|
||||||
|
name: 'rate',
|
||||||
|
category: 'Transform',
|
||||||
|
params: [],
|
||||||
|
defaultParams: []
|
||||||
|
});
|
||||||
|
|
||||||
// Aggregate
|
// Aggregate
|
||||||
|
|
||||||
addFuncDef({
|
addFuncDef({
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
32
dist/datasource-zabbix/timeseries.js
vendored
32
dist/datasource-zabbix/timeseries.js
vendored
@@ -154,6 +154,10 @@ System.register(['lodash', './utils'], function (_export, _context) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple delta. Calculate value delta between points.
|
||||||
|
* @param {*} datapoints
|
||||||
|
*/
|
||||||
function delta(datapoints) {
|
function delta(datapoints) {
|
||||||
var newSeries = [];
|
var newSeries = [];
|
||||||
var deltaValue = void 0;
|
var deltaValue = void 0;
|
||||||
@@ -164,6 +168,33 @@ System.register(['lodash', './utils'], function (_export, _context) {
|
|||||||
return newSeries;
|
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) {
|
function SUM(values) {
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
_.each(values, function (value) {
|
_.each(values, function (value) {
|
||||||
@@ -292,6 +323,7 @@ System.register(['lodash', './utils'], function (_export, _context) {
|
|||||||
sumSeries: sumSeries,
|
sumSeries: sumSeries,
|
||||||
scale: scale,
|
scale: scale,
|
||||||
delta: delta,
|
delta: delta,
|
||||||
|
rate: rate,
|
||||||
SUM: SUM,
|
SUM: SUM,
|
||||||
COUNT: COUNT,
|
COUNT: COUNT,
|
||||||
AVERAGE: AVERAGE,
|
AVERAGE: AVERAGE,
|
||||||
|
|||||||
2
dist/datasource-zabbix/timeseries.js.map
vendored
2
dist/datasource-zabbix/timeseries.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/test/datasource-zabbix/dataProcessor.js
vendored
2
dist/test/datasource-zabbix/dataProcessor.js
vendored
@@ -27,6 +27,7 @@ var groupBy_exported = function groupBy_exported(interval, groupFunc, datapoints
|
|||||||
};
|
};
|
||||||
var sumSeries = _timeseries2.default.sumSeries;
|
var sumSeries = _timeseries2.default.sumSeries;
|
||||||
var delta = _timeseries2.default.delta;
|
var delta = _timeseries2.default.delta;
|
||||||
|
var rate = _timeseries2.default.rate;
|
||||||
var scale = function scale(factor, datapoints) {
|
var scale = function scale(factor, datapoints) {
|
||||||
return _timeseries2.default.scale(datapoints, factor);
|
return _timeseries2.default.scale(datapoints, factor);
|
||||||
};
|
};
|
||||||
@@ -119,6 +120,7 @@ var metricFunctions = {
|
|||||||
groupBy: groupByWrapper,
|
groupBy: groupByWrapper,
|
||||||
scale: scale,
|
scale: scale,
|
||||||
delta: delta,
|
delta: delta,
|
||||||
|
rate: rate,
|
||||||
aggregateBy: aggregateByWrapper,
|
aggregateBy: aggregateByWrapper,
|
||||||
average: _lodash2.default.partial(aggregateWrapper, AVERAGE),
|
average: _lodash2.default.partial(aggregateWrapper, AVERAGE),
|
||||||
min: _lodash2.default.partial(aggregateWrapper, MIN),
|
min: _lodash2.default.partial(aggregateWrapper, MIN),
|
||||||
|
|||||||
@@ -66,6 +66,13 @@ addFuncDef({
|
|||||||
defaultParams: []
|
defaultParams: []
|
||||||
});
|
});
|
||||||
|
|
||||||
|
addFuncDef({
|
||||||
|
name: 'rate',
|
||||||
|
category: 'Transform',
|
||||||
|
params: [],
|
||||||
|
defaultParams: []
|
||||||
|
});
|
||||||
|
|
||||||
// Aggregate
|
// Aggregate
|
||||||
|
|
||||||
addFuncDef({
|
addFuncDef({
|
||||||
|
|||||||
35
dist/test/datasource-zabbix/timeseries.js
vendored
35
dist/test/datasource-zabbix/timeseries.js
vendored
@@ -22,7 +22,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|||||||
* This module contains functions for working with time series.
|
* 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
|
* 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) {
|
function delta(datapoints) {
|
||||||
var newSeries = [];
|
var newSeries = [];
|
||||||
var deltaValue = void 0;
|
var deltaValue = void 0;
|
||||||
@@ -188,6 +193,33 @@ function delta(datapoints) {
|
|||||||
return newSeries;
|
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) {
|
function SUM(values) {
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
_lodash2.default.each(values, function (value) {
|
_lodash2.default.each(values, function (value) {
|
||||||
@@ -307,6 +339,7 @@ var exportedFunctions = {
|
|||||||
sumSeries: sumSeries,
|
sumSeries: sumSeries,
|
||||||
scale: scale,
|
scale: scale,
|
||||||
delta: delta,
|
delta: delta,
|
||||||
|
rate: rate,
|
||||||
SUM: SUM,
|
SUM: SUM,
|
||||||
COUNT: COUNT,
|
COUNT: COUNT,
|
||||||
AVERAGE: AVERAGE,
|
AVERAGE: AVERAGE,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ let groupBy = ts.groupBy_perf;
|
|||||||
let groupBy_exported = (interval, groupFunc, datapoints) => groupBy(datapoints, interval, groupFunc);
|
let groupBy_exported = (interval, groupFunc, datapoints) => groupBy(datapoints, interval, groupFunc);
|
||||||
let sumSeries = ts.sumSeries;
|
let sumSeries = ts.sumSeries;
|
||||||
let delta = ts.delta;
|
let delta = ts.delta;
|
||||||
|
let rate = ts.rate;
|
||||||
let scale = (factor, datapoints) => ts.scale(datapoints, factor);
|
let scale = (factor, datapoints) => ts.scale(datapoints, factor);
|
||||||
|
|
||||||
let SUM = ts.SUM;
|
let SUM = ts.SUM;
|
||||||
@@ -100,6 +101,7 @@ let metricFunctions = {
|
|||||||
groupBy: groupByWrapper,
|
groupBy: groupByWrapper,
|
||||||
scale: scale,
|
scale: scale,
|
||||||
delta: delta,
|
delta: delta,
|
||||||
|
rate: rate,
|
||||||
aggregateBy: aggregateByWrapper,
|
aggregateBy: aggregateByWrapper,
|
||||||
average: _.partial(aggregateWrapper, AVERAGE),
|
average: _.partial(aggregateWrapper, AVERAGE),
|
||||||
min: _.partial(aggregateWrapper, MIN),
|
min: _.partial(aggregateWrapper, MIN),
|
||||||
|
|||||||
@@ -50,6 +50,13 @@ addFuncDef({
|
|||||||
defaultParams: [],
|
defaultParams: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
addFuncDef({
|
||||||
|
name: 'rate',
|
||||||
|
category: 'Transform',
|
||||||
|
params: [],
|
||||||
|
defaultParams: [],
|
||||||
|
});
|
||||||
|
|
||||||
// Aggregate
|
// Aggregate
|
||||||
|
|
||||||
addFuncDef({
|
addFuncDef({
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
* This module contains functions for working with time series.
|
* 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
|
* 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) {
|
function delta(datapoints) {
|
||||||
let newSeries = [];
|
let newSeries = [];
|
||||||
let deltaValue;
|
let deltaValue;
|
||||||
@@ -178,6 +183,32 @@ function delta(datapoints) {
|
|||||||
return newSeries;
|
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) {
|
function SUM(values) {
|
||||||
var sum = 0;
|
var sum = 0;
|
||||||
_.each(values, function (value) {
|
_.each(values, function (value) {
|
||||||
@@ -297,6 +328,7 @@ const exportedFunctions = {
|
|||||||
sumSeries,
|
sumSeries,
|
||||||
scale,
|
scale,
|
||||||
delta,
|
delta,
|
||||||
|
rate,
|
||||||
SUM,
|
SUM,
|
||||||
COUNT,
|
COUNT,
|
||||||
AVERAGE,
|
AVERAGE,
|
||||||
|
|||||||
Reference in New Issue
Block a user