in pkg/operator/rules.go [135:195]
func (r *rulesReconciler) scaleRuleConsumers(ctx context.Context) error {
logger, _ := logr.FromContext(ctx)
var desiredReplicas int32
var hasAnyRules bool
for _, check := range []ruleCheck{hasRules, hasClusterRules, hasGlobalRules} {
hasRules, err := check(ctx, r.client)
if err != nil {
return err
}
if hasRules {
hasAnyRules = true
break
}
}
if hasAnyRules {
desiredReplicas = 1
}
scaleClient := r.client.SubResource("scale")
alertManagerStatefulSet := appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Namespace: r.opts.OperatorNamespace,
Name: "alertmanager",
},
}
alertManagerScale := autoscalingv1.Scale{}
if err := scaleClient.Get(ctx, &alertManagerStatefulSet, &alertManagerScale); apierrors.IsNotFound(err) {
msg := fmt.Sprintf("Alertmanager StatefulSet not found, cannot scale to %d. In-cluster Alertmanager will not function.", desiredReplicas)
logger.Error(err, msg)
} else if err != nil {
return err
} else if alertManagerScale.Spec.Replicas != desiredReplicas {
alertManagerScale.Spec.Replicas = desiredReplicas
if err := scaleClient.Update(ctx, &alertManagerStatefulSet, client.WithSubResourceBody(&alertManagerScale)); err != nil {
return err
}
}
ruleEvaluatorDeployment := appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Namespace: r.opts.OperatorNamespace,
Name: "rule-evaluator",
},
}
ruleEvaluatorScale := autoscalingv1.Scale{}
if err := scaleClient.Get(ctx, &ruleEvaluatorDeployment, &ruleEvaluatorScale); apierrors.IsNotFound(err) {
msg := fmt.Sprintf("Rule Evaluator Deployment not found, cannot scale to %d. In-cluster Rule Evaluator will not function.", desiredReplicas)
logger.Error(err, msg)
} else if err != nil {
return err
} else if ruleEvaluatorScale.Spec.Replicas != desiredReplicas {
ruleEvaluatorScale.Spec.Replicas = desiredReplicas
if err := scaleClient.Update(ctx, &ruleEvaluatorDeployment, client.WithSubResourceBody(&ruleEvaluatorScale)); err != nil {
return err
}
}
return nil
}