@@ -192,33 +192,37 @@ func (ch *ConcurrencyHandler) MonitorServerResponseCodes(resp *http.Response) in
192
192
return 0 // Default to no change if error rate is within acceptable limits
193
193
}
194
194
195
+ // A slice to hold the last n response times for averaging
196
+ var responseTimes []time.Duration
197
+
195
198
// MonitorResponseTimeVariability monitors the response time variability and suggests a concurrency adjustment.
196
199
func (ch * ConcurrencyHandler ) MonitorResponseTimeVariability (responseTime time.Duration ) int {
197
- ch .Metrics .Lock .Lock ()
198
- defer ch .Metrics .Lock .Unlock ()
199
-
200
- // Update ResponseTimeVariability metrics
201
- ch .Metrics .ResponseTimeVariability .Lock .Lock ()
202
- defer ch .Metrics .ResponseTimeVariability .Lock .Unlock ()
203
- ch .Metrics .ResponseTimeVariability .Total += responseTime
204
- ch .Metrics .ResponseTimeVariability .Count ++
205
-
206
- // Calculate average response time
207
- ch .Metrics .ResponseTimeVariability .Average = ch .Metrics .ResponseTimeVariability .Total / time .Duration (ch .Metrics .ResponseTimeVariability .Count )
200
+ // Append the latest response time
201
+ responseTimes = append (responseTimes , responseTime )
202
+ if len (responseTimes ) > 5 { // Use the last 5 measurements
203
+ responseTimes = responseTimes [1 :]
204
+ }
208
205
209
- // Calculate variance of response times
210
- ch .Metrics .ResponseTimeVariability .Variance = ch .calculateVariance (ch .Metrics .ResponseTimeVariability .Average , responseTime )
206
+ // Calculate 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 ))
211
212
212
- // Calculate standard deviation of response times
213
- stdDev := math .Sqrt (ch .Metrics .ResponseTimeVariability .Variance )
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 )
214
220
215
- // Determine action based on standard deviation
216
- if stdDev > ch .Metrics .ResponseTimeVariability .StdDevThreshold {
217
- // Suggest decrease concurrency
218
- return - 1
221
+ // Determine action based on standard deviation against a higher threshold
222
+ if stdDev > (ch .Metrics .ResponseTimeVariability .StdDevThreshold * 1.5 ) { // Increased threshold
223
+ return - 1 // Suggest decrease concurrency
219
224
} else if stdDev <= ch .Metrics .ResponseTimeVariability .StdDevThreshold && len (ch .sem ) < MaxConcurrency {
220
- // Suggest increase concurrency if there is capacity
221
- return 1
225
+ return 1 // Suggest increase concurrency if there is capacity
222
226
}
223
227
return 0
224
228
}
0 commit comments