Browse Source

(prometheus) cache metric suggest query result (#9182)

* (prometheus) cache metric suggest query result

* add test
Mitsuhiro Tanda 8 years ago
parent
commit
4446e95155

+ 1 - 1
public/app/plugins/datasource/prometheus/completer.ts

@@ -23,7 +23,7 @@ export class PromCompleter {
     var query = prefix;
     var query = prefix;
     var line = editor.session.getLine(pos.row);
     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 => {
       callback(null, metricNames.map(name => {
         let value = name;
         let value = name;
         if (prefix === '(') {
         if (prefix === '(') {

+ 14 - 3
public/app/plugins/datasource/prometheus/datasource.ts

@@ -24,6 +24,7 @@ export class PrometheusDatasource {
   directUrl: string;
   directUrl: string;
   basicAuth: any;
   basicAuth: any;
   withCredentials: any;
   withCredentials: any;
+  metricsNameCache: any;
 
 
   /** @ngInject */
   /** @ngInject */
   constructor(instanceSettings,
   constructor(instanceSettings,
@@ -157,11 +158,21 @@ export class PrometheusDatasource {
     return this._request('GET', url, query.requestId);
     return this._request('GET', url, query.requestId);
   }
   }
 
 
-  performSuggestQuery(query) {
+  performSuggestQuery(query, cache = false) {
     var url = '/api/v1/label/__name__/values';
     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;
         return metricName.indexOf(query) !== 1;
       });
       });
     });
     });

+ 21 - 0
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');
       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);
+      });
+    });
+  });
 });
 });