Scalr_Scaling_Manager::makeScalingDecision PHP Method

makeScalingDecision() public method

Makes a decision to scale farm
public makeScalingDecision ( ) : Scalr_Scaling_Decision
return Scalr_Scaling_Decision
    function makeScalingDecision()
    {
        // Base Scaling
        foreach (Scalr_Role_Behavior::getListForFarmRole($this->dbFarmRole) as $behavior) {
            $result = $behavior->makeUpscaleDecision($this->dbFarmRole);
            if ($result === false) {
                continue;
            } else {
                return $result;
            }
        }
        $farmPendingInstances = $this->db->GetOne("SELECT COUNT(*) FROM servers WHERE farm_id=? AND status IN (?,?,?)", array($this->dbFarmRole->FarmID, SERVER_STATUS::PENDING, SERVER_STATUS::INIT, SERVER_STATUS::PENDING_LAUNCH));
        if ($this->dbFarmRole->GetFarmObject()->RolesLaunchOrder == 1 && $farmPendingInstances > 0) {
            if ($this->dbFarmRole->GetRunningInstancesCount() == 0) {
                $this->logger->info("{$farmPendingInstances} instances in pending state. Launch roles one-by-one. Waiting...");
                return Scalr_Scaling_Decision::STOP_SCALING;
            }
        }
        $scalingMetricDecision = null;
        $scalingMetricInstancesCount = null;
        $this->logger->info(sprintf(_("%s scaling rules configured"), count($this->farmRoleMetrics)));
        if (isset($this->farmRoleMetrics[Entity\ScalingMetric::METRIC_DATE_AND_TIME_ID])) {
            // Date & Time scaling
            $dateAndTimeMetric = $this->farmRoleMetrics[Entity\ScalingMetric::METRIC_DATE_AND_TIME_ID];
            try {
                $scalingMetricDecision = $dateAndTimeMetric->getScalingDecision();
            } catch (Exception $e) {
                $this->logger->error("Scaling error in deciding metric '{$dateAndTimeMetric->getMetric()->name}' for farm role '{$this->dbFarmRole->FarmID}:{$this->dbFarmRole->Alias}': {$e->getMessage()}");
            }
            $scalingMetricName = $dateAndTimeMetric->getMetric()->name;
            $scalingMetricInstancesCount = $dateAndTimeMetric->instancesNumber;
            $this->decisonInfo = "Metric: {$scalingMetricName}";
            if ($scalingMetricDecision !== Scalr_Scaling_Decision::NOOP) {
                $this->logDecisionInfo($scalingMetricDecision, $scalingMetricName, $dateAndTimeMetric->lastValue);
                return $scalingMetricDecision;
            }
        } else {
            // Metrics scaling
            $farmRoleMetrics = array_diff_key($this->farmRoleMetrics, [Entity\ScalingMetric::METRIC_DATE_AND_TIME_ID => null]);
            if (!empty($farmRoleMetrics)) {
                $checkAllMetrics = $this->dbFarmRole->GetSetting(Entity\FarmRoleSetting::SCALING_DOWN_ONLY_IF_ALL_METRICS_TRUE);
                $variousDecisions = false;
                /* @var $farmRoleMetric Scalr_Scaling_FarmRoleMetric */
                foreach ($farmRoleMetrics as $farmRoleMetric) {
                    try {
                        $newDecision = $farmRoleMetric->getScalingDecision();
                    } catch (Exception $e) {
                        $this->logger->error("Scaling error in deciding metric '{$farmRoleMetric->getMetric()->name}' for farm role '{$this->dbFarmRole->FarmID}:{$this->dbFarmRole->Alias}': {$e->getMessage()}");
                        continue;
                    }
                    if (isset($scalingMetricDecision)) {
                        if ($newDecision != $scalingMetricDecision) {
                            $variousDecisions = true;
                        }
                    }
                    $scalingMetricDecision = $newDecision;
                    $scalingMetricName = $farmRoleMetric->getMetric()->name;
                    $this->decisonInfo = "Metric: {$farmRoleMetric->getMetric()->name}";
                    switch ($scalingMetricDecision) {
                        case Scalr_Scaling_Decision::NOOP:
                            continue;
                        case Scalr_Scaling_Decision::DOWNSCALE:
                            if (!$checkAllMetrics) {
                                break 2;
                            }
                            continue;
                        case Scalr_Scaling_Decision::UPSCALE:
                            break 2;
                    }
                }
                if (isset($scalingMetricDecision) && !($scalingMetricDecision == Scalr_Scaling_Decision::DOWNSCALE && $checkAllMetrics && $variousDecisions)) {
                    $this->logDecisionInfo($scalingMetricDecision, $scalingMetricName, "Metric value: {$farmRoleMetric->lastValue}");
                } else {
                    $scalingMetricDecision = Scalr_Scaling_Decision::NOOP;
                }
            }
        }
        return $this->getFinalDecision($scalingMetricDecision, $scalingMetricInstancesCount);
    }