Pat*_*Pat 4 java spring-webflux
关于如何记录 http 请求所花费的时间的小问题。
为了避免混淆,这个问题是关于日志(而不是指标),这个问题是关于Webflux,这个问题是关于出站呼叫,我是客户端,试图向服务器发出呼叫,我需要计时此操作,但是从日志的角度来看。
基于我正在使用的这个片段:
@Override
public Mono<String> sendOutboundRequest() {
return webClient.post().retrieve().bodyToMono(String.class);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试过,.log()但这并不是直接写出所花费的时间,该解决方案需要对 log4j 的订阅时和完成时的时间戳进行另一层解析。
我也尝试过.metrics(),这获取了时间,但这仅生成指标,而不生成日志。
我还尝试了一些方法执行环绕
long start = System.nanoTime();
Mono<String> result = webClientIdms.post().retrieve().bodyToMono(String.class);
long end = System.nanoTime() - start;
LOGGER.info("this will not print the actual http request time " + end);
return result;
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为在反应式堆栈中,这不会在执行反应式管道时对请求的执行进行计时。
请问记录所用时间的正确方法是什么?
谢谢
如果您希望以可重用的方式执行此操作,您可以使用ExchangeFilterFunction. ExchangeFilterFunction您可以在spring 参考文档上找到更多示例
下面是 a 的示例实现,ExchangeFilterFunction它将对 a 进行的每个外部 api 调用进行计时WebClient并记录结果。这受到MetricsWebClientFilterFunction的启发
@Component
public class MetricsLoggingExchangeFilterFunction implements ExchangeFilterFunction {
private static final Logger LOGGER = LoggerFactory.getLogger(MetricsLoggingExchangeFilterFunction.class);
private static final String METRICS_WEBCLIENT_START_TIME = MetricsLoggingExchangeFilterFunction.class.getName() + ".START_TIME";
@Override
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
return next.exchange(request).doOnEach((signal) -> {
if (!signal.isOnComplete()) {
Long startTime = signal.getContextView().get(METRICS_WEBCLIENT_START_TIME);
long duration = System.currentTimeMillis() - startTime;
LOGGER.info("Downstream called taken {}ms", duration);
}
}).contextWrite(ctx -> ctx.put(METRICS_WEBCLIENT_START_TIME, System.currentTimeMillis()));
}
}
Run Code Online (Sandbox Code Playgroud)
WebClient然后,您可以将其添加到您想要使用提供的 ie 记录持续时间的任何实例WebClient.Builder。
WebClient.builder().filter(metricsLoggingExchangeFilterFunction).build()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5506 次 |
| 最近记录: |