Skip to content

Commit 0653d4d

Browse files
authored
Merge pull request #179 from deploymenttheory/dev
Adjust concurrency logic and metrics in the concurrency package, and …
2 parents 7761f75 + 90d881f commit 0653d4d

File tree

1 file changed

+25
-21
lines changed

1 file changed

+25
-21
lines changed

concurrency/metrics.go

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -192,33 +192,37 @@ func (ch *ConcurrencyHandler) MonitorServerResponseCodes(resp *http.Response) in
192192
return 0 // Default to no change if error rate is within acceptable limits
193193
}
194194

195+
// A slice to hold the last n response times for averaging
196+
var responseTimes []time.Duration
197+
195198
// MonitorResponseTimeVariability monitors the response time variability and suggests a concurrency adjustment.
196199
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+
}
208205

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))
211212

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)
214220

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
219224
} 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
222226
}
223227
return 0
224228
}

0 commit comments

Comments
 (0)