diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1e1f1f9aade..dc509eb001a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@
- Dashboard title change & save will no longer create a new dashboard, it will just change the title.
**Enhancements**
+- [Issue #978](https://github.com/grafana/grafana/issues/978). Graph: Shared tooltip improvement, can now support metrics of different resolution/intervals
- [Issue #1297](https://github.com/grafana/grafana/issues/1297). Graphite: Added cumulative and minimumBelow graphite functions
- [Issue #1296](https://github.com/grafana/grafana/issues/1296). InfluxDB: Auto escape column names with special characters. Thanks @steven-aerts
- [Issue #1321](https://github.com/grafana/grafana/issues/1321). SingleStatPanel: You can now use template variables in pre & postfix
diff --git a/src/app/panels/graph/graph.tooltip.js b/src/app/panels/graph/graph.tooltip.js
index 9e0ff0b8c7b..d4690bea96d 100644
--- a/src/app/panels/graph/graph.tooltip.js
+++ b/src/app/panels/graph/graph.tooltip.js
@@ -9,7 +9,7 @@ function ($) {
var $tooltip = $('
');
- this.findHoverIndexFromDataPoints = function(posX, series,last) {
+ this.findHoverIndexFromDataPoints = function(posX, series, last) {
var ps = series.datapoints.pointsize;
var initial = last*ps;
var len = series.datapoints.points.length;
@@ -38,34 +38,10 @@ function ($) {
};
this.getMultiSeriesPlotHoverInfo = function(seriesList, pos) {
- var value, i, series, hoverIndex, seriesTmp;
+ var value, i, series, hoverIndex;
var results = [];
- var pointCount;
- for (i = 0; i < seriesList.length; i++) {
- seriesTmp = seriesList[i];
- if (!seriesTmp.data.length) { continue; }
-
- if (!pointCount) {
- series = seriesTmp;
- pointCount = series.data.length;
- continue;
- }
-
- if (seriesTmp.data.length !== pointCount) {
- results.pointCountMismatch = true;
- return results;
- }
- }
-
- hoverIndex = this.findHoverIndexFromData(pos.x, series);
- var lasthoverIndex = 0;
- if(!scope.panel.steppedLine) {
- lasthoverIndex = hoverIndex;
- }
-
//now we know the current X (j) position for X and Y values
- results.time = series.data[hoverIndex][0];
var last_value = 0; //needed for stacked values
for (i = 0; i < seriesList.length; i++) {
@@ -76,6 +52,9 @@ function ($) {
continue;
}
+ hoverIndex = this.findHoverIndexFromData(pos.x, series);
+ results.time = series.data[hoverIndex][0];
+
if (scope.panel.stack) {
if (scope.panel.tooltip.value_type === 'individual') {
value = series.data[hoverIndex][1];
@@ -90,19 +69,9 @@ function ($) {
// Highlighting multiple Points depending on the plot type
if (scope.panel.steppedLine || (scope.panel.stack && scope.panel.nullPointMode == "null")) {
// stacked and steppedLine plots can have series with different length.
- // Stacked series can increase its length on each new stacked serie if null points found,
- // to speed the index search we begin always on the las found hoverIndex.
- var newhoverIndex = this.findHoverIndexFromDataPoints(pos.x, series,lasthoverIndex);
- // update lasthoverIndex depends also on the plot type.
- if(!scope.panel.steppedLine) {
- // on stacked graphs new will be always greater than last
- lasthoverIndex = newhoverIndex;
- } else {
- // if steppeLine, not always series increases its length, so we should begin
- // to search correct index from the original hoverIndex on each serie.
- lasthoverIndex = hoverIndex;
- }
-
+ // Stacked series can increase its length on each new stacked serie if null points found,
+ // to speed the index search we begin always on the last found hoverIndex.
+ var newhoverIndex = this.findHoverIndexFromDataPoints(pos.x, series, hoverIndex);
results.push({ value: value, hoverIndex: newhoverIndex});
} else {
results.push({ value: value, hoverIndex: hoverIndex});
@@ -141,13 +110,6 @@ function ($) {
plot.unhighlight();
var seriesHoverInfo = self.getMultiSeriesPlotHoverInfo(plotData, pos);
- if (seriesHoverInfo.pointCountMismatch) {
- self.showTooltip('Shared tooltip error', '
' +
- '- Series point counts are not the same
' +
- '- Set null point mode to null or null as zero
' +
- '- For influxdb users set fill(0) in your query
', pos);
- return;
- }
seriesHtml = '';
timestamp = dashboard.formatDate(seriesHoverInfo.time);
diff --git a/src/test/specs/graph-tooltip-specs.js b/src/test/specs/graph-tooltip-specs.js
index 155469f18a7..da02b9f2e0a 100644
--- a/src/test/specs/graph-tooltip-specs.js
+++ b/src/test/specs/graph-tooltip-specs.js
@@ -60,20 +60,6 @@ define([
});
});
- describeSharedTooltip("point count missmatch", function(ctx) {
- ctx.setup(function() {
- ctx.data = [
- { data: [[10, 15], [12, 20]], },
- { data: [[10, 2]] }
- ];
- ctx.pos = { x: 11 };
- });
-
- it('should set pointCountMismatch to true', function() {
- expect(ctx.results.pointCountMismatch).to.be(true);
- });
- });
-
describeSharedTooltip("one series is hidden", function(ctx) {
ctx.setup(function() {
ctx.data = [
@@ -82,10 +68,6 @@ define([
];
ctx.pos = { x: 11 };
});
-
- it('should set pointCountMismatch to false', function() {
- expect(ctx.results.pointCountMismatch).to.be(undefined);
- });
});
describeSharedTooltip("steppedLine false, stack true, individual false", function(ctx) {