Java/Spring : How to find what error opened the Resilence4J circuit breaker?

标签 java spring exception logging circuit-breaker

我正在使用带有 Spring Boot 的 Resilence4j 断路器,如下所示:

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;

@Component
@CircuitBreaker(name = "ExternalService")
public class ExternalServiceClient implements APIClient {
     //....
}

我没有在 application.yml 中指定任何其他配置,因此断路器使用默认值运行。每当断路器打开时,我都会看到如下错误:

Failure to call external service  for entity id 12343
   stack_trace: io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'ExternalService' is OPEN and does not permit further calls
    at io.github.resilience4j.circuitbreaker.CallNotPermittedException.createCallNotPermittedException(CallNotPermittedException.java:37) ~[resilience4j-circuitbreaker-1.1.0.jar!/:1.1.0]
    at io.github.resilience4j.circuitbreaker.internal.CircuitBreakerStateMachine$HalfOpenState.acquirePermission(CircuitBreakerStateMachine.java:685)
    at io.github.resilience4j.circuitbreaker.internal.CircuitBreakerStateMachine.acquirePermission(CircuitBreakerStateMachine.java:146)
    at io.github.resilience4j.circuitbreaker.CircuitBreaker.lambda$decorateCheckedSupplier$82a9021a$1(CircuitBreaker.java:599)
    at io.github.resilience4j.circuitbreaker.CircuitBreaker.executeCheckedSupplier(CircuitBreaker.java:340)
    at io.github.resilience4j.circuitbreaker.configure.CircuitBreakerAspect.defaultHandling(CircuitBreakerAspect.java:155) ~[resilience4j-spring-0.16.0.jar!/:0.16.0]
    at io.github.resilience4j.circuitbreaker.configure.CircuitBreakerAspect.proceed(CircuitBreakerAspect.java:115)
    at io.github.resilience4j.circuitbreaker.configure.CircuitBreakerAspect.circuitBreakerAroundAdvice(CircuitBreakerAspect.java:98)
    at jdk.internal.reflect.GeneratedMethodAccessor238.invoke(Unknown Source) ~[na:na]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) ~[spring-aop-5.2.5.RELEASE.jar!/:5.2.5.RELEASE]
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)

这告诉我断路器由于某些错误条件而打开(因此不允许再进行调用),但没有指定原始错误是什么。有没有办法找出原来的错误?是否有我应该在日志中查找的特定文本,或者是否需要打开某些设置,以便此错误也告诉我断路器打开的原始原因?

最佳答案

CallNotPermissedException 和底层堆栈跟踪在断路器打开后发生在状态机逻辑内,这不是查看的正确位置。

通过执行器端点暴露的事件消费者缓冲区/actuator/Circuitbreakerevents将列出断路器内的所有事件、错误以及相应的消息。

https://resilience4j.readme.io/docs/getting-started-3#events-endpoint

关于Java/Spring : How to find what error opened the Resilence4J circuit breaker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66120143/

相关文章:

.net - 这是什么错误? Net.HttpWebRequest.SetAndOrProcessResponse 中的 System.Net.InternalException

exception - 使用 Lucene : Why do I get a Too Many Clauses error if I do a prefix search?

java - JOOQ用于SQL查询写入: Stack overflow exception in tests

java - 创建在 Spring、JPA 和 LOG4J xml 中使用的自定义属性

java - 监听组件何时首次显示

Spring Feign 客户端调用在应该停留在 try block 时进入异常 block

spring - java 9模块从A和B读取包X

java - eclipse中读取maven项目失败: For Input String "US"

java - 什么时候使用枚举?

java - Spring Eureka 服务器中的 datacenter 属性是什么意思?