Browse Source

elasticsearch: handle if alert query contains template variable

If datasource handles targetContainsTemplate function it can evaluate if a certain
query contains template variables and this is used for show an error message that
template variables not is supported in alert queries.
Marcus Efraimsson 7 years ago
parent
commit
7cb0403faa
1 changed files with 61 additions and 0 deletions
  1. 61 0
      public/app/plugins/datasource/elasticsearch/datasource.ts

+ 61 - 0
public/app/plugins/datasource/elasticsearch/datasource.ts

@@ -408,4 +408,65 @@ export class ElasticDatasource {
   getTagValues(options) {
     return this.getTerms({ field: options.key, query: '*' });
   }
+
+  targetContainsTemplate(target) {
+    if (this.templateSrv.variableExists(target.query) || this.templateSrv.variableExists(target.alias)) {
+      return true;
+    }
+
+    for (let bucketAgg of target.bucketAggs) {
+      if (this.templateSrv.variableExists(bucketAgg.field) || this.objectContainsTemplate(bucketAgg.settings)) {
+        return true;
+      }
+    }
+
+    for (let metric of target.metrics) {
+      if (
+        this.templateSrv.variableExists(metric.field) ||
+        this.objectContainsTemplate(metric.settings) ||
+        this.objectContainsTemplate(metric.meta)
+      ) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  private isPrimitive(obj) {
+    if (obj === null || obj === undefined) {
+      return true;
+    }
+    if (['string', 'number', 'boolean'].some(type => type === typeof true)) {
+      return true;
+    }
+
+    return false;
+  }
+
+  private objectContainsTemplate(obj) {
+    if (!obj) {
+      return false;
+    }
+
+    for (let key of Object.keys(obj)) {
+      if (this.isPrimitive(obj[key])) {
+        if (this.templateSrv.variableExists(obj[key])) {
+          return true;
+        }
+      } else if (Array.isArray(obj[key])) {
+        for (let item of obj[key]) {
+          if (this.objectContainsTemplate(item)) {
+            return true;
+          }
+        }
+      } else {
+        if (this.objectContainsTemplate(obj[key])) {
+          return true;
+        }
+      }
+    }
+
+    return false;
+  }
 }