in cloudwatch-lambda/src/main/java/com/amazonwebservices/blogs/containers/CloudWatchAlarmHandler.java [249:294]
private int computeScaling (ComparisonOperator operator,
int minReplicas,
int maxReplicas,
int replicas,
ScalingBehavior scaleUpBehavior,
ScalingBehavior scaleDownBehavior) {
ScalingBehavior behavior = null;
boolean scalingUp = true;
if (Objects.equals(operator, ComparisonOperator.GreaterThanOrEqualToThreshold) ||
Objects.equals(operator, ComparisonOperator.GreaterThanThreshold)) {
behavior = scaleUpBehavior;
scalingUp = true;
}
else if (Objects.equals(operator, ComparisonOperator.LessThanOrEqualToThreshold) ||
Objects.equals(operator, ComparisonOperator.LessThanThreshold)) {
behavior = scaleDownBehavior;
scalingUp = false;
}
List<ScalingPolicy> policies = behavior.getPolicies();
int changeInReplicas = Integer.MIN_VALUE;
for (ScalingPolicy policy : policies) {
if (Objects.equals(policy.getType(), ScalingPolicy.ScalingType.Pods)) {
int value = policy.getValue();
if (value >= changeInReplicas) changeInReplicas = value;
}
else if (Objects.equals(policy.getType(), ScalingPolicy.ScalingType.Percent)) {
int value = policy.getValue() * replicas / 100;
if (value >= changeInReplicas) changeInReplicas = value;
}
}
int scaledReplicas = -1;
if (scalingUp) {
scaledReplicas = replicas + changeInReplicas;
if (scaledReplicas > maxReplicas) scaledReplicas = maxReplicas;
}
else {
scaledReplicas = replicas - changeInReplicas;
if (scaledReplicas < minReplicas) scaledReplicas = minReplicas;
}
logger.info(String.format("Number of replicas after scaling set to %d", scaledReplicas));
return scaledReplicas;
}