From e47fdd8f3c9bc960022cae36200a8b4c3197bcb5 Mon Sep 17 00:00:00 2001 From: dira-AUR <243805326+dira-AUR@users.noreply.github.com> Date: Wed, 15 Apr 2026 12:18:17 +0200 Subject: [PATCH 1/3] feat(resilience): expose slowCallDurationThreshold and slowCallRateThreshold in CircuitBreakerConfiguration Add two new optional properties to CircuitBreakerConfiguration: - slowCallDurationThreshold (default: 60s, matching Resilience4j default) - slowCallRateThreshold (default: 100%, matching Resilience4j default) Wire both properties through DefaultCircuitBreakerProvider into the Resilience4j CircuitBreakerConfig builder. This is fully backwards-compatible as the defaults match Resilience4j's existing defaults. Resolves SAP/cloud-sdk-java#1148 Signed-off-by: dira-AUR <243805326+dira-AUR@users.noreply.github.com> --- .../resilience/ResilienceConfiguration.java | 28 +++++++++++++++++++ .../DefaultCircuitBreakerProvider.java | 2 ++ 2 files changed, 30 insertions(+) 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); From 27a212ca1dbffe6b9d845b10726b70c9ed35f303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20D=C3=BCmont?= Date: Thu, 23 Apr 2026 14:14:15 +0200 Subject: [PATCH 2/3] Format comments for better readability --- .../resilience/ResilienceConfiguration.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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 73afd28d1..6ad98413d 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 @@ -429,14 +429,14 @@ 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. + * 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%. + * 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; @@ -474,9 +474,9 @@ 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. + * 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; From c5d34cde13a9712ca201bb1a19534956abb73ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20D=C3=BCmont?= Date: Thu, 23 Apr 2026 14:16:54 +0200 Subject: [PATCH 3/3] Update documentation for slow call thresholds --- .../sdk/cloudplatform/resilience/ResilienceConfiguration.java | 4 ++++ 1 file changed, 4 insertions(+) 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 6ad98413d..8e1dc195f 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 @@ -477,6 +477,8 @@ public static final class CircuitBreakerConfiguration * 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. + * + * @since 5.29.0 */ @Nonnull private Duration slowCallDurationThreshold = DEFAULT_SLOW_CALL_DURATION_THRESHOLD; @@ -486,6 +488,8 @@ public static final class CircuitBreakerConfiguration * 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. + * + * @since 5.29.0 */ private float slowCallRateThreshold = DEFAULT_SLOW_CALL_RATE_THRESHOLD;