瀏覽代碼

fix(prometheus): fixed templating issue with prometheus for when using variable with non regex operator, #2918

Torkel Ödegaard 9 年之前
父節點
當前提交
0da4168836
共有 2 個文件被更改,包括 23 次插入10 次删除
  1. 13 9
      public/app/features/templating/templateSrv.js
  2. 10 1
      public/app/plugins/datasource/prometheus/datasource.ts

+ 13 - 9
public/app/features/templating/templateSrv.js

@@ -42,7 +42,11 @@ function (angular, _) {
       return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, "\\$1");
       return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, "\\$1");
     }
     }
 
 
-    this.formatValue = function(value, format) {
+    this.formatValue = function(value, format, variable) {
+      if (typeof format === 'function') {
+        return format(value, variable, this.formatValue);
+      }
+
       switch(format) {
       switch(format) {
         case "regex": {
         case "regex": {
           if (typeof value === 'string') {
           if (typeof value === 'string') {
@@ -121,21 +125,21 @@ function (angular, _) {
       this._regex.lastIndex = 0;
       this._regex.lastIndex = 0;
 
 
       return target.replace(this._regex, function(match, g1, g2) {
       return target.replace(this._regex, function(match, g1, g2) {
+        variable = self._index[g1 || g2];
+        if (!variable) {
+          return match;
+        }
+
         if (scopedVars) {
         if (scopedVars) {
           value = scopedVars[g1 || g2];
           value = scopedVars[g1 || g2];
           if (value) {
           if (value) {
-            return self.formatValue(value.value);
+            return self.formatValue(value.value, format, variable);
           }
           }
         }
         }
 
 
-        variable = self._index[g1 || g2];
-        if (!variable) {
-          return match;
-        }
-
         systemValue = self._grafanaVariables[variable.current.value];
         systemValue = self._grafanaVariables[variable.current.value];
         if (systemValue) {
         if (systemValue) {
-          return self.formatValue(systemValue);
+          return self.formatValue(systemValue, format, variable);
         }
         }
 
 
         value = variable.current.value;
         value = variable.current.value;
@@ -143,7 +147,7 @@ function (angular, _) {
           value = self.getAllValue(variable);
           value = self.getAllValue(variable);
         }
         }
 
 
-        var res = self.formatValue(value, format);
+        var res = self.formatValue(value, format, variable);
         return res;
         return res;
       });
       });
     };
     };

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

@@ -39,6 +39,15 @@ export function PrometheusDatasource(instanceSettings, $q, backendSrv, templateS
     return backendSrv.datasourceRequest(options);
     return backendSrv.datasourceRequest(options);
   };
   };
 
 
+  function interpolateQueryExpr(value, variable, defaultFormatFn) {
+    // if no multi or include all do not regexEscape
+    if (!variable.multi && !variable.includeAll) {
+      return value;
+    }
+
+    return defaultFormatFn(value, 'regex', variable);
+  };
+
   // Called once per panel (graph)
   // Called once per panel (graph)
   this.query = function(options) {
   this.query = function(options) {
     var start = getPrometheusTime(options.range.from, false);
     var start = getPrometheusTime(options.range.from, false);
@@ -52,7 +61,7 @@ export function PrometheusDatasource(instanceSettings, $q, backendSrv, templateS
       }
       }
 
 
       var query: any = {};
       var query: any = {};
-      query.expr = templateSrv.replace(target.expr, options.scopedVars, 'regex');
+      query.expr = templateSrv.replace(target.expr, options.scopedVars, interpolateQueryExpr);
 
 
       var interval = target.interval || options.interval;
       var interval = target.interval || options.interval;
       var intervalFactor = target.intervalFactor || 1;
       var intervalFactor = target.intervalFactor || 1;