Преглед изворни кода

first, delta, range passing unit tests

Signed-off-by: Dirk le Roux <dirk.leroux@gmail.com>
Dirk le Roux пре 9 година
родитељ
комит
49dda7e5c1

+ 26 - 0
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;

+ 1 - 1
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 = {

+ 57 - 0
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);