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;