Skip to content

Commit ce95df7

Browse files
committed
Add config key in circuit breaker config to fetch config level thresholds
1 parent db91474 commit ce95df7

File tree

4 files changed

+17
-4
lines changed

4 files changed

+17
-4
lines changed

grpc-circuitbreaker-utils/src/main/java/org/hypertrace/circuitbreaker/grpcutils/CircuitBreakerConfiguration.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,7 @@ public class CircuitBreakerConfiguration<T> {
2424
@Builder.Default
2525
Function<String, StatusRuntimeException> exceptionBuilder =
2626
reason -> Status.RESOURCE_EXHAUSTED.withDescription(reason).asRuntimeException();
27+
28+
// config key to access non default circuit breaker thresholds
29+
String configKey;
2730
}

grpc-circuitbreaker-utils/src/main/java/org/hypertrace/circuitbreaker/grpcutils/resilience/ResilienceCircuitBreakerConfigConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static Map<String, CircuitBreakerConfig> getCircuitBreakerConfigs(
1818
public static List<String> getDisabledKeys(
1919
Map<String, CircuitBreakerThresholds> configurationMap) {
2020
return configurationMap.entrySet().stream()
21-
.filter(entry -> entry.getValue().isEnabled())
21+
.filter(entry -> !entry.getValue().isEnabled())
2222
.map(Map.Entry::getKey)
2323
.collect(Collectors.toList());
2424
}

grpc-circuitbreaker-utils/src/main/java/org/hypertrace/circuitbreaker/grpcutils/resilience/ResilienceCircuitBreakerFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ public static ResilienceCircuitBreakerInterceptor getResilienceCircuitBreakerInt
2222
resilienceCircuitBreakerConfigMap,
2323
ResilienceCircuitBreakerConfigConverter.getDisabledKeys(
2424
circuitBreakerConfiguration.getCircuitBreakerThresholdsMap()),
25-
circuitBreakerConfiguration.getDefaultThresholds().isEnabled());
25+
circuitBreakerConfiguration.getDefaultThresholds().isEnabled(),
26+
circuitBreakerConfiguration.getConfigKey());
2627
return new ResilienceCircuitBreakerInterceptor(
2728
circuitBreakerConfiguration, clock, resilienceCircuitBreakerProvider);
2829
}

grpc-circuitbreaker-utils/src/main/java/org/hypertrace/circuitbreaker/grpcutils/resilience/ResilienceCircuitBreakerProvider.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
99
import java.util.List;
1010
import java.util.Map;
11+
import java.util.Objects;
1112
import java.util.Optional;
1213
import java.util.concurrent.TimeUnit;
1314
import lombok.extern.slf4j.Slf4j;
@@ -21,6 +22,7 @@ class ResilienceCircuitBreakerProvider {
2122
private final Map<String, CircuitBreakerConfig> circuitBreakerConfigMap;
2223
private final List<String> disabledKeys;
2324
private final boolean defaultEnabled;
25+
private final String configKey;
2426

2527
// LoadingCache to manage CircuitBreaker instances with automatic loading and eviction
2628
private final LoadingCache<String, Optional<CircuitBreaker>> circuitBreakerCache =
@@ -33,17 +35,23 @@ public ResilienceCircuitBreakerProvider(
3335
CircuitBreakerRegistry circuitBreakerRegistry,
3436
Map<String, CircuitBreakerConfig> circuitBreakerConfigMap,
3537
List<String> disabledKeys,
36-
boolean defaultEnabled) {
38+
boolean defaultEnabled,
39+
String configKey) {
3740
this.circuitBreakerRegistry = circuitBreakerRegistry;
3841
this.circuitBreakerConfigMap = circuitBreakerConfigMap;
3942
this.disabledKeys = disabledKeys;
4043
this.defaultEnabled = defaultEnabled;
44+
this.configKey = configKey;
4145
}
4246

4347
public Optional<CircuitBreaker> getCircuitBreaker(String circuitBreakerKey) {
44-
if (disabledKeys.contains(circuitBreakerKey)) {
48+
if (disabledKeys.contains(circuitBreakerKey)
49+
|| (Objects.nonNull(configKey)
50+
&& !circuitBreakerConfigMap.containsKey(circuitBreakerKey)
51+
&& disabledKeys.contains(configKey))) {
4552
return Optional.empty();
4653
}
54+
4755
return circuitBreakerCache.getUnchecked(circuitBreakerKey);
4856
}
4957

@@ -75,6 +83,7 @@ private static void attachListeners(CircuitBreaker circuitBreaker) {
7583

7684
private Optional<CircuitBreaker> buildNewCircuitBreaker(String circuitBreakerKey) {
7785
return Optional.ofNullable(circuitBreakerConfigMap.get(circuitBreakerKey))
86+
.or(() -> Optional.ofNullable(configKey).map(circuitBreakerConfigMap::get))
7887
.map(config -> circuitBreakerRegistry.circuitBreaker(circuitBreakerKey, config))
7988
.or(
8089
() ->

0 commit comments

Comments
 (0)