diff --git a/public/app/plugins/datasource/cloudwatch/datasource.js b/public/app/plugins/datasource/cloudwatch/datasource.js
index ab97e4eedd5..881d4e48c3d 100644
--- a/public/app/plugins/datasource/cloudwatch/datasource.js
+++ b/public/app/plugins/datasource/cloudwatch/datasource.js
@@ -230,21 +230,57 @@ function (angular, _, moment, dateMath) {
this.annotationQuery = function(options) {
var annotation = options.annotation;
+ var usePrefixMatch = annotation.prefixMatching;
var region = templateSrv.replace(annotation.region);
var namespace = templateSrv.replace(annotation.namespace);
var metricName = templateSrv.replace(annotation.metricName);
var dimensions = convertDimensionFormat(annotation.dimensions);
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);
-
- if (!region || !namespace || !metricName || _.isEmpty(statistics)) { return $q.when([]); }
+ var actionPrefix = annotation.actionPrefix || '';
+ var alarmNamePrefix = annotation.alarmNamePrefix || '';
var d = $q.defer();
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) {
var eventList = [];
diff --git a/public/app/plugins/datasource/cloudwatch/partials/annotations.editor.html b/public/app/plugins/datasource/cloudwatch/partials/annotations.editor.html
index 050698f3ff2..a82f82edf96 100644
--- a/public/app/plugins/datasource/cloudwatch/partials/annotations.editor.html
+++ b/public/app/plugins/datasource/cloudwatch/partials/annotations.editor.html
@@ -1 +1,19 @@