@@ -197,53 +197,52 @@ var responseTimes []time.Duration
197
197
198
198
// MonitorResponseTimeVariability monitors the response time variability and suggests a concurrency adjustment.
199
199
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
+
200
203
// Append the latest response time
201
204
responseTimes = append (responseTimes , responseTime )
202
205
if len (responseTimes ) > 10 { // Use the last 10 measurements for a smoother average
203
206
responseTimes = responseTimes [1 :]
204
207
}
205
208
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 )
220
210
221
211
// 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
224
214
if stdDev > (ch .Metrics .ResponseTimeVariability .StdDevThreshold * 1.5 ) {
225
215
ch .Metrics .ResponseTimeVariability .DebounceScaleDownCount ++
216
+ ch .logger .Info ("Increased debounce counter" , zap .Int ("counter" , ch .Metrics .ResponseTimeVariability .DebounceScaleDownCount ))
226
217
if ch .Metrics .ResponseTimeVariability .DebounceScaleDownCount >= debounceCount {
227
218
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
229
221
}
230
222
} else {
231
223
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" )
233
226
return 1 // Suggest increase concurrency if there is capacity
234
227
}
235
228
}
236
229
return 0
237
230
}
238
231
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 )
244
246
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
249
248
}
0 commit comments