Skip to content

Commit c5771c1

Browse files
authored
Issue ReactiveX#547: Added new metrics to Spring Boot HealthIndicator. (ReactiveX#569)
1 parent b439290 commit c5771c1

File tree

3 files changed

+67
-6
lines changed

3 files changed

+67
-6
lines changed

resilience4j-circuitbreaker/src/test/java/io/github/resilience4j/circuitbreaker/internal/CircuitBreakerStateMachineTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,56 @@ public void shouldReleasePermissionWhenExceptionIgnored() {
421421
assertCircuitBreakerMetricsEqualTo(-1f, 0, 0, 0, 0L);
422422
}
423423

424+
@Test
425+
public void shouldIgnoreExceptionsAndThenTransitionToClosed() {
426+
circuitBreaker.transitionToOpenState();
427+
circuitBreaker.transitionToHalfOpenState();
428+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
429+
430+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
431+
// Should ignore NumberFormatException and release permission
432+
circuitBreaker.onError(0, TimeUnit.NANOSECONDS, new NumberFormatException());
433+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
434+
435+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
436+
// Should ignore NumberFormatException and release permission
437+
circuitBreaker.onError(0, TimeUnit.NANOSECONDS, new NumberFormatException());
438+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
439+
440+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
441+
// Should ignore NumberFormatException and release permission
442+
circuitBreaker.onError(0, TimeUnit.NANOSECONDS, new NumberFormatException());
443+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
444+
445+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
446+
// Should ignore NumberFormatException and release permission
447+
circuitBreaker.onError(0, TimeUnit.NANOSECONDS, new NumberFormatException());
448+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
449+
450+
assertCircuitBreakerMetricsEqualTo(-1f, 0, 0, 0, 0L);
451+
452+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
453+
circuitBreaker.onSuccess(0, TimeUnit.NANOSECONDS); //
454+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
455+
456+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
457+
circuitBreaker.onSuccess(0, TimeUnit.NANOSECONDS); //
458+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
459+
460+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
461+
circuitBreaker.onSuccess(0, TimeUnit.NANOSECONDS); //
462+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN);
463+
464+
assertCircuitBreakerMetricsEqualTo(-1f, 3, 3, 0, 0L);
465+
466+
assertThat(circuitBreaker.tryAcquirePermission()).isEqualTo(true);
467+
circuitBreaker.onSuccess(0, TimeUnit.NANOSECONDS); //
468+
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED);
469+
470+
assertCircuitBreakerMetricsEqualTo(-1f, 0, 0, 0, 0L);
471+
}
472+
473+
424474
@Test
425475
public void shouldNotAllowTransitionFromClosedToHalfOpen() {
426476
assertThatThrownBy(() -> circuitBreaker.transitionToHalfOpenState()).isInstanceOf(IllegalStateTransitionException.class)

resilience4j-spring-boot-common/src/main/java/io/github/resilience4j/circuitbreaker/monitoring/health/CircuitBreakerHealthIndicator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@
2929
public class CircuitBreakerHealthIndicator implements HealthIndicator {
3030

3131
private static final String FAILURE_RATE = "failureRate";
32-
private static final String FAILURE_RATE_THRESHOLD = "setFailureRateThreshold";
32+
private static final String SLOW_CALL_RATE = "slowCallRate";
33+
private static final String FAILURE_RATE_THRESHOLD = "failureRateThreshold";
34+
private static final String SLOW_CALL_RATE_THRESHOLD = "slowCallRateThreshold";
3335
private static final String BUFFERED_CALLS = "bufferedCalls";
3436
private static final String FAILED_CALLS = "failedCalls";
37+
private static final String SLOW_CALLS = "slowCalls";
3538
private static final String NOT_PERMITTED = "notPermittedCalls";
3639
private static final String STATE = "state";
3740
private final CircuitBreaker circuitBreaker;
@@ -65,7 +68,10 @@ private Health.Builder addDetails(Health.Builder builder, CircuitBreaker circuit
6568
CircuitBreakerConfig config = circuitBreaker.getCircuitBreakerConfig();
6669
builder.withDetail(FAILURE_RATE, metrics.getFailureRate() + "%")
6770
.withDetail(FAILURE_RATE_THRESHOLD, config.getFailureRateThreshold() + "%")
71+
.withDetail(SLOW_CALL_RATE, metrics.getSlowCallRate() + "%")
72+
.withDetail(SLOW_CALL_RATE_THRESHOLD, config.getSlowCallRateThreshold() + "%")
6873
.withDetail(BUFFERED_CALLS, metrics.getNumberOfBufferedCalls())
74+
.withDetail(SLOW_CALLS, metrics.getNumberOfSlowCalls())
6975
.withDetail(FAILED_CALLS, metrics.getNumberOfFailedCalls())
7076
.withDetail(NOT_PERMITTED, metrics.getNumberOfNotPermittedCalls())
7177
.withDetail(STATE, circuitBreaker.getState());

resilience4j-spring-boot-common/src/test/java/io/github/resilience4j/circuitbreaker/monitoring/health/CircuitBreakerHealthIndicatorTest.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@ public void healthMetricsAndConfig() {
2929
CircuitBreakerHealthIndicator healthIndicator = new CircuitBreakerHealthIndicator(circuitBreaker);
3030

3131
//when
32-
when(config.getFailureRateThreshold()).thenReturn(0.3f);
33-
34-
when(metrics.getFailureRate()).thenReturn(0.2f);
32+
when(config.getFailureRateThreshold()).thenReturn(30f);
33+
when(metrics.getFailureRate()).thenReturn(20f);
34+
when(metrics.getSlowCallRate()).thenReturn(20f);
35+
when(config.getSlowCallRateThreshold()).thenReturn(50f);
3536
when(metrics.getNumberOfBufferedCalls()).thenReturn(100);
3637
when(metrics.getNumberOfFailedCalls()).thenReturn(20);
38+
when(metrics.getNumberOfSlowCalls()).thenReturn(20);
3739
when(metrics.getNumberOfNotPermittedCalls()).thenReturn(0L);
3840

3941
when(circuitBreaker.getCircuitBreakerConfig()).thenReturn(config);
@@ -45,9 +47,12 @@ public void healthMetricsAndConfig() {
4547
then(health.getStatus()).isEqualTo(Status.UP);
4648
then(health.getDetails())
4749
.contains(
48-
entry("failureRate", "0.2%"),
49-
entry("setFailureRateThreshold", "0.3%"),
50+
entry("failureRate", "20.0%"),
51+
entry("slowCallRate", "20.0%"),
52+
entry("slowCallRateThreshold", "50.0%"),
53+
entry("failureRateThreshold", "30.0%"),
5054
entry("bufferedCalls", 100),
55+
entry("slowCalls", 20),
5156
entry("failedCalls", 20),
5257
entry("notPermittedCalls", 0L)
5358
);

0 commit comments

Comments
 (0)