diff --git a/cloudplatform/resilience-api/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience/ResilienceConfiguration.java b/cloudplatform/resilience-api/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience/ResilienceConfiguration.java index ceb5089b0..73afd28d1 100644 --- a/cloudplatform/resilience-api/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience/ResilienceConfiguration.java +++ b/cloudplatform/resilience-api/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience/ResilienceConfiguration.java @@ -428,6 +428,18 @@ public static final class CircuitBreakerConfiguration */ public static final Duration DEFAULT_WAIT_DURATION = Duration.ofSeconds(10); + /** + * The default duration threshold above which calls are considered as slow. + * Matches the Resilience4j default of 60 seconds. + */ + public static final Duration DEFAULT_SLOW_CALL_DURATION_THRESHOLD = Duration.ofSeconds(60); + + /** + * The default slow call rate threshold (as percentage within [0, 100]). + * Matches the Resilience4j default of 100%. + */ + public static final float DEFAULT_SLOW_CALL_RATE_THRESHOLD = 100; + /** * Flag to indicate active CircuitBreakerConfiguration. */ @@ -461,6 +473,22 @@ public static final class CircuitBreakerConfiguration */ private int halfOpenBufferSize = DEFAULT_HALF_OPEN_BUFFER_SIZE; + /** + * The duration threshold above which calls are considered as slow and increase the slow call rate. + * When the percentage of slow calls is equal to or greater than {@link #slowCallRateThreshold}, + * the CircuitBreaker transitions to OPEN and starts short-circuiting calls. + */ + @Nonnull + private Duration slowCallDurationThreshold = DEFAULT_SLOW_CALL_DURATION_THRESHOLD; + + /** + * The slow call rate threshold (as percentage within [0, 100]). The CircuitBreaker considers a call as slow + * when the call duration is greater than {@link #slowCallDurationThreshold}. When the percentage of slow calls + * is equal to or greater than the threshold, the CircuitBreaker transitions to OPEN and starts + * short-circuiting calls. + */ + private float slowCallRateThreshold = DEFAULT_SLOW_CALL_RATE_THRESHOLD; + /** * Get the status indicator for the CircuitBreaker. * diff --git a/cloudplatform/resilience4j/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience4j/DefaultCircuitBreakerProvider.java b/cloudplatform/resilience4j/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience4j/DefaultCircuitBreakerProvider.java index 43a2c15d3..ee9da5055 100644 --- a/cloudplatform/resilience4j/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience4j/DefaultCircuitBreakerProvider.java +++ b/cloudplatform/resilience4j/src/main/java/com/sap/cloud/sdk/cloudplatform/resilience4j/DefaultCircuitBreakerProvider.java @@ -55,6 +55,8 @@ public CircuitBreaker getCircuitBreaker( @Nonnull final ResilienceConfiguration .slidingWindowSize(configuration.circuitBreakerConfiguration().closedBufferSize()) .minimumNumberOfCalls(configuration.circuitBreakerConfiguration().closedBufferSize()) .permittedNumberOfCallsInHalfOpenState(configuration.circuitBreakerConfiguration().halfOpenBufferSize()) + .slowCallDurationThreshold(configuration.circuitBreakerConfiguration().slowCallDurationThreshold()) + .slowCallRateThreshold(configuration.circuitBreakerConfiguration().slowCallRateThreshold()) .build(); val circuitBreaker = circuitBreakerRegistry.circuitBreaker(identifier, customCircuitBreakerConfig);