in codegen/template_bundle/template_files.go [1656:1710]
func configureCircuitBreaker(deps *module.Dependencies, timeoutVal int, circuitBreakerName string, qpsLevel string) {
// sleepWindowInMilliseconds sets the amount of time, after tripping the circuit,
// to reject requests before allowing attempts again to determine if the circuit should again be closed
sleepWindowInMilliseconds := 5000
// maxConcurrentRequests sets how many requests can be run at the same time, beyond which requests are rejected
maxConcurrentRequests := 20
// errorPercentThreshold sets the error percentage at or above which the circuit should trip open
errorPercentThreshold := 20
// requestVolumeThreshold sets a minimum number of requests that will trip the circuit in a rolling window of 10s
// For example, if the value is 20, then if only 19 requests are received in the rolling window of 10 seconds
// the circuit will not trip open even if all 19 failed.
requestVolumeThreshold := 20
// parses circuit breaker configurations
if deps.Default.Config.ContainsKey(CircuitBreakerConfigKey) {
var config CircuitBreakerConfig
deps.Default.Config.MustGetStruct(CircuitBreakerConfigKey, &config)
parameters := config.Parameters
// first checks if level exists in configurations then assigns parameters
// if "default" qps level assigns default parameters from circuit breaker configurations
if settings, ok := parameters[qpsLevel]; ok {
if sleep, ok := settings["sleepWindowInMilliseconds"]; ok {
sleepWindowInMilliseconds = sleep
}
if max, ok := settings["maxConcurrentRequests"]; ok {
maxConcurrentRequests = max
}
if errorPercent, ok := settings["errorPercentThreshold"]; ok {
errorPercentThreshold = errorPercent
}
if reqVolThreshold, ok := settings["requestVolumeThreshold"]; ok {
requestVolumeThreshold = reqVolThreshold
}
}
}
// client settings override parameters
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.sleepWindowInMilliseconds") {
sleepWindowInMilliseconds = int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.sleepWindowInMilliseconds"))
}
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.maxConcurrentRequests") {
maxConcurrentRequests = int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.maxConcurrentRequests"))
}
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.errorPercentThreshold") {
errorPercentThreshold = int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.errorPercentThreshold"))
}
if deps.Default.Config.ContainsKey("clients.{{$clientID}}.requestVolumeThreshold") {
requestVolumeThreshold = int(deps.Default.Config.MustGetInt("clients.{{$clientID}}.requestVolumeThreshold"))
}
hystrix.ConfigureCommand(circuitBreakerName, hystrix.CommandConfig{
MaxConcurrentRequests: maxConcurrentRequests,
ErrorPercentThreshold: errorPercentThreshold,
SleepWindow: sleepWindowInMilliseconds,
RequestVolumeThreshold: requestVolumeThreshold,
Timeout: timeoutVal,
})
}