Просмотр исходного кода

CloudWatch multiple alarm annotation support

Mitsuhiro Tanda 10 лет назад
Родитель
Сommit
defb15bea1

+ 42 - 6
public/app/plugins/datasource/cloudwatch/datasource.js

@@ -230,21 +230,57 @@ function (angular, _, moment, dateMath) {
 
 
     this.annotationQuery = function(options) {
     this.annotationQuery = function(options) {
       var annotation = options.annotation;
       var annotation = options.annotation;
+      var usePrefixMatch = annotation.prefixMatching;
       var region = templateSrv.replace(annotation.region);
       var region = templateSrv.replace(annotation.region);
       var namespace = templateSrv.replace(annotation.namespace);
       var namespace = templateSrv.replace(annotation.namespace);
       var metricName = templateSrv.replace(annotation.metricName);
       var metricName = templateSrv.replace(annotation.metricName);
       var dimensions = convertDimensionFormat(annotation.dimensions);
       var dimensions = convertDimensionFormat(annotation.dimensions);
       var statistics = _.map(annotation.statistics, function(s) { return templateSrv.replace(s); });
       var statistics = _.map(annotation.statistics, function(s) { return templateSrv.replace(s); });
-      var period = annotation.period || '300';
+      var defaultPeriod = usePrefixMatch ? '' : '300';
+      var period = annotation.period || defaultPeriod;
       period = parseInt(period, 10);
       period = parseInt(period, 10);
-
-      if (!region || !namespace || !metricName || _.isEmpty(statistics)) { return $q.when([]); }
+      var actionPrefix = annotation.actionPrefix || '';
+      var alarmNamePrefix = annotation.alarmNamePrefix || '';
 
 
       var d = $q.defer();
       var d = $q.defer();
       var self = this;
       var self = this;
-      var allQueryPromise = _.map(statistics, function(statistic) {
-        return self.performDescribeAlarmsForMetric(region, namespace, metricName, dimensions, statistic, period);
-      });
+      var allQueryPromise;
+      if (usePrefixMatch) {
+        allQueryPromise = [
+          this.performDescribeAlarms(region, actionPrefix, alarmNamePrefix, [], '').then(function(alarms) {
+            alarms.MetricAlarms = _.filter(alarms.MetricAlarms, function(alarm) {
+              if (!_.isEmpty(namespace) && alarm.Namespace !== namespace) {
+                return false;
+              }
+              if (!_.isEmpty(metricName) && alarm.MetricName !== metricName) {
+                return false;
+              }
+              var sd = function(d) {
+                return d.Name;
+              };
+              var isSameDimensions = JSON.stringify(_.sortBy(alarm.Dimensions, sd)) === JSON.stringify(_.sortBy(dimensions, sd));
+              if (!_.isEmpty(dimensions) && !isSameDimensions) {
+                return false;
+              }
+              if (!_.isEmpty(statistics) && !_.contains(statistics, alarm.Statistic)) {
+                return false;
+              }
+              if (!_.isNaN(period) && alarm.Period !== period) {
+                return false;
+              }
+              return true;
+            });
+
+            return alarms;
+          })
+        ];
+      } else {
+        if (!region || !namespace || !metricName || _.isEmpty(statistics)) { return $q.when([]); }
+
+        allQueryPromise = _.map(statistics, function(statistic) {
+          return self.performDescribeAlarmsForMetric(region, namespace, metricName, dimensions, statistic, period);
+        });
+      }
       $q.all(allQueryPromise).then(function(alarms) {
       $q.all(allQueryPromise).then(function(alarms) {
         var eventList = [];
         var eventList = [];
 
 

+ 18 - 0
public/app/plugins/datasource/cloudwatch/partials/annotations.editor.html

@@ -1 +1,19 @@
 <cloudwatch-query-parameter target="ctrl.annotation" datasource="ctrl.datasource"></cloudwatch-query-parameter>
 <cloudwatch-query-parameter target="ctrl.annotation" datasource="ctrl.datasource"></cloudwatch-query-parameter>
+<div class="editor-row">
+	<div class="section">
+		<h5>Prefix matching</h5>
+		<div class="editor-option">
+			<editor-checkbox text="Enable" model="ctrl.annotation.prefixMatching"></editor-checkbox>
+		</div>
+
+		<div class="editor-option" ng-if="ctrl.annotation.prefixMatching">
+			<label class="small">Action</label>
+			<input type="text" class="input-small" ng-model='ctrl.annotation.actionPrefix'></input>
+		</div>
+
+		<div class="editor-option" ng-if="ctrl.annotation.prefixMatching">
+			<label class="small">Alarm Name</label>
+			<input type="text" class="input-small" ng-model='ctrl.annotation.alarmNamePrefix'></input>
+		</div>
+	</div>
+</div>