Commit b6ac0860 by bergquist

Merge branch 'ms-detection' of https://github.com/utkarshcmu/grafana into utkarshcmu-ms-detection

parents 00dc0783 75541b9c
...@@ -168,4 +168,14 @@ export default class TimeSeries { ...@@ -168,4 +168,14 @@ export default class TimeSeries {
formatValue(value) { formatValue(value) {
return this.valueFormater(value, this.decimals, this.scaledDecimals); return this.valueFormater(value, this.decimals, this.scaledDecimals);
} }
isMsResolutionNeeded() {
for (var i = 0; i<this.datapoints.length; i++) {
var timestamp = this.datapoints[i][0].toString();
if (timestamp.length === 13 && (timestamp % 1000) !== 0) {
return true;
}
}
return false;
}
} }
...@@ -109,7 +109,13 @@ function ($) { ...@@ -109,7 +109,13 @@ function ($) {
var plot = elem.data().plot; var plot = elem.data().plot;
var plotData = plot.getData(); var plotData = plot.getData();
var seriesList = getSeriesFn(); 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) { if (dashboard.sharedCrosshair) {
ctrl.publishAppEvent('setCrosshair', { pos: pos, scope: scope }); ctrl.publishAppEvent('setCrosshair', { pos: pos, scope: scope });
...@@ -127,7 +133,7 @@ function ($) { ...@@ -127,7 +133,7 @@ function ($) {
seriesHtml = ''; seriesHtml = '';
relativeTime = dashboard.getRelativeTime(seriesHoverInfo.time); relativeTime = dashboard.getRelativeTime(seriesHoverInfo.time);
absoluteTime = dashboard.formatDate(seriesHoverInfo.time); absoluteTime = dashboard.formatDate(seriesHoverInfo.time, tooltipFormat);
for (i = 0; i < seriesHoverInfo.length; i++) { for (i = 0; i < seriesHoverInfo.length; i++) {
hoverInfo = seriesHoverInfo[i]; hoverInfo = seriesHoverInfo[i];
...@@ -164,7 +170,7 @@ function ($) { ...@@ -164,7 +170,7 @@ function ($) {
value = series.formatValue(value); value = series.formatValue(value);
relativeTime = dashboard.getRelativeTime(item.datapoint[0]); 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>'; group += '<div class="graph-tooltip-value">' + value + '</div>';
......
...@@ -69,6 +69,7 @@ var panelDefaults = { ...@@ -69,6 +69,7 @@ var panelDefaults = {
tooltip : { tooltip : {
value_type: 'cumulative', value_type: 'cumulative',
shared: true, shared: true,
msResolution: false,
}, },
// time overrides // time overrides
timeFrom: null, timeFrom: null,
...@@ -200,6 +201,8 @@ class GraphCtrl extends MetricsPanelCtrl { ...@@ -200,6 +201,8 @@ class GraphCtrl extends MetricsPanelCtrl {
} }
this.datapointsCount += datapoints.length; this.datapointsCount += datapoints.length;
this.panel.tooltip.msResolution = this.panel.tooltip.msResolution || series.isMsResolutionNeeded();
} }
return series; return series;
......
...@@ -43,4 +43,78 @@ describe('GraphCtrl', function() { ...@@ -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);
});
});
}); });
...@@ -323,5 +323,27 @@ define([ ...@@ -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');
});
});
}); });
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment