From 49dda7e5c1961c59218d75efc90284c156517042 Mon Sep 17 00:00:00 2001 From: Dirk le Roux Date: Wed, 23 Nov 2016 10:02:18 +0200 Subject: [PATCH] first, delta, range passing unit tests Signed-off-by: Dirk le Roux --- public/app/core/time_series2.ts | 26 +++++++++ public/app/plugins/panel/singlestat/module.ts | 2 +- public/test/core/time_series_specs.js | 57 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/public/app/core/time_series2.ts b/public/app/core/time_series2.ts index 25a99a38ad8..4503be68710 100644 --- a/public/app/core/time_series2.ts +++ b/public/app/core/time_series2.ts @@ -102,6 +102,9 @@ export default class TimeSeries { this.stats.min = Number.MAX_VALUE; this.stats.avg = null; this.stats.current = null; + this.stats.first = null; + this.stats.delta = 0; + this.stats.range = null; this.stats.timeStep = Number.MAX_VALUE; this.allIsNull = true; this.allIsZero = true; @@ -112,6 +115,8 @@ export default class TimeSeries { var currentValue; var nonNulls = 0; var previousTime; + var previousValue = 0; + var previousDeltaUp = true; for (var i = 0; i < this.datapoints.length; i++) { currentValue = this.datapoints[i][0]; @@ -148,6 +153,24 @@ export default class TimeSeries { if (currentValue < this.stats.min) { this.stats.min = currentValue; } + if (this.stats.first === null){ + this.stats.first = currentValue; + }else{ + if (previousValue > currentValue) { // counter reset + previousDeltaUp = false; + if (i === this.datapoints.length-1) { // reset on last + this.stats.delta += currentValue; + } + }else{ + if (previousDeltaUp) { + this.stats.delta += currentValue - previousValue; // normal increment + } else { + this.stats.delta += currentValue; // account for counter reset + } + previousDeltaUp = true; + } + } + previousValue = currentValue; } if (currentValue !== 0) { @@ -167,6 +190,9 @@ export default class TimeSeries { this.stats.current = result[result.length-2][1]; } } + if (this.stats.max !== null && this.stats.min !== null) { + this.stats.range = this.stats.max - this.stats.min; + } this.stats.count = result.length; return result; diff --git a/public/app/plugins/panel/singlestat/module.ts b/public/app/plugins/panel/singlestat/module.ts index 3af89abf1d7..1da40ddd25e 100644 --- a/public/app/plugins/panel/singlestat/module.ts +++ b/public/app/plugins/panel/singlestat/module.ts @@ -21,7 +21,7 @@ class SingleStatCtrl extends MetricsPanelCtrl { invalidGaugeRange: boolean; panel: any; events: any; - valueNameOptions: any[] = ['min','max','avg', 'current', 'total', 'name']; + valueNameOptions: any[] = ['min','max','avg', 'current', 'total', 'name', 'first', 'delta', 'range']; // Set and populate defaults panelDefaults = { diff --git a/public/test/core/time_series_specs.js b/public/test/core/time_series_specs.js index 2b325cf6d46..829f74d3515 100644 --- a/public/test/core/time_series_specs.js +++ b/public/test/core/time_series_specs.js @@ -49,6 +49,63 @@ define([ expect(series.stats.avg).to.be(6.333333333333333); }); + it('the delta value should account for nulls', function() { + series = new TimeSeries({ + datapoints: [[1,2],[3,3],[null,4],[10,5],[15,6]] + }); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.delta).to.be(14); + }); + + it('the delta value should account for nulls on first', function() { + series = new TimeSeries({ + datapoints: [[null,2],[1,3],[10,4],[15,5]] + }); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.delta).to.be(14); + }); + + it('the delta value should account for nulls on last', function() { + series = new TimeSeries({ + datapoints: [[1,2],[5,3],[10,4],[null,5]] + }); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.delta).to.be(9); + }); + + it('the delta value should account for resets', function() { + series = new TimeSeries({ + datapoints: [[1,2],[5,3],[10,4],[0,5],[10,6]] + }); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.delta).to.be(19); + }); + + it('the delta value should account for resets on last', function() { + series = new TimeSeries({ + datapoints: [[1,2],[2,3],[10,4],[8,5]] + }); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.delta).to.be(17); + }); + + it('the range value should be max - min', function() { + series = new TimeSeries(testData); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.range).to.be(9); + }); + + it('first value should ingone nulls', function() { + series = new TimeSeries(testData); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.first).to.be(1); + series = new TimeSeries({ + datapoints: [[null,2],[1,3],[10,4],[8,5]] + }); + series.getFlotPairs('null', yAxisFormats); + expect(series.stats.first).to.be(1); + }); + it('with null as zero style, average value should treat nulls as 0', function() { series = new TimeSeries(testData); series.getFlotPairs('null as zero', yAxisFormats);