问题描述
有关 Resilience4J 和断路器状态更改日志的问题。
目前,Resilience4j 运行良好。能够在下游系统出现故障时调用回退,让他们有时间喘口气等等......
不幸的是,我的 Spring Webflux 2.4.4+ 应用程序遇到了问题
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-reactor</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
</dependency>
假设我们的断路器在时间 T
处于闭合模式,例如由于下游系统不可用。
在随后的调用中,由于电路打开,进入回退,并且当回退方法被调用时我有一个日志。
因此,我只在 T+1
知道断路器何时打开。但不是断路器改变状态的确切时刻。
我想知道如何记录断路器改变状态的事件,目前它真的在 info
级别改变状态,好吗?
解决方法
您可以使用以下内容记录转换
circuitBreaker.getEventPublisher().onEvent(event -> {
LOG.info("State change {}",event);
});
,
您可以使用发出的事件。这可以在 CircuitBreaker 模块文档的 Consume emitted CircuitBreakerEvents 部分中找到。
CircuitBreakerEvent 可以是状态转换、断路器重置、成功调用、记录的错误或忽略的错误。所有事件都包含附加信息,例如事件创建时间和调用的处理持续时间。如果你想消费事件,你必须注册一个事件消费者。
您对 onStateTransition
方法感兴趣(事件使用者的完整列表为 here):
circuitBreaker.getEventPublisher()
.onStateTransition(e -> logger.info(e));
您可以直接记录整个事件,因为它正确地覆盖了 toString
方法,并且示例日志记录如下所示:
2021-06-01T01:23:45.678901+00:00: CircuitBreaker 'myService' changed state from CLOSED to OPEN