diff --git a/config.go b/config.go index 39c62f3..4856eb3 100644 --- a/config.go +++ b/config.go @@ -13,10 +13,13 @@ import ( ) const ( - DefaultHTTPTimeout = 10 * time.Second - DefaultUpdateEvery = 24 * time.Hour - DefaultRateLimitInterval = 100 * time.Millisecond - DefaultRateLimitBurst = 10 + DefaultHTTPTimeout = 10 * time.Second + DefaultUpdateEvery = 24 * time.Hour + DefaultRateLimitInterval = 100 * time.Millisecond + DefaultRateLimitBurst = 10 + DefaultCircuitBreakerOpenThreshold = 5 + DefaultCircuitBreakerHalfOpenTimeout = time.Minute + DefaultCircuitBreakerResetFailuresTimeout = 20 * time.Second ) type duration struct { @@ -71,15 +74,15 @@ func (c config) GetWorkerPoolSize() int { } func (c config) GetBasicAuthUser() []byte { - return []byte(c.BasicAuthUser) + return []byte(c.BasicAuthUser) } func (c config) GetBasicAuthPassword() []byte { - return []byte(c.BasicAuthPassword) + return []byte(c.BasicAuthPassword) } func (c config) HasBasicAuth() bool { - return c.BasicAuthUser != "" || c.BasicAuthPassword != "" + return c.BasicAuthUser != "" || c.BasicAuthPassword != "" } func (c config) GetProviders() []configProvider { @@ -87,13 +90,16 @@ func (c config) GetProviders() []configProvider { } type configProvider struct { - Name string `json:"name"` - Directory string `json:"directory"` - RateLimitInterval duration `json:"rate_limit_interval"` - RateLimitBurst uint `json:"rate_limit_burst"` - UpdateEvery duration `json:"update_every"` - HTTPTimeout duration `json:"http_timeout"` - SpecificParameters map[string]string `json:"specific_parameters"` + Name string `json:"name"` + Directory string `json:"directory"` + RateLimitInterval duration `json:"rate_limit_interval"` + RateLimitBurst uint `json:"rate_limit_burst"` + CircuitBreakerOpenThreshold uint32 `json:"circuit_breaker_open_threshold"` + CircuitBreakerHalfOpenTimeout duration `json:"circuit_breaker_half_open_timeout"` + CircuitBreakerResetFailuresTimeout duration `json:"circuit_breaker_reset_failures_timeout"` + UpdateEvery duration `json:"update_every"` + HTTPTimeout duration `json:"http_timeout"` + SpecificParameters map[string]string `json:"specific_parameters"` } func (c configProvider) GetName() string { @@ -124,6 +130,30 @@ func (c configProvider) GetRateLimitBurst() int { return int(c.RateLimitBurst) } +func (c configProvider) GetCircuitBreakerOpenThreshold() uint32 { + if c.CircuitBreakerOpenThreshold == 0 { + return DefaultCircuitBreakerOpenThreshold + } + + return c.CircuitBreakerOpenThreshold +} + +func (c configProvider) GetCircuitBreakerHalfOpenTimeout() time.Duration { + if c.CircuitBreakerHalfOpenTimeout.Duration == 0 { + return DefaultCircuitBreakerHalfOpenTimeout + } + + return c.CircuitBreakerHalfOpenTimeout.Duration +} + +func (c configProvider) GetCircuitBreakerResetFailuresTimeout() time.Duration { + if c.CircuitBreakerResetFailuresTimeout.Duration == 0 { + return DefaultCircuitBreakerResetFailuresTimeout + } + + return c.CircuitBreakerResetFailuresTimeout.Duration +} + func (c configProvider) GetUpdateEvery() time.Duration { if c.UpdateEvery.Duration == 0 { return DefaultUpdateEvery diff --git a/providers/init_test.go b/providers/init_test.go index 029806f..a1fce91 100644 --- a/providers/init_test.go +++ b/providers/init_test.go @@ -51,7 +51,10 @@ func (suite *ProviderTestSuite) SetupTest() { suite.http = topolib.NewHTTPClient(&http.Client{}, "test-agent", time.Millisecond, - 100) + 100, + 5, + time.Minute, + time.Minute) } type OnlineProviderTestSuite struct { diff --git a/utils.go b/utils.go index 3b86111..958c3c8 100644 --- a/utils.go +++ b/utils.go @@ -118,7 +118,10 @@ func makeNewHTTPClient(conf configProvider) topolib.HTTPClient { return topolib.NewHTTPClient(httpClient, "topographer/"+version, conf.GetRateLimitInterval(), - conf.GetRateLimitBurst()) + conf.GetRateLimitBurst(), + conf.GetCircuitBreakerOpenThreshold(), + conf.GetCircuitBreakerHalfOpenTimeout(), + conf.GetCircuitBreakerResetFailuresTimeout()) } func boolParam(param string) bool {