Skip to content

Commit 629d811

Browse files
committed
refactor(evaluator): streamline trigger evaluation and validation logic
1 parent 651379a commit 629d811

File tree

1 file changed

+45
-35
lines changed

1 file changed

+45
-35
lines changed

src/autoscaler/eventgenerator/generator/evaluator.go

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,24 @@ func (e *Evaluator) Stop() {
6969
e.logger.Info("stopped")
7070
}
7171

72-
func (e *Evaluator) doEvaluate(triggerArray []*models.Trigger) {
73-
for _, trigger := range triggerArray {
72+
func (e *Evaluator) filterOutInvalidTriggers(triggers []*models.Trigger) []*models.Trigger {
73+
result := make([]*models.Trigger, len(triggers))
74+
for _, trigger := range triggers {
7475
if trigger.BreachDurationSeconds <= 0 {
7576
trigger.BreachDurationSeconds = e.defaultBreachDurationSecs
7677
}
77-
threshold := trigger.Threshold
78-
operator := trigger.Operator
79-
if !e.isValidOperator(operator) {
78+
if !e.hasValidOperator(trigger) {
8079
e.logger.Error("operator-is-invalid", nil, lager.Data{"trigger": trigger})
8180
continue
8281
}
82+
result = append(result, trigger)
83+
}
84+
return result
85+
}
8386

87+
func (e *Evaluator) doEvaluate(triggerArray []*models.Trigger) {
88+
triggers := e.filterOutInvalidTriggers(triggerArray)
89+
for _, trigger := range triggers {
8490
appMetricList, err := e.retrieveAppMetrics(trigger)
8591
if err != nil {
8692
continue
@@ -90,66 +96,70 @@ func (e *Evaluator) doEvaluate(triggerArray []*models.Trigger) {
9096
continue
9197
}
9298

93-
isBreached, appMetric := checkForBreach(appMetricList, e, trigger, operator, threshold)
94-
95-
if isBreached {
99+
if e.isBreached(trigger, appMetricList) {
96100
trigger.MetricUnit = appMetricList[0].Unit
97-
e.logger.Info("send trigger alarm to scaling engine", lager.Data{"trigger": trigger, "last_metric": appMetric})
98-
99-
if appBreaker := e.getBreaker(trigger.AppId); appBreaker != nil {
100-
if appBreaker.Tripped() {
101-
e.logger.Info("circuit-tripped", lager.Data{"appId": trigger.AppId, "consecutiveFailures": appBreaker.ConsecFailures()})
102-
}
103-
err = appBreaker.Call(func() error { return e.sendTriggerAlarm(trigger) }, 0)
104-
if err != nil {
105-
e.logger.Error("circuit-alarm-failed", err, lager.Data{"appId": trigger.AppId})
106-
}
107-
} else {
108-
err = e.sendTriggerAlarm(trigger)
109-
if err != nil {
110-
e.logger.Error("circuit-alarm-failed", err, lager.Data{"appId": trigger.AppId})
111-
}
112-
}
101+
e.logger.Info("send trigger alarm to scaling engine", lager.Data{"trigger": trigger, "last_metric": appMetricList[len(appMetricList)-1]})
102+
e.sendToScalingEngine(trigger)
113103
return
114104
}
115105
}
116106
}
117107

118-
func checkForBreach(appMetricList []*models.AppMetric, e *Evaluator, trigger *models.Trigger, operator string, threshold int64) (bool, *models.AppMetric) {
108+
func (e *Evaluator) sendToScalingEngine(trigger *models.Trigger) {
109+
if appBreaker := e.getBreaker(trigger.AppId); appBreaker != nil {
110+
if appBreaker.Tripped() {
111+
e.logger.Info("circuit-tripped", lager.Data{"appId": trigger.AppId, "consecutiveFailures": appBreaker.ConsecFailures()})
112+
}
113+
err := appBreaker.Call(func() error { return e.sendTriggerAlarm(trigger) }, 0)
114+
if err != nil {
115+
e.logger.Error("circuit-alarm-failed", err, lager.Data{"appId": trigger.AppId})
116+
}
117+
} else {
118+
err := e.sendTriggerAlarm(trigger)
119+
if err != nil {
120+
e.logger.Error("circuit-alarm-failed", err, lager.Data{"appId": trigger.AppId})
121+
}
122+
}
123+
}
124+
125+
func (e *Evaluator) isBreached(trigger *models.Trigger, appMetricList []*models.AppMetric) bool {
126+
operator := trigger.Operator
127+
threshold := trigger.Threshold
128+
119129
var appMetric *models.AppMetric
120130
for _, appMetric = range appMetricList {
121131
if appMetric.Value == "" {
122132
e.logger.Debug("should not send trigger alarm to scaling engine because there is empty value metric", lager.Data{"trigger": trigger, "appMetric": appMetric})
123-
return false, appMetric
133+
return false
124134
}
125135
value, err := strconv.ParseInt(appMetric.Value, 10, 64)
126136
if err != nil {
127137
e.logger.Debug("should not send trigger alarm to scaling engine because parse metric value fails", lager.Data{"trigger": trigger, "appMetric": appMetric})
128-
return false, appMetric
138+
return false
129139
}
130140
if operator == ">" {
131141
if value <= threshold {
132142
e.logger.Debug("should not send trigger alarm to scaling engine", lager.Data{"trigger": trigger, "appMetric": appMetric})
133-
return false, appMetric
143+
return false
134144
}
135145
} else if operator == ">=" {
136146
if value < threshold {
137147
e.logger.Debug("should not send trigger alarm to scaling engine", lager.Data{"trigger": trigger, "appMetric": appMetric})
138-
return false, appMetric
148+
return false
139149
}
140150
} else if operator == "<" {
141151
if value >= threshold {
142152
e.logger.Debug("should not send trigger alarm to scaling engine", lager.Data{"trigger": trigger, "appMetric": appMetric})
143-
return false, appMetric
153+
return false
144154
}
145155
} else if operator == "<=" {
146156
if value > threshold {
147157
e.logger.Debug("should not send trigger alarm to scaling engine", lager.Data{"trigger": trigger, "appMetric": appMetric})
148-
return false, appMetric
158+
return false
149159
}
150160
}
151161
}
152-
return true, appMetric
162+
return true
153163
}
154164

155165
func (e *Evaluator) retrieveAppMetrics(trigger *models.Trigger) ([]*models.AppMetric, error) {
@@ -202,7 +212,7 @@ func (e *Evaluator) sendTriggerAlarm(trigger *models.Trigger) error {
202212
return err
203213
}
204214

205-
defer resp.Body.Close()
215+
defer func() { _ = resp.Body.Close() }()
206216

207217
respBody, err := io.ReadAll(resp.Body)
208218
if err != nil {
@@ -227,9 +237,9 @@ func (e *Evaluator) sendTriggerAlarm(trigger *models.Trigger) error {
227237
return err
228238
}
229239

230-
func (e *Evaluator) isValidOperator(operator string) bool {
240+
func (e *Evaluator) hasValidOperator(trigger *models.Trigger) bool {
231241
for _, o := range validOperators {
232-
if o == operator {
242+
if o == trigger.Operator {
233243
return true
234244
}
235245
}

0 commit comments

Comments
 (0)