@Test() public void shouldUseRecordFailureThrowablePredicate() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .recordFailure(TEST_PREDICATE).build(); then(circuitBreakerConfig.getRecordFailurePredicate().test(new Error("test"))).isEqualTo(true); then(circuitBreakerConfig.getRecordFailurePredicate().test(new Error("fail"))).isEqualTo(false); then(circuitBreakerConfig.getRecordFailurePredicate().test(new RuntimeException("test"))).isEqualTo(true); then(circuitBreakerConfig.getRecordFailurePredicate().test(new Error())).isEqualTo(false); then(circuitBreakerConfig.getRecordFailurePredicate().test(new RuntimeException())).isEqualTo(false); }
@Test() public void shouldSetDefaultSettings() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.ofDefaults(); then(circuitBreakerConfig.getFailureRateThreshold()).isEqualTo(CircuitBreakerConfig.DEFAULT_MAX_FAILURE_THRESHOLD); then(circuitBreakerConfig.getRingBufferSizeInHalfOpenState()).isEqualTo(CircuitBreakerConfig.DEFAULT_RING_BUFFER_SIZE_IN_HALF_OPEN_STATE); then(circuitBreakerConfig.getRingBufferSizeInClosedState()).isEqualTo(CircuitBreakerConfig.DEFAULT_RING_BUFFER_SIZE_IN_CLOSED_STATE); then(circuitBreakerConfig.getWaitDurationInOpenState().getSeconds()).isEqualTo(CircuitBreakerConfig.DEFAULT_WAIT_DURATION_IN_OPEN_STATE); then(circuitBreakerConfig.getRecordFailurePredicate()).isNotNull(); }
ClosedState(CircuitBreakerStateMachine stateMachine, CircuitBreakerMetrics circuitBreakerMetrics) { super(stateMachine); CircuitBreakerConfig circuitBreakerConfig = stateMachine.getCircuitBreakerConfig(); if(circuitBreakerMetrics == null){ this.circuitBreakerMetrics = new CircuitBreakerMetrics( circuitBreakerConfig.getRingBufferSizeInClosedState()); }else{ this.circuitBreakerMetrics = circuitBreakerMetrics.copy(circuitBreakerConfig.getRingBufferSizeInClosedState()); } this.failureRateThreshold = stateMachine.getCircuitBreakerConfig().getFailureRateThreshold(); }
OpenState(CircuitBreakerStateMachine stateMachine, CircuitBreakerMetrics circuitBreakerMetrics) { super(stateMachine); final Duration waitDurationInOpenState = stateMachine.getCircuitBreakerConfig().getWaitDurationInOpenState(); this.retryAfterWaitDuration = Instant.now().plus(waitDurationInOpenState); this.circuitBreakerMetrics = circuitBreakerMetrics; if (stateMachine.getCircuitBreakerConfig().isAutomaticTransitionFromOpenToHalfOpenEnabled()) { AutoTransitioner.scheduleAutoTransition(stateMachine::transitionToHalfOpenState, waitDurationInOpenState); } }
HalfOpenState(CircuitBreakerStateMachine stateMachine) { super(stateMachine); CircuitBreakerConfig circuitBreakerConfig = stateMachine.getCircuitBreakerConfig(); this.circuitBreakerMetrics = new CircuitBreakerMetrics( circuitBreakerConfig.getRingBufferSizeInHalfOpenState()); this.failureRateThreshold = stateMachine.getCircuitBreakerConfig().getFailureRateThreshold(); }
@Test(expected = IllegalArgumentException.class) public void zeroWaitIntervalShouldFail() { CircuitBreakerConfig.custom().waitDurationInOpenState(Duration.ofMillis(0)).build(); }
@Test() public void shouldSetFailureRateThreshold() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().failureRateThreshold(25).build(); then(circuitBreakerConfig.getFailureRateThreshold()).isEqualTo(25); }
@Test() public void shouldSetRingBufferSizeInClosedState() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().ringBufferSizeInClosedState(1000).build(); then(circuitBreakerConfig.getRingBufferSizeInClosedState()).isEqualTo(1000); }
private io.github.resilience4j.circuitbreaker.CircuitBreaker getOrCreateCircuitBreaker(String methodName, String backend) { io.github.resilience4j.circuitbreaker.CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker(backend, () -> circuitBreakerProperties.createCircuitBreakerConfig(backend)); if (logger.isDebugEnabled()) { logger.debug("Created or retrieved circuit breaker '{}' with failure rate '{}' and wait interval'{}' for method: '{}'", backend, circuitBreaker.getCircuitBreakerConfig().getFailureRateThreshold(), circuitBreaker.getCircuitBreakerConfig().getWaitDurationInOpenState(), methodName); } return circuitBreaker; }
@Test() public void shouldSetWaitInterval() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().waitDurationInOpenState(Duration.ofSeconds(1)).build(); then(circuitBreakerConfig.getWaitDurationInOpenState().getSeconds()).isEqualTo(1); }
when(config.getFailureRateThreshold()).thenReturn(0.3f);
@Test() public void shouldSetRingBufferSizeInHalfOpenState() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().ringBufferSizeInHalfOpenState(100).build(); then(circuitBreakerConfig.getRingBufferSizeInHalfOpenState()).isEqualTo(100); }
DisabledState(CircuitBreakerStateMachine stateMachine) { super(stateMachine); CircuitBreakerConfig circuitBreakerConfig = stateMachine.getCircuitBreakerConfig(); final int size = circuitBreakerConfig.getRingBufferSizeInClosedState(); this.circuitBreakerMetrics = new CircuitBreakerMetrics(size); }
/** * Creates a circuitBreaker with default config. * * @param name the name of the CircuitBreaker */ public CircuitBreakerStateMachine(String name) { this(name, CircuitBreakerConfig.ofDefaults()); }
@Override public void onError(long durationInNanos, Throwable throwable) { if (circuitBreakerConfig.getRecordFailurePredicate().test(throwable)) { LOG.debug("CircuitBreaker '{}' recorded a failure:", name, throwable); publishCircuitErrorEvent(name, durationInNanos, throwable); stateReference.get().onError(throwable); } else { publishCircuitIgnoredErrorEvent(name, durationInNanos, throwable); } }
ForcedOpenState(CircuitBreakerStateMachine stateMachine) { super(stateMachine); CircuitBreakerConfig circuitBreakerConfig = stateMachine.getCircuitBreakerConfig(); final int size = circuitBreakerConfig.getRingBufferSizeInHalfOpenState(); this.circuitBreakerMetrics = new CircuitBreakerMetrics(size); }
@Test(expected = IllegalArgumentException.class) public void ringBufferSizeInHalfOpenStateBelowOneShouldFail() { CircuitBreakerConfig.custom().ringBufferSizeInHalfOpenState(0).build(); }
@Test() public void shouldSetLowFailureRateThreshold() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().failureRateThreshold(0.001f).build(); then(circuitBreakerConfig.getFailureRateThreshold()).isEqualTo(0.001f); }
@Test() public void shouldBuilderCreateConfigEveryTime() { final CircuitBreakerConfig.Builder builder = CircuitBreakerConfig.custom(); builder.ringBufferSizeInClosedState(5); final CircuitBreakerConfig config1 = builder.build(); builder.ringBufferSizeInClosedState(3); final CircuitBreakerConfig config2 = builder.build(); assertThat(config2.getRingBufferSizeInClosedState()).isEqualTo(3); assertThat(config1.getRingBufferSizeInClosedState()).isEqualTo(5); }
private io.github.resilience4j.circuitbreaker.CircuitBreaker getOrCreateCircuitBreaker(String methodName, String backend) { io.github.resilience4j.circuitbreaker.CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker(backend, () -> circuitBreakerProperties.createCircuitBreakerConfig(backend)); if (logger.isDebugEnabled()) { logger.debug("Created or retrieved circuit breaker '{}' with failure rate '{}' and wait interval'{}' for method: '{}'", backend, circuitBreaker.getCircuitBreakerConfig().getFailureRateThreshold(), circuitBreaker.getCircuitBreakerConfig().getWaitDurationInOpenState(), methodName); } return circuitBreaker; }