diff --git a/src/app/controllers/search.js b/src/app/controllers/search.js index 1ecd544b289..bc8cdc032f5 100644 --- a/src/app/controllers/search.js +++ b/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) { diff --git a/src/app/partials/search.html b/src/app/partials/search.html index a3eaba3a6dc..8bb1246c849 100644 --- a/src/app/partials/search.html +++ b/src/app/partials/search.html @@ -65,11 +65,11 @@ ng-class="{'selected': $index === selectedIndex }"> metric - {{row._id}} + {{row.id}}
- Add to dashboard + Add to dashboard
@@ -77,16 +77,16 @@ - + - + - + {{tag}} - + diff --git a/src/app/services/elasticsearch/es-datasource.js b/src/app/services/elasticsearch/es-datasource.js index ffc7d394277..ebb368db465 100644 --- a/src/app/services/elasticsearch/es-datasource.js +++ b/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); diff --git a/src/app/services/influxdb/influxdbDatasource.js b/src/app/services/influxdb/influxdbDatasource.js index 423325c0cc4..3953dd24401 100644 --- a/src/app/services/influxdb/influxdbDatasource.js +++ b/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,