【问题标题】:Resilience4j - Log circuit breaker state changeResilience4j - 记录断路器状态更改
【发布时间】:2021-06-02 02:32:42
【问题描述】:

关于 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 级别更改状态?

【问题讨论】:

    标签: java spring-boot event-handling circuit-breaker resilience4j


    【解决方案1】:

    您可以使用以下方式记录转换

    circuitBreaker.getEventPublisher().onEvent(event -> {
       LOG.info("State change {}", event);
    });
    

    【讨论】:

    【解决方案2】:

    您可以使用发出的事件。这可以在 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
    

    【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2020-07-06
    • 2022-01-06
    • 2020-11-02
    • 2020-08-31
    • 1970-01-01
    • 2021-01-19
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多