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

(cloudwatch) fill null if the datapoint missing

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

+ 17 - 7
public/app/plugins/datasource/cloudwatch/datasource.js

@@ -25,6 +25,7 @@ function (angular, _) {
       var end = convertToCloudWatchTime(options.range.to);
 
       var queries = [];
+      options = _.clone(options);
       _.each(options.targets, _.bind(function(target) {
         if (target.hide || !target.namespace || !target.metricName || _.isEmpty(target.statistics)) {
           return;
@@ -38,11 +39,11 @@ function (angular, _) {
         query.statistics = target.statistics;
 
         var range = end - start;
-        query.period = parseInt(target.period, 10) || 60;
-
+        query.period = parseInt(target.period, 10) || (query.namespace === 'AWS/EC2' ? 300 : 60);
         if (range / query.period >= 1440) {
           query.period = Math.ceil(range / 1440 / 60) * 60;
         }
+        target.period = query.period;
 
         queries.push(query);
       }, this));
@@ -252,13 +253,22 @@ function (angular, _) {
       };
       _.extend(aliasData, options.dimensions);
 
+      var periodMs = options.period * 1000;
       return _.map(options.statistics, function(stat) {
-        var dps = _.chain(md.Datapoints).map(function(dp) {
-          return [dp[stat], new Date(dp.Timestamp).getTime()];
-        })
+        var dps = [];
+        var lastTimestamp = null;
+        _.chain(md.Datapoints)
         .sortBy(function(dp) {
-          return dp[1];
-        }).value();
+          return dp.Timestamp;
+        })
+        .each(function(dp) {
+          var timestamp = new Date(dp.Timestamp).getTime();
+          if (lastTimestamp && (timestamp - lastTimestamp) > periodMs * 2) {
+            dps.push([null, lastTimestamp + periodMs]);
+          }
+          lastTimestamp = timestamp;
+          dps.push([dp[stat], timestamp]);
+        });
 
         aliasData.stat = stat;
         var seriesName = aliasPattern.replace(aliasRegex, function(match, g1) {

+ 16 - 0
public/app/plugins/datasource/cloudwatch/specs/datasource_specs.ts

@@ -48,6 +48,14 @@ describe('CloudWatchDatasource', function() {
         {
           Average: 1,
           Timestamp: 'Wed Dec 31 1969 16:00:00 GMT-0800 (PST)'
+        },
+        {
+          Average: 2,
+          Timestamp: 'Wed Dec 31 1969 16:05:00 GMT-0800 (PST)'
+        },
+        {
+          Average: 5,
+          Timestamp: 'Wed Dec 31 1969 16:20:00 GMT-0800 (PST)'
         }
       ],
       Label: 'CPUUtilization'
@@ -82,6 +90,14 @@ describe('CloudWatchDatasource', function() {
       });
       ctx.$rootScope.$apply();
     });
+
+    it('should return null for missing data point', function(done) {
+      ctx.ds.query(query).then(function(result) {
+        expect(result.data[0].datapoints[2][0]).to.be(null);
+        done();
+      });
+      ctx.$rootScope.$apply();
+    });
   });
 
   function describeMetricFindQuery(query, func) {