Skip to content

Commit d3a6c1b

Browse files
authored
Merge pull request #181 from deploymenttheory/dev
Dev
2 parents 33abc7e + 5f49f63 commit d3a6c1b

File tree

1 file changed

+26
-27
lines changed

1 file changed

+26
-27
lines changed

concurrency/metrics.go

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -197,53 +197,52 @@ var responseTimes []time.Duration
197197

198198
// MonitorResponseTimeVariability monitors the response time variability and suggests a concurrency adjustment.
199199
func (ch *ConcurrencyHandler) MonitorResponseTimeVariability(responseTime time.Duration) int {
200+
ch.Metrics.Lock.Lock() // Ensure thread safety when accessing shared metrics
201+
defer ch.Metrics.Lock.Unlock()
202+
200203
// Append the latest response time
201204
responseTimes = append(responseTimes, responseTime)
202205
if len(responseTimes) > 10 { // Use the last 10 measurements for a smoother average
203206
responseTimes = responseTimes[1:]
204207
}
205208

206-
// Calculate moving average response time from the slice
207-
var sum time.Duration
208-
for _, rt := range responseTimes {
209-
sum += rt
210-
}
211-
averageResponseTime := sum / time.Duration(len(responseTimes))
212-
213-
// Calculate standard deviation based on the moving average
214-
var varianceSum float64
215-
for _, rt := range responseTimes {
216-
varianceSum += math.Pow(rt.Seconds()-averageResponseTime.Seconds(), 2)
217-
}
218-
variance := varianceSum / float64(len(responseTimes))
219-
stdDev := math.Sqrt(variance)
209+
stdDev := calculateStdDev(responseTimes)
220210

221211
// Action determination with debounce effect
222-
// Requires keeping track of how often the stdDev threshold has been exceeded
223-
const debounceCount = 3 // e.g., threshold must be exceeded in 3 consecutive checks to act
212+
// Debounce mechanism for scaling down
213+
const debounceCount = 3 // Threshold must be exceeded in 3 consecutive checks to act
224214
if stdDev > (ch.Metrics.ResponseTimeVariability.StdDevThreshold * 1.5) {
225215
ch.Metrics.ResponseTimeVariability.DebounceScaleDownCount++
216+
ch.logger.Info("Increased debounce counter", zap.Int("counter", ch.Metrics.ResponseTimeVariability.DebounceScaleDownCount))
226217
if ch.Metrics.ResponseTimeVariability.DebounceScaleDownCount >= debounceCount {
227218
ch.Metrics.ResponseTimeVariability.DebounceScaleDownCount = 0 // reset counter after action
228-
return -1 // Suggest decrease concurrency
219+
ch.logger.Info("Concurrent requests scaling down due to high response time variability")
220+
return -1 // Suggest decrease concurrency
229221
}
230222
} else {
231223
ch.Metrics.ResponseTimeVariability.DebounceScaleDownCount = 0 // reset counter if condition not met
232-
if stdDev <= ch.Metrics.ResponseTimeVariability.StdDevThreshold && len(ch.sem) < MaxConcurrency {
224+
if stdDev <= ch.Metrics.ResponseTimeVariability.StdDevThreshold && len(ch.sem) < cap(ch.sem) {
225+
ch.logger.Info("Concurrent requests scaling up as conditions are favorable")
233226
return 1 // Suggest increase concurrency if there is capacity
234227
}
235228
}
236229
return 0
237230
}
238231

239-
// calculateVariance calculates the variance of response times.
240-
func (ch *ConcurrencyHandler) calculateVariance(averageResponseTime time.Duration, responseTime time.Duration) float64 {
241-
// Convert time.Duration values to seconds
242-
averageSeconds := averageResponseTime.Seconds()
243-
responseSeconds := responseTime.Seconds()
232+
// calculateStdDev computes the standard deviation of response times.
233+
func calculateStdDev(times []time.Duration) float64 {
234+
var sum time.Duration
235+
for _, t := range times {
236+
sum += t
237+
}
238+
avg := sum / time.Duration(len(times))
239+
240+
var varianceSum float64
241+
for _, t := range times {
242+
varianceSum += math.Pow(t.Seconds()-avg.Seconds(), 2)
243+
}
244+
variance := varianceSum / float64(len(times))
245+
stdDev := math.Sqrt(variance)
244246

245-
// Calculate variance
246-
variance := (float64(ch.Metrics.ResponseTimeVariability.Count-1)*math.Pow(averageSeconds-responseSeconds, 2) + ch.Metrics.ResponseTimeVariability.Variance) / float64(ch.Metrics.ResponseTimeVariability.Count)
247-
ch.Metrics.ResponseTimeVariability.Variance = variance
248-
return variance
247+
return stdDev
249248
}

0 commit comments

Comments
 (0)