Просмотр исходного кода

Merge branch 'utkarshcmu-ms-detection'

bergquist 9 лет назад
Родитель
Сommit
39354249e9

+ 12 - 0
public/app/core/time_series2.ts

@@ -168,4 +168,16 @@ export default class TimeSeries {
   formatValue(value) {
     return this.valueFormater(value, this.decimals, this.scaledDecimals);
   }
+
+  isMsResolutionNeeded() {
+    for (var i = 0; i<this.datapoints.length; i++) {
+      if (this.datapoints[i][0] !== null) {
+        var timestamp = this.datapoints[i][0].toString();
+        if (timestamp.length === 13 && (timestamp % 1000) !== 0) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
 }

+ 9 - 3
public/app/plugins/panel/graph/graph_tooltip.js

@@ -109,7 +109,13 @@ function ($) {
       var plot = elem.data().plot;
       var plotData = plot.getData();
       var seriesList = getSeriesFn();
-      var group, value, absoluteTime, relativeTime, hoverInfo, i, series, seriesHtml;
+      var group, value, absoluteTime, relativeTime, hoverInfo, i, series, seriesHtml, tooltipFormat;
+
+      if (panel.tooltip.msResolution) {
+        tooltipFormat = 'YYYY-MM-DD HH:mm:ss.SSS';
+      } else {
+        tooltipFormat = 'YYYY-MM-DD HH:mm:ss';
+      }
 
       if (dashboard.sharedCrosshair) {
         ctrl.publishAppEvent('setCrosshair', { pos: pos, scope: scope });
@@ -127,7 +133,7 @@ function ($) {
         seriesHtml = '';
 
         relativeTime = dashboard.getRelativeTime(seriesHoverInfo.time);
-        absoluteTime = dashboard.formatDate(seriesHoverInfo.time);
+        absoluteTime = dashboard.formatDate(seriesHoverInfo.time, tooltipFormat);
 
         for (i = 0; i < seriesHoverInfo.length; i++) {
           hoverInfo = seriesHoverInfo[i];
@@ -164,7 +170,7 @@ function ($) {
         value = series.formatValue(value);
 
         relativeTime = dashboard.getRelativeTime(item.datapoint[0]);
-        absoluteTime = dashboard.formatDate(item.datapoint[0]);
+        absoluteTime = dashboard.formatDate(item.datapoint[0], tooltipFormat);
 
         group += '<div class="graph-tooltip-value">' + value + '</div>';
 

+ 3 - 0
public/app/plugins/panel/graph/module.ts

@@ -69,6 +69,7 @@ var panelDefaults = {
   tooltip       : {
     value_type: 'cumulative',
     shared: true,
+    msResolution: false,
   },
   // time overrides
   timeFrom: null,
@@ -200,6 +201,8 @@ class GraphCtrl extends MetricsPanelCtrl {
       }
 
       this.datapointsCount += datapoints.length;
+
+      this.panel.tooltip.msResolution = this.panel.tooltip.msResolution || series.isMsResolutionNeeded();
     }
 
     return series;

+ 74 - 0
public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts

@@ -43,4 +43,78 @@ describe('GraphCtrl', function() {
 
     });
   });
+
+  describe('msResolution with second resolution timestamps', function() {
+    beforeEach(function() {
+      ctx.datasource.query = sinon.stub().returns(ctx.$q.when({
+        data: [
+          { target: 'test.cpu1', datapoints: [[1234567890, 45], [1234567899, 60]]},
+          { target: 'test.cpu2', datapoints: [[1236547890, 55], [1234456709, 90]]}
+        ]
+      }));
+      ctx.ctrl.panel.tooltip.msResolution = false;
+      ctx.ctrl.refreshData(ctx.datasource);
+      ctx.scope.$digest();
+    });
+
+    it('should not show millisecond resolution tooltip', function() {
+      expect(ctx.ctrl.panel.tooltip.msResolution).to.be(false);
+    });
+  });
+
+  describe('msResolution with millisecond resolution timestamps', function() {
+    beforeEach(function() {
+      ctx.datasource.query = sinon.stub().returns(ctx.$q.when({
+        data: [
+          { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]},
+          { target: 'test.cpu2', datapoints: [[1236547890001, 55], [1234456709000, 90]]}
+        ]
+      }));
+      ctx.ctrl.panel.tooltip.msResolution = false;
+      ctx.ctrl.refreshData(ctx.datasource);
+      ctx.scope.$digest();
+    });
+
+    it('should show millisecond resolution tooltip', function() {
+      expect(ctx.ctrl.panel.tooltip.msResolution).to.be(true);
+    });
+  });
+
+  describe('msResolution with millisecond resolution timestamps but with trailing zeroes', function() {
+    beforeEach(function() {
+      ctx.datasource.query = sinon.stub().returns(ctx.$q.when({
+        data: [
+          { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]},
+          { target: 'test.cpu2', datapoints: [[1236547890000, 55], [1234456709000, 90]]}
+        ]
+      }));
+      ctx.ctrl.panel.tooltip.msResolution = false;
+      ctx.ctrl.refreshData(ctx.datasource);
+      ctx.scope.$digest();
+    });
+
+    it('should not show millisecond resolution tooltip', function() {
+      expect(ctx.ctrl.panel.tooltip.msResolution).to.be(false);
+    });
+  });
+
+  describe('msResolution with millisecond resolution timestamps in one of the series', function() {
+    beforeEach(function() {
+      ctx.datasource.query = sinon.stub().returns(ctx.$q.when({
+        data: [
+          { target: 'test.cpu1', datapoints: [[1234567890000, 45], [1234567899000, 60]]},
+          { target: 'test.cpu2', datapoints: [[1236547890010, 55], [1234456709000, 90]]},
+          { target: 'test.cpu3', datapoints: [[1236547890000, 65], [1234456709000, 120]]}
+        ]
+      }));
+      ctx.ctrl.panel.tooltip.msResolution = false;
+      ctx.ctrl.refreshData(ctx.datasource);
+      ctx.scope.$digest();
+    });
+
+    it('should show millisecond resolution tooltip', function() {
+      expect(ctx.ctrl.panel.tooltip.msResolution).to.be(true);
+    });
+  });
+
 });

+ 20 - 2
public/test/core/time_series_specs.js

@@ -56,6 +56,26 @@ define([
       });
     });
 
+    describe('can detect if serie contains ms precision', function() {
+      var fakedata;
+
+      beforeEach(function() {
+        fakedata = testData;
+      });
+
+      it('missing datapoint with ms precision', function() {
+        fakedata.datapoints[0] = [1234567890000, 1337];
+        series = new TimeSeries(fakedata);
+        expect(series.isMsResolutionNeeded()).to.be(false);
+      });
+
+      it('contains datapoint with ms precision', function() {
+        fakedata.datapoints[0] = [1236547890001, 1337];
+        series = new TimeSeries(fakedata);
+        expect(series.isMsResolutionNeeded()).to.be(true);
+      });
+    });
+
     describe('series overrides', function() {
       var series;
       beforeEach(function() {
@@ -148,7 +168,5 @@ define([
       });
 
     });
-
   });
-
 });

+ 22 - 0
public/test/specs/dashboardSrv-specs.js

@@ -323,5 +323,27 @@ define([
       });
     });
 
+    describe('Formatting epoch timestamp when timezone is set as utc', function() {
+      var dashboard;
+
+      beforeEach(function() {
+        dashboard = _dashboardSrv.create({
+          timezone: 'utc',
+        });
+      });
+
+      it('Should format timestamp with second resolution by default', function() {
+        expect(dashboard.formatDate(1234567890000)).to.be('2009-02-13 23:31:30');
+      });
+
+      it('Should format timestamp with second resolution even if second format is passed as parameter', function() {
+        expect(dashboard.formatDate(1234567890007,'YYYY-MM-DD HH:mm:ss')).to.be('2009-02-13 23:31:30');
+      });
+
+      it('Should format timestamp with millisecond resolution if format is passed as parameter', function() {
+        expect(dashboard.formatDate(1234567890007,'YYYY-MM-DD HH:mm:ss.SSS')).to.be('2009-02-13 23:31:30.007');
+      });
+    });
+
   });
 });