annotation_query.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. define([
  2. 'lodash',
  3. ],
  4. function (_) {
  5. 'use strict';
  6. function CloudWatchAnnotationQuery(datasource, annotation, $q, templateSrv) {
  7. this.datasource = datasource;
  8. this.annotation = annotation;
  9. this.$q = $q;
  10. this.templateSrv = templateSrv;
  11. }
  12. CloudWatchAnnotationQuery.prototype.process = function(from, to) {
  13. var self = this;
  14. var usePrefixMatch = this.annotation.prefixMatching;
  15. var region = this.templateSrv.replace(this.annotation.region);
  16. var namespace = this.templateSrv.replace(this.annotation.namespace);
  17. var metricName = this.templateSrv.replace(this.annotation.metricName);
  18. var dimensions = this.datasource.convertDimensionFormat(this.annotation.dimensions);
  19. var statistics = _.map(this.annotation.statistics, function(s) { return self.templateSrv.replace(s); });
  20. var defaultPeriod = usePrefixMatch ? '' : '300';
  21. var period = this.annotation.period || defaultPeriod;
  22. period = parseInt(period, 10);
  23. var actionPrefix = this.annotation.actionPrefix || '';
  24. var alarmNamePrefix = this.annotation.alarmNamePrefix || '';
  25. var d = this.$q.defer();
  26. var allQueryPromise;
  27. if (usePrefixMatch) {
  28. allQueryPromise = [
  29. this.datasource.performDescribeAlarms(region, actionPrefix, alarmNamePrefix, [], '').then(function(alarms) {
  30. alarms.MetricAlarms = self.filterAlarms(alarms, namespace, metricName, dimensions, statistics, period);
  31. return alarms;
  32. })
  33. ];
  34. } else {
  35. if (!region || !namespace || !metricName || _.isEmpty(statistics)) { return this.$q.when([]); }
  36. allQueryPromise = _.map(statistics, function(statistic) {
  37. return self.datasource.performDescribeAlarmsForMetric(region, namespace, metricName, dimensions, statistic, period);
  38. });
  39. }
  40. this.$q.all(allQueryPromise).then(function(alarms) {
  41. var eventList = [];
  42. var start = self.datasource.convertToCloudWatchTime(from, false);
  43. var end = self.datasource.convertToCloudWatchTime(to, true);
  44. _.chain(alarms)
  45. .pluck('MetricAlarms')
  46. .flatten()
  47. .each(function(alarm) {
  48. if (!alarm) {
  49. d.resolve(eventList);
  50. return;
  51. }
  52. self.datasource.performDescribeAlarmHistory(region, alarm.AlarmName, start, end).then(function(history) {
  53. _.each(history.AlarmHistoryItems, function(h) {
  54. var event = {
  55. annotation: self.annotation,
  56. time: Date.parse(h.Timestamp),
  57. title: h.AlarmName,
  58. tags: [h.HistoryItemType],
  59. text: h.HistorySummary
  60. };
  61. eventList.push(event);
  62. });
  63. d.resolve(eventList);
  64. });
  65. });
  66. });
  67. return d.promise;
  68. };
  69. CloudWatchAnnotationQuery.prototype.filterAlarms = function(alarms, namespace, metricName, dimensions, statistics, period) {
  70. return _.filter(alarms.MetricAlarms, function(alarm) {
  71. if (!_.isEmpty(namespace) && alarm.Namespace !== namespace) {
  72. return false;
  73. }
  74. if (!_.isEmpty(metricName) && alarm.MetricName !== metricName) {
  75. return false;
  76. }
  77. var sd = function(d) {
  78. return d.Name;
  79. };
  80. var isSameDimensions = JSON.stringify(_.sortBy(alarm.Dimensions, sd)) === JSON.stringify(_.sortBy(dimensions, sd));
  81. if (!_.isEmpty(dimensions) && !isSameDimensions) {
  82. return false;
  83. }
  84. if (!_.isEmpty(statistics) && !_.contains(statistics, alarm.Statistic)) {
  85. return false;
  86. }
  87. if (!_.isNaN(period) && alarm.Period !== period) {
  88. return false;
  89. }
  90. return true;
  91. });
  92. };
  93. return CloudWatchAnnotationQuery;
  94. });