Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.nitorcreations.willow.autoscaler.scaling;
  
 
 import  edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 import java.util.List;
 import java.util.Set;
 
 public class Scaler implements Runnable {
 
   public static final String TRIGGERED_POLICY_HAS_NO_EFFECT_ON_RUNNING_INSTANCES = "Triggered policy has no effect on running instances";
   private Logger logger = Logger.getLogger(this.getClass().getCanonicalName());
 
   public AtomicBoolean running = new AtomicBoolean(true);
 
   @Inject
 
   @Inject
 
   @Inject
 
   @Inject
 
   public void initialize(List<AutoScalingGroupConfiggroups) {
     for (final AutoScalingGroupConfig group : groups) {
       .scheduleAtFixedRate(new Runnable() {
 
         Set<AutoScalingPolicytriggeredPolicyHistory = new HashSet<>();
 
         @Override
         public void run() {
           try {
             .info("Autoscaler checking triggered policies for group " + group.getName());
             AutoScalingGroupStatus groupStatus = .getStatus(group.getName());
             CloudAdapter cloud = .get(group.getCloudProvider());
 
             actOnInstanceCountBounds(groupStatuscloud);
             List<AutoScalingPolicytriggeredPolicies = groupStatus.getTriggeredPolicies();
             maintainPolicyTriggerHistory(groupStatustriggeredPolicies);
             actOnPolicies(groupStatuscloudtriggeredPolicies);
           } catch (Exception e) {
             .log(."Scaler failure"e);
           }
         }
 
         private void actOnPolicies(AutoScalingGroupStatus groupStatusCloudAdapter cloudList<AutoScalingPolicytriggeredPolicies) {
           if (!triggeredPolicies.isEmpty()) {
             AutoScalingPolicy policy = triggeredPolicies.get(0); //TODO priority order?
             .info(String.format("Plan action for triggered policy %s for %s group %s"policy.getName(), group.getCloudProvider(), group.getName()));
             int currentInstances = groupStatus.getDeploymentStatus().getInstanceCount();
             int effect = policy.getPolicyEffect(currentInstances);
             if (effect > 0) {
               if (currentInstances + effect > group.getInstanceMaxCount()) {
                 .info(String.format("Capping scale out effect to maximum of %s instances"group.getInstanceMaxCount()));
                 effect = group.getInstanceMaxCount() - currentInstances;
               }
               if (effect > 0) {
                 scaleOut(groupeffectcloudpolicy);
               } else {
                 noEffect();
               }
             } else if (effect < 0) {
               if (currentInstances + effect < group.getInstanceBaseCount()) {
                 effect = currentInstances - group.getInstanceBaseCount();
                 .info(String.format("Capping scale in effect to keep minimum of %s instances"group.getInstanceBaseCount()));
               }
               effect = Math.abs(effect);
               if (effect > 0) {
                 scaleIn(groupeffectcloudpolicy);
               } else {
                 noEffect();
               }
             } else {
               noEffect();
             }
           }
        }
        private void noEffect() {
        }
        private void maintainPolicyTriggerHistory(AutoScalingGroupStatus groupStatusList<AutoScalingPolicytriggeredPolicies) {
          for (AutoScalingPolicy policy : triggeredPolicies) {
            if (!.contains(policy)) {
              .info(String.format("Triggered policy %s for %s group %s"policy.getName(), group.getCloudProvider(), group.getName()));
              sendMetricThresholdTriggeredEvent(policygroupgroupStatus);
              .add(policy);
            }
          }
          Set<AutoScalingPolicyclearedPolicies = new HashSet();
          clearedPolicies.removeAll(triggeredPolicies);
          for (AutoScalingPolicy policy : clearedPolicies) {
            .info(String.format("Policy %s for %s group %s no longer in triggered state"policy.getName(), group.getCloudProvider(), group.getName()));
            sendMetricThresholdClearedEvent(policygroupgroupStatus);
          }
          .retainAll(triggeredPolicies);
        }
        private void actOnInstanceCountBounds(AutoScalingGroupStatus groupStatusCloudAdapter cloud) {
          if (groupStatus.getDeploymentStatus() != null) {
            int currentCount = groupStatus.getDeploymentStatus().getInstanceCount();
            if (currentCount < group.getInstanceBaseCount()) {
              int startCount =group.getInstanceBaseCount() - currentCount;
              .info(String.format("%s group %s has %s instances running which is less than minimum of %s. Starting %s instances",
                  group.getCloudProvider(), group.getName(), currentCountgroup.getInstanceBaseCount(), startCount));
              scaleOut(groupstartCountcloudnull);
            } else if (currentCount > group.getInstanceMaxCount()) {
              int terminateCount = currentCount - group.getInstanceMaxCount();
              .info(String.format("%s group %s has %s instances running which is more than maximum of %s. Terminating %s instances",
                  group.getCloudProvider(), group.getName(), currentCountgroup.getInstanceBaseCount(), terminateCount));
              scaleIn(groupterminateCountcloudnull);
            }
          }
        }
        private void quietPeriod() {
          try {
            .info(String.format("Entering %s second quiet period for %s group %s"group.getQuietPeriodSeconds(),
                group.getCloudProvider(), group.getName()));
            Thread.sleep(..toMillis(group.getQuietPeriodSeconds()));
            .info(String.format("Continuing after quiet period for %s group %s"group.getCloudProvider(), group.getName()));
          } catch (InterruptedException e) {
            .info(String.format("interrupted during quiet period for %s group %s"group.getCloudProvider(), group.getName()));
          }
        }
        private void scaleOut(AutoScalingGroupConfig groupint effectCloudAdapter cloudAutoScalingPolicy policy) {
          .info(String.format("Starting %s instances in %s group %s"effectgroup.getCloudProvider(), group.getName()));
          List<StringinstanceIds = cloud.launchInstances(groupeffect);
          sendScaleOutEvent(policygroupinstanceIds);
          quietPeriod();
        }
        private void scaleIn(AutoScalingGroupConfig groupint effectCloudAdapter cloudAutoScalingPolicy policy) {
          .info(String.format("Terminating %s instances in %s group %s"effectgroup.getCloudProvider(), group.getName()));
          List<StringinstanceIds = cloud.terminateInstances(groupeffect);
          sendScaleInEvent(policygroupinstanceIds);
          quietPeriod();
        }
      }, 1, 10, .);
    }
  }
  public void run() {
  }
  public void stop() {
    this..set(false);
  }
                                                 AutoScalingGroupStatus groupStatus) {
    mte.metric = policy.getMetricName();
    mte.threshold = policy.getMetricThreshold().doubleValue();
    TimePoint<Doublevalue = groupStatus.getLastValueFor(policy.getMetricName());
    if (value != null) {
      mte.value = value.getValue();
    } else {
      mte.value = 0D;
    }
    mte.addTag("group_" + groupConfig.getName());
    mte.description = String.format(
        "Metric %s value %s is past threshold of %s defined in scaling policy %s. Policy action: %s",
        mte.metric,
        mte.value,
        mte.threshold,
        policy.getName(),
        policy.getScalingAction()
    );
    .queue(mte);
  }
  private void sendMetricThresholdClearedEvent(AutoScalingPolicy policyAutoScalingGroupConfig groupConfigAutoScalingGroupStatus groupStatus) {
    mte.metric = policy.getMetricName();
    mte.threshold = policy.getMetricThreshold().doubleValue();
    TimePoint<Doublevalue = groupStatus.getLastValueFor(policy.getMetricName());
    if (value != null) {
      mte.value = value.getValue();
    } else {
      mte.value = 0D;
    }
    mte.addTag("group_" + groupConfig.getName());
    mte.description = String.format(
        "Metric %s value %s is back within threshold of %s defined in scaling policy %s.",
        mte.metric,
        mte.value,
        mte.threshold,
        policy.getName()
    );
    .queue(mte);
  }
  @SuppressFBWarnings(value={"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"},
    justification="Fields used in serialization")
  private void sendScaleInEvent(AutoScalingPolicy policyAutoScalingGroupConfig groupConfig,
                                List<StringinstanceIds)  {
    ScaleInEvent sie = new ScaleInEvent();
    sie.addTag("group_" + groupConfig.getName());
    sie.cloudProvider = groupConfig.getCloudProvider();
    sie.group = groupConfig.getName();
    sie.instanceCount = instanceIds.size();
    sie.instanceIds = instanceIds;
    sie.policy = policy != null ? policy.getName() : "maxCount";
    sie.description = String.format(
        "Terminated %s instances in %s group %s due to policy %s",
        sie.instanceCount,
        sie.cloudProvider,
        sie.group,
        sie.policy
    );
    .queue(sie);
  }
  private void sendScaleOutEvent(AutoScalingPolicy policyAutoScalingGroupConfig groupConfig,
                                 List<StringinstanceIds)  {
    ScaleOutEvent soe = new ScaleOutEvent();
    soe.addTag("group_" + groupConfig.getName());
    soe.cloudProvider = groupConfig.getCloudProvider();
    soe.group = groupConfig.getName();
    soe.instanceCount = instanceIds.size();
    soe.instanceIds = instanceIds;
    soe.policy = policy != null ? policy.getName() : "baseCount";
    soe.description = String.format(
        "Launched %s new instances in %s group %s due to policy %s",
        soe.instanceCount,
        soe.cloudProvider,
        soe.group,
        soe.policy
    );
    .queue(soe);
  }
New to GrepCode? Check out our FAQ X