diff --git a/public/app/plugins/datasource/prometheus/completer.ts b/public/app/plugins/datasource/prometheus/completer.ts index b7bf60abe02..238ab208228 100644 --- a/public/app/plugins/datasource/prometheus/completer.ts +++ b/public/app/plugins/datasource/prometheus/completer.ts @@ -23,7 +23,7 @@ export class PromCompleter { var query = prefix; var line = editor.session.getLine(pos.row); - return this.datasource.performSuggestQuery(query).then(metricNames => { + return this.datasource.performSuggestQuery(query, true).then(metricNames => { callback(null, metricNames.map(name => { let value = name; if (prefix === '(') { diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index fbe726928dd..4b4bfb4cdde 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -24,6 +24,7 @@ export class PrometheusDatasource { directUrl: string; basicAuth: any; withCredentials: any; + metricsNameCache: any; /** @ngInject */ constructor(instanceSettings, @@ -157,11 +158,21 @@ export class PrometheusDatasource { return this._request('GET', url, query.requestId); } - performSuggestQuery(query) { + performSuggestQuery(query, cache = false) { var url = '/api/v1/label/__name__/values'; - return this._request('GET', url).then(function(result) { - return _.filter(result.data.data, function (metricName) { + if (cache && this.metricsNameCache && this.metricsNameCache.expire > Date.now()) { + return this.$q.when(_.filter(this.metricsNameCache.data, metricName => { + return metricName.indexOf(query) !== 1; + })); + } + + return this._request('GET', url).then(result => { + this.metricsNameCache = { + data: result.data.data, + expire: Date.now() + (60 * 1000) + }; + return _.filter(result.data.data, metricName => { return metricName.indexOf(query) !== 1; }); }); diff --git a/public/app/plugins/datasource/prometheus/specs/metric_find_query_specs.ts b/public/app/plugins/datasource/prometheus/specs/metric_find_query_specs.ts index 38b50d2ce79..54300e7ac05 100644 --- a/public/app/plugins/datasource/prometheus/specs/metric_find_query_specs.ts +++ b/public/app/plugins/datasource/prometheus/specs/metric_find_query_specs.ts @@ -107,4 +107,25 @@ describe('PrometheusMetricFindQuery', function() { expect(results[0].text).to.be('metric{job="testjob"} 3846 1443454528000'); }); }); + + describe('When performing performSuggestQuery', function() { + var results; + var response; + it('cache response', function() { + response = { + status: "success", + data: ["value1", "value2", "value3"] + }; + ctx.$httpBackend.expect('GET', 'proxied/api/v1/label/__name__/values').respond(response); + ctx.ds.performSuggestQuery('value', true).then(function(data) { results = data; }); + ctx.$httpBackend.flush(); + ctx.$rootScope.$apply(); + expect(results.length).to.be(3); + ctx.ds.performSuggestQuery('value', true).then(function (data) { + // get from cache, no need to flush + results = data; + expect(results.length).to.be(3); + }); + }); + }); });