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);
}