Mono 调用中经过的时间,同时映射成功和错误情况

Time elapsed time in Mono calls, mapping both success and error cases

我正在使用 WebClient 调用下游服务,我想记录调用经过的时间,无论是成功还是错误。

elapsedtimed 运算符在成功案例中工作正常,但是当您遇到错误时,例如从下游服务返回 500 或超时,订阅者只会收到可抛出的,而不是可抛出的 + 经过时间。

有办法解决这个问题吗?

回答我自己的问题:metrics 运算符满足我的需要;我需要用数字来填充指标,最好让 Reactor 来处理。

[但是,不求助于在 Reactor 外部创建的对象而获取错误信号经过时间的通用方法似乎仍然有用。]

在反应流中的错误的一般情况下,我不知道有什么“简单”的方法可以做到这一点。一旦发生错误,就是这样 - 你打破了正常的反应流程,包括时间,所以信息丢失了。

但是,在 webclient 的情况下,另一种方法是确保您根本不会抛出错误,使用 exchange() 而不是 retrieve() 语义,类似于:

client.get()
        .uri("https://httpstat.us/500")
        .exchangeToMono(cr -> cr.bodyToMono(String.class))
        .timed()
        .doOnNext(s -> {
            System.out.println("ELAPSED: " + s.elapsedSinceSubscription().toMillis());
        });