Просмотр исходного кода

InfluxDB: save/load and search works, tag facets still to be done, but is not critical, #633

Torkel Ödegaard 11 лет назад
Родитель
Сommit
1c1b9b5c9d

+ 2 - 5
src/app/controllers/search.js

@@ -41,7 +41,7 @@ function (angular, _, config, $) {
 
         var selectedDash = $scope.results.dashboards[$scope.selectedIndex];
         if (selectedDash) {
-          $location.path("/dashboard/elasticsearch/" + encodeURIComponent(selectedDash._id));
+          $location.path("/dashboard/elasticsearch/" + selectedDash.id);
           setTimeout(function() {
             $('body').click(); // hack to force dropdown to close;
           });
@@ -90,10 +90,7 @@ function (angular, _, config, $) {
       $scope.showImport = false;
       $scope.selectedIndex = -1;
 
-      var queryStr = $scope.query.query.toLowerCase();
-      queryStr = queryStr.replace(' and ', ' AND ');
-
-      $scope.searchDashboards(queryStr);
+      $scope.searchDashboards($scope.query.query);
     };
 
     $scope.openSearch = function (evt) {

+ 6 - 6
src/app/partials/search.html

@@ -65,11 +65,11 @@
               ng-class="{'selected': $index === selectedIndex }">
             <td><span class="label label-info">metric</span></td>
             <td class="grafana-search-metric-name">
-              {{row._id}}
+              {{row.id}}
             </td>
             <td style="width:100%;">
               <div class="grafana-search-metric-actions">
-                <a ng-click="addMetricToCurrentDashboard(row._id)"><i class="icon-plus-sign"></i> Add to dashboard</a>
+                <a ng-click="addMetricToCurrentDashboard(row.id)"><i class="icon-plus-sign"></i> Add to dashboard</a>
               </div>
             </td>
           </tr>
@@ -77,16 +77,16 @@
           <tr bindonce
               ng-repeat="row in results.dashboards"
               ng-class="{'selected': $index === selectedIndex }">
-            <td><a ng-click="deleteDashboard(row._id)"><i class="icon-remove"></i></a></td>
+            <td><a ng-click="deleteDashboard(row.id)"><i class="icon-remove"></i></a></td>
             <td style="width:100%">
-              <a href="#/dashboard/elasticsearch/{{row._id}}" bo-text="row._id"></a>
+              <a href="#/dashboard/elasticsearch/{{row.id}}" bo-text="row.id"></a>
             </td>
             <td style="white-space: nowrap; text-align: right;">
-              <a ng-click="filterByTag(tag, $event)" ng-repeat="tag in row._source.tags" style="margin-right: 5px;" class="label label-tag">
+              <a ng-click="filterByTag(tag, $event)" ng-repeat="tag in row.tags" style="margin-right: 5px;" class="label label-tag">
                 {{tag}}
               </a>
             </td>
-            <td><a><i class="icon-share" ng-click="shareDashboard(row._id, row._id)" config-modal="app/partials/dashLoaderShare.html"></i></a></td>
+            <td><a><i class="icon-share" ng-click="shareDashboard(row.id, row.id)" config-modal="app/partials/dashLoaderShare.html"></i></a></td>
           </tr>
         </table>
       </div>

+ 2 - 0
src/app/services/elasticsearch/es-datasource.js

@@ -180,6 +180,8 @@ function (angular, _, $, config, kbn, moment) {
     };
 
     ElasticDatasource.prototype.searchDashboards = function(queryString) {
+      queryString = queryString.toLowerCase().replace(' and ', ' AND ');
+
       var tagsOnly = queryString.indexOf('tags!:') === 0;
       if (tagsOnly) {
         var tagsQuery = queryString.substring(6, queryString.length);

+ 42 - 2
src/app/services/influxdb/influxdbDatasource.js

@@ -237,7 +237,7 @@ function (angular, _, kbn, InfluxSeries) {
       title = dashboardClone.title = title ? title : dashboard.title;
 
       var data = [{
-        name: 'grafana_dashboards',
+        name: 'grafana.dashboard_' + btoa(title),
         columns: ['time', 'sequence_number', 'title', 'tags', 'dashboard'],
         points: [[1, 1, title, tags, angular.toJson(dashboardClone)]]
       }];
@@ -250,7 +250,7 @@ function (angular, _, kbn, InfluxSeries) {
     };
 
     InfluxDatasource.prototype.getDashboard = function(id) {
-      return this._seriesQuery("select dashboard from grafana_dashboards where title='" + id + "'").then(function(results) {
+      return this._seriesQuery('select dashboard from "grafana.dashboard_' + btoa(id) + '"').then(function(results) {
         if (!results || !results.length) {
           throw "Dashboard not found";
         }
@@ -262,6 +262,46 @@ function (angular, _, kbn, InfluxSeries) {
       });
     };
 
+    InfluxDatasource.prototype.searchDashboards = function(queryString) {
+      var influxQuery = 'select title, tags from /grafana.dashboard_.*/ where ';
+
+      var tagsOnly = queryString.indexOf('tags!:') === 0;
+      if (tagsOnly) {
+        var tagsQuery = queryString.substring(6, queryString.length);
+        influxQuery = influxQuery + 'tags =~ /.*' + tagsQuery + '.*/i';
+      }
+      else {
+        var titleOnly = queryString.indexOf('title:') === 0;
+        if (titleOnly) {
+          var titleQuery = queryString.substring(6, queryString.length);
+          influxQuery = influxQuery + ' title =~ /.*' + titleQuery + '.*/i';
+        }
+        else {
+          influxQuery = influxQuery + '(tags =~ /.*' + queryString + '.*/i or title =~ /.*' + queryString + '.*/i)';
+        }
+      }
+
+      return this._seriesQuery(influxQuery).then(function(results) {
+        if (!results || !results.length) {
+          return { dashboards: [], tags: [] };
+        }
+
+        var dashList = [];
+        var dashCol = _.indexOf(results[0].columns, 'title');
+        var tagsCol = _.indexOf(results[0].columns, 'tags');
+
+        for (var i = 0; i < results.length; i++) {
+          var hit =  {
+            id: results[i].points[0][dashCol],
+            tags: results[i].points[0][tagsCol].split(",")
+          };
+          hit.tags = hit.tags[0] ? hit.tags : [];
+          dashList.push(hit);
+        }
+        return { dashboards: dashList, tags: [] };
+      });
+    };
+
     function handleInfluxQueryResponse(alias, groupByField, seriesList) {
       var influxSeries = new InfluxSeries({
         seriesList: seriesList,