فهرست منبع

Progress on InfluxDB 0.9 support, but will take a break, it is impossible to work on this, cannot get any queries that use tags to work with InfluxDB 0.9rc15, just empty response, #1525

Torkel Ödegaard 10 سال پیش
والد
کامیت
b04c50537d

+ 2 - 1
src/app/plugins/datasource/influxdb/datasource.js

@@ -36,13 +36,14 @@ function (angular, _, kbn, InfluxSeries, InfluxQueryBuilder) {
       var timeFilter = getTimeFilter(options);
 
       var promises = _.map(options.targets, function(target) {
-        if (target.hide || !target.query) {
+        if (target.hide) {
           return [];
         }
 
         // build query
         var queryBuilder = new InfluxQueryBuilder(target);
         var query = queryBuilder.build();
+        console.log('query builder result:' + query);
 
         // replace grafana variables
         query = query.replace('$timeFilter', timeFilter);

+ 0 - 3
src/app/plugins/datasource/influxdb/partials/query.editor.html

@@ -53,9 +53,6 @@
 			</ul>
 
 			<ul class="tight-form-list">
-				<li class="tight-form-item" style="min-width: 15px; text-align: center">
-					{{targetLetters[$index]}}
-				</li>
 				<li>
 					<a  class="tight-form-item"
 						ng-click="target.hide = !target.hide; get_data();"

+ 19 - 18
src/app/plugins/datasource/influxdb/queryBuilder.js

@@ -1,6 +1,7 @@
 define([
+    'lodash'
 ],
-function () {
+function (_) {
   'use strict';
 
   function InfluxQueryBuilder(target) {
@@ -15,36 +16,36 @@ function () {
 
   p._buildQuery = function() {
     var target = this.target;
-    var query = 'select ';
-    var seriesName = target.series;
 
-    if(!seriesName.match('^/.*/') && !seriesName.match(/^merge\(.*\)/)) {
-      seriesName = '"' + seriesName+ '"';
-    }
+    console.log('Build Query: target = ', target);
 
-    if (target.groupby_field) {
-      query += target.groupby_field + ', ';
+    if (!target.measurement) {
+      throw "Metric measurement is missing";
     }
 
-    query +=  target.function + '(' + target.column + ')';
-    query += ' from ' + seriesName + ' where $timeFilter';
+    var query = 'SELECT ';
+    var measurement = target.measurement;
+    var aggregationFunc = target.function || 'mean';
 
-    if (target.condition) {
-      query += ' and ' + target.condition;
+    if(!measurement.match('^/.*/') && !measurement.match(/^merge\(.*\)/)) {
+      measurement = '"' + measurement+ '"';
     }
 
-    query += ' group by time($interval)';
+    query +=  aggregationFunc + '(value)';
+    query += ' FROM ' + measurement + ' WHERE ';
+    query += _.map(target.tags, function(value, key) {
+      return key + ' = ' + "'" + value + "' AND ";
+    });
 
-    if (target.groupby_field) {
-      query += ', ' + target.groupby_field;
-      this.groupByField = target.groupby_field;
-    }
+    query += '$timeFilter';
+
+    query += ' GROUP BY time($interval)';
 
     if (target.fill) {
       query += ' fill(' + target.fill + ')';
     }
 
-    query += " order asc";
+    query += " ORDER BY asc";
     target.query = query;
 
     return query;

+ 9 - 0
src/app/plugins/datasource/influxdb/queryCtrl.js

@@ -93,6 +93,15 @@ function (angular, _) {
         return;
       }
 
+      $scope.target.measurement = '';
+      $scope.target.tags = {};
+      $scope.target.measurement = $scope.segments[0].value;
+
+      for (var i = 1; i+1 < $scope.segments.length; i += 2) {
+        var key = $scope.segments[i].value;
+        $scope.target.tags[key] = $scope.segments[i+1].value;
+      }
+
       $scope.$parent.get_data();
     };
 

+ 38 - 0
src/test/specs/influx09-querybuilder-specs.js

@@ -0,0 +1,38 @@
+define([
+  'plugins/datasource/influxdb/queryBuilder'
+], function(InfluxQueryBuilder) {
+  'use strict';
+
+  describe('InfluxQueryBuilder', function() {
+
+    describe('series with mesurement only', function() {
+      var builder = new InfluxQueryBuilder({
+        measurement: 'cpu',
+      });
+
+      var query = builder.build();
+
+      it('should generate correct query', function() {
+        expect(query).to.be('SELECT mean(value) FROM "cpu" WHERE $timeFilter GROUP BY time($interval) ORDER BY asc');
+      });
+
+    });
+
+    describe('series with tags only', function() {
+      var builder = new InfluxQueryBuilder({
+        measurement: 'cpu',
+        tags: {'hostname': 'server1'}
+      });
+
+      var query = builder.build();
+
+      it('should generate correct query', function() {
+        expect(query).to.be('SELECT mean(value) FROM "cpu" WHERE hostname = \'server1\'' +
+          ' AND $timeFilter GROUP BY time($interval) ORDER BY asc');
+      });
+
+    });
+
+  });
+
+});

+ 1 - 0
src/test/test-main.js

@@ -126,6 +126,7 @@ require([
     'specs/graphiteDatasource-specs',
     'specs/influxSeries-specs',
     'specs/influxQueryBuilder-specs',
+    'specs/influx09-querybuilder-specs',
     'specs/influxdb-datasource-specs',
     'specs/graph-ctrl-specs',
     'specs/graph-specs',