in safeguard-impl/src/main/java/org/apache/safeguard/impl/circuitbreaker/CircuitBreakerInterceptor.java [196:233]
public CircuitBreakerImpl create(final InvocationContext context) {
final CircuitBreaker definition = mapper.map(
finder.findAnnotation(CircuitBreaker.class, context), context.getMethod(), CircuitBreaker.class);
final long delay = definition.delayUnit().getDuration().toNanos() * definition.delay();
if (delay < 0) {
throw new FaultToleranceDefinitionException("CircuitBreaker delay can't be < 0");
}
final Class<? extends Throwable>[] failOn = definition.failOn();
final double failureRatio = definition.failureRatio();
if (failureRatio < 0 || failureRatio > 1) {
throw new FaultToleranceDefinitionException("CircuitBreaker failure ratio can't be < 0 and > 1");
}
final int volumeThreshold = definition.requestVolumeThreshold();
if (volumeThreshold < 1) {
throw new FaultToleranceDefinitionException("CircuitBreaker volume threshold can't be < 0");
}
final int successThreshold = definition.successThreshold();
if (successThreshold <= 0) {
throw new FaultToleranceDefinitionException("CircuitBreaker success threshold can't be <= 0");
}
final String metricsNameBase = getBaseMetricsName(context);
return new CircuitBreakerImpl(
!mapper.isEnabled(context.getMethod(), CircuitBreaker.class),
volumeThreshold, delay, successThreshold,
failOn, failureRatio, metrics.counter(metricsNameBase + "callsSucceeded.total",
"Number of calls allowed to run by the circuit breaker that returned successfully"),
metrics.counter(metricsNameBase + "callsFailed.total",
"Number of calls allowed to run by the circuit breaker that then failed"),
metrics.counter(metricsNameBase + "callsPrevented.total",
"Number of calls prevented from running by an open circuit breaker"),
metrics.counter(metricsNameBase + "opened.total",
"Number of times the circuit breaker has moved from closed state to open state"));
}