private async Task <decimal> GetGroupDesiredValue(AutoScalingGroup resource, AutoScalingResourceConfig config)
        {
            decimal?result = null;

            if (config.InstanceCountIncreaseDelayMinutes != null)
            {
                result = await FetchLaggedGroupDesiredValueFromCloudWatch(resource, config.InstanceCountIncreaseDelayMinutes.Value);
            }

            return(result ?? resource.DesiredCapacity);
        }
        public async Task <decimal> GetValue(AutoScalingGroup resource, AutoScalingResourceConfig config, string property)
        {
            if (config == null)
            {
                throw new ArgumentNullException(nameof(config));
            }

            switch (property)
            {
            case "GroupDesiredCapacity":
                return(await GetGroupDesiredValue(resource, config));
            }

            throw new Exception("Unsupported property name");
        }
        private async Task <decimal> GetGroupDesiredValue(AutoScalingGroup resource, AutoScalingResourceConfig config)
        {
            if (config.InstanceCountIncreaseDelayMinutes == null)
            {
                return(resource.DesiredCapacity);
            }

            var delaySeconds = config.InstanceCountIncreaseDelayMinutes.Value * 60;
            var now          = _timeProvider.UtcNow;

            var metric = await _cloudWatch.GetMetricStatisticsAsync(
                new GetMetricStatisticsRequest()
            {
                Dimensions = new List <Dimension>()
                {
                    new Dimension()
                    {
                        Name  = "AutoScalingGroupName",
                        Value = resource.AutoScalingGroupName
                    }
                },
                Statistics = new List <string>()
                {
                    "Minimum"
                },
                Namespace  = "AWS/AutoScaling",
                Period     = delaySeconds,
                MetricName = "GroupDesiredCapacity",
                StartTime  = now.AddSeconds(-1 * delaySeconds),
                EndTime    = now
            }
                );

            var threshold = metric.Datapoints.FirstOrDefault();

            if (threshold == null)
            {
                throw new Exception(
                          $"No datapoints returned when requesting desired capacity from CloudWatch for {resource.AutoScalingGroupName}");
            }

            return((decimal)threshold.Minimum);
        }