From beced6f3a625e600a6d30c95e87a651d250d11e1 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Mon, 29 May 2017 11:04:49 +0200 Subject: [PATCH] graph: Handle data with zeroes for log scale fixes #8446. Data with all values equal to zero, creates a max with the value of Infinite. The for loop for creating ticks then gets stuck in an infinite loop. This fix resets min and max and creates some fake ticks for the y-axis if the min and max are not finite numbers. --- public/app/plugins/panel/graph/graph.ts | 17 ++++++++++---- .../plugins/panel/graph/specs/graph_specs.ts | 23 +++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/public/app/plugins/panel/graph/graph.ts b/public/app/plugins/panel/graph/graph.ts index e0cec3febbf..726f8be5628 100755 --- a/public/app/plugins/panel/graph/graph.ts +++ b/public/app/plugins/panel/graph/graph.ts @@ -555,12 +555,19 @@ coreModule.directive('grafanaGraph', function($rootScope, timeSrv, popoverSrv) { return; } - axis.ticks = []; - var nextTick; - for (nextTick = min; nextTick <= max; nextTick *= axis.logBase) { - axis.ticks.push(nextTick); + if (Number.isFinite(min) && Number.isFinite(max)) { + axis.ticks = []; + var nextTick; + for (nextTick = min; nextTick <= max; nextTick *= axis.logBase) { + axis.ticks.push(nextTick); + } + axis.tickDecimals = decimalPlaces(min); + } else { + axis.ticks = [1, 2]; + delete axis.min; + delete axis.max; } - axis.tickDecimals = decimalPlaces(min); + } function decimalPlaces(num) { diff --git a/public/app/plugins/panel/graph/specs/graph_specs.ts b/public/app/plugins/panel/graph/specs/graph_specs.ts index 161aca11e42..9595c3dd544 100644 --- a/public/app/plugins/panel/graph/specs/graph_specs.ts +++ b/public/app/plugins/panel/graph/specs/graph_specs.ts @@ -153,6 +153,29 @@ describe('grafanaGraph', function() { }); }); + graphScenario('when logBase is log 10 and data points contain only zeroes', function(ctx) { + ctx.setup(function(ctrl, data) { + ctrl.panel.yaxes[0].logBase = 10; + data[0] = new TimeSeries({ + datapoints: [[0,1],[0,2],[0,3],[0,4]], + alias: 'seriesAutoscale', + }); + data[0].yaxis = 1; + }); + + it('should not set min and max and should create some fake ticks', function() { + var axisAutoscale = ctx.plotOptions.yaxes[0]; + expect(axisAutoscale.transform(100)).to.be(2); + expect(axisAutoscale.inverseTransform(-3)).to.be(0.001); + expect(axisAutoscale.min).to.be(undefined); + expect(axisAutoscale.max).to.be(undefined); + expect(axisAutoscale.ticks.length).to.be(2); + expect(axisAutoscale.ticks[0]).to.be(1); + expect(axisAutoscale.ticks[1]).to.be(2); + expect(axisAutoscale.tickDecimals).to.be(undefined); + }); + }); + graphScenario('dashed lines options', function(ctx) { ctx.setup(function(ctrl) { ctrl.panel.lines = true;