diff --git a/public/app/core/time_series2.ts b/public/app/core/time_series2.ts index ef2e6b9c8b2..fef4efdd373 100644 --- a/public/app/core/time_series2.ts +++ b/public/app/core/time_series2.ts @@ -168,4 +168,14 @@ export default class TimeSeries { formatValue(value) { return this.valueFormater(value, this.decimals, this.scaledDecimals); } + + isMsResolutionNeeded() { + for (var i = 0; i'; diff --git a/public/app/plugins/panel/graph/module.ts b/public/app/plugins/panel/graph/module.ts index 357da9b6877..bf89648b717 100644 --- a/public/app/plugins/panel/graph/module.ts +++ b/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; diff --git a/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts b/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts index de26448ec71..e46459e2249 100644 --- a/public/app/plugins/panel/graph/specs/graph_ctrl_specs.ts +++ b/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); + }); + }); + }); diff --git a/public/test/specs/dashboardSrv-specs.js b/public/test/specs/dashboardSrv-specs.js index e2bbdaf4ac3..8f455864650 100644 --- a/public/test/specs/dashboardSrv-specs.js +++ b/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'); + }); + }); + }); });