Resilience4j - 记录断路器状态变化

问题描述

有关 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