diff --git a/CHANGELOG.md b/CHANGELOG.md index e7a81c09f3d..460de927e7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ vNext **New features or improvements** - Allow [[..]] filter notation in all text panels (markdown/html/text) (Issue #511) - New legend display option "Align as table" (Issue #136) +- Enhanced InfluxDB series aliasing (legend names) with pattern replacements (Issue #525) **Changes** - Use unix epoch for Graphite from/to for absolute time ranges (Closes #536) diff --git a/src/app/services/influxdb/influxSeries.js b/src/app/services/influxdb/influxSeries.js index ce8475fccbf..0b54577ce4e 100644 --- a/src/app/services/influxdb/influxSeries.js +++ b/src/app/services/influxdb/influxSeries.js @@ -15,6 +15,7 @@ function (_) { p.getTimeSeries = function() { var output = []; var self = this; + var i; _.each(self.seriesList, function(series) { var seriesName; @@ -46,16 +47,15 @@ function (_) { _.each(groups, function(groupPoints, key) { var datapoints = []; - for (var i = 0; i < groupPoints.length; i++) { + for (i = 0; i < groupPoints.length; i++) { var metricValue = isNaN(groupPoints[i][valueCol]) ? null : groupPoints[i][valueCol]; datapoints[i] = [metricValue, groupPoints[i][timeCol]]; } - seriesName = self.alias ? self.alias : (series.name + '.' + key); + seriesName = series.name + '.' + key; - // if mulitple groups append key to alias - if (self.alias && self.groupByField) { - seriesName += key; + if (self.alias) { + seriesName = self.createNameForSeries(series.name, series.columns[valueCol], key); } output.push({ target: seriesName, datapoints: datapoints }); @@ -65,5 +65,24 @@ function (_) { return output; }; + p.createNameForSeries = function(seriesName, columnName, groupByColValue) { + var name = this.alias + .replace('$s', seriesName) + .replace('$c', columnName); + + var segments = seriesName.split('.'); + for (var i = 0; i < segments.length; i++) { + if (segments[i].length > 0) { + name = name.replace('$' + i, segments[i]); + } + } + + if (this.groupByField) { + name = name.replace('$g', groupByColValue); + } + + return name; + }; + return InfluxSeries; }); \ No newline at end of file diff --git a/src/test/specs/influxSeries-specs.js b/src/test/specs/influxSeries-specs.js new file mode 100644 index 00000000000..6d747e17f71 --- /dev/null +++ b/src/test/specs/influxSeries-specs.js @@ -0,0 +1,142 @@ +define([ + 'services/influxdb/influxSeries' +], function(InfluxSeries) { + 'use strict'; + + describe('when generating timeseries from influxdb response', function() { + + describe('given two series', function() { + var series = new InfluxSeries({ + seriesList: [ + { + columns: ['time', 'mean', 'sequence_number'], + name: 'prod.server1.cpu', + points: [[1402596000, 10, 1], [1402596001, 12, 2]] + }, + { + columns: ['time', 'mean', 'sequence_number'], + name: 'prod.server2.cpu', + points: [[1402596000, 15, 1], [1402596001, 16, 2]] + } + ] + }); + + var result = series.getTimeSeries(); + + it('should generate two time series', function() { + expect(result.length).to.be(2); + expect(result[0].target).to.be('prod.server1.cpu.mean'); + expect(result[0].datapoints[0][0]).to.be(10); + expect(result[0].datapoints[0][1]).to.be(1402596000); + expect(result[0].datapoints[1][0]).to.be(12); + expect(result[0].datapoints[1][1]).to.be(1402596001); + + expect(result[1].target).to.be('prod.server2.cpu.mean'); + expect(result[1].datapoints[0][0]).to.be(15); + expect(result[1].datapoints[0][1]).to.be(1402596000); + expect(result[1].datapoints[1][0]).to.be(16); + expect(result[1].datapoints[1][1]).to.be(1402596001); + }); + + }); + + describe('given an alias format', function() { + var series = new InfluxSeries({ + seriesList: [ + { + columns: ['time', 'mean', 'sequence_number'], + name: 'prod.server1.cpu', + points: [[1402596000, 10, 1], [1402596001, 12, 2]] + } + ], + alias: '$s.$c' + }); + + var result = series.getTimeSeries(); + + it('should generate correct series name', function() { + expect(result[0].target).to.be('prod.server1.cpu.mean'); + }); + + }); + + describe('given an alias format with segment numbers', function() { + var series = new InfluxSeries({ + seriesList: [ + { + columns: ['time', 'mean', 'sequence_number'], + name: 'prod.server1.cpu', + points: [[1402596000, 10, 1], [1402596001, 12, 2]] + } + ], + alias: '$1' + }); + + var result = series.getTimeSeries(); + + it('should generate correct series name', function() { + expect(result[0].target).to.be('server1'); + }); + + }); + + describe('given an alias format with group by field', function() { + var series = new InfluxSeries({ + seriesList: [ + { + columns: ['time', 'mean', 'host'], + name: 'prod.cpu', + points: [[1402596000, 10, 'A']] + } + ], + groupByField: 'host', + alias: '$g.$1' + }); + + var result = series.getTimeSeries(); + + it('should generate correct series name', function() { + expect(result[0].target).to.be('A.cpu'); + }); + + }); + + describe('given group by column', function() { + var series = new InfluxSeries({ + seriesList: [ + { + columns: ['time', 'mean', 'host'], + name: 'prod.cpu', + points: [ + [1402596000, 10, 'A'], + [1402596001, 11, 'A'], + [1402596000, 5, 'B'], + [1402596001, 6, 'B'], + ] + } + ], + groupByField: 'host' + }); + + var result = series.getTimeSeries(); + + it('should generate two time series', function() { + expect(result.length).to.be(2); + expect(result[0].target).to.be('prod.cpu.A'); + expect(result[0].datapoints[0][0]).to.be(10); + expect(result[0].datapoints[0][1]).to.be(1402596000); + expect(result[0].datapoints[1][0]).to.be(11); + expect(result[0].datapoints[1][1]).to.be(1402596001); + + expect(result[1].target).to.be('prod.cpu.B'); + expect(result[1].datapoints[0][0]).to.be(5); + expect(result[1].datapoints[0][1]).to.be(1402596000); + expect(result[1].datapoints[1][0]).to.be(6); + expect(result[1].datapoints[1][1]).to.be(1402596001); + }); + + }); + + }); + +}); diff --git a/src/test/test-main.js b/src/test/test-main.js index 3aaead497cf..0d60d346478 100644 --- a/src/test/test-main.js +++ b/src/test/test-main.js @@ -128,8 +128,10 @@ require([ 'specs/gfunc-specs', 'specs/filterSrv-specs', 'specs/kbn-format-specs', + 'specs/influxSeries-specs' ], function () { window.__karma__.start(); }); }); +