本文介紹了Java Spring Webflow,記錄出站http調(diào)用所用的時(shí)間的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
請(qǐng)回答有關(guān)如何記錄http請(qǐng)求所用時(shí)間的小問(wèn)題。
為了避免混淆,這個(gè)問(wèn)題是關(guān)于日志(不是指標(biāo))的,這個(gè)問(wèn)題是關(guān)于Webflow的,這個(gè)問(wèn)題是關(guān)于出站呼叫的,我是客戶端,正在嘗試呼叫服務(wù)器,我需要對(duì)此操作計(jì)時(shí),但從日志的角度來(lái)看。
基于我正在使用的這段代碼:
@Override
public Mono<String> sendOutboundRequest() {
return webClient.post().retrieve().bodyToMono(String.class);
}
到目前為止,我嘗試了.log()
,但這并不是直接寫入花費(fèi)的時(shí)間,此解決方案需要從On SUBSCRIBE和ON COMPLETE OF log4j時(shí)間再解析一層時(shí)間戳。
我也嘗試了.metrics()
,這獲得了時(shí)間,但這只生成指標(biāo),而不是日志。
我還嘗試了一些環(huán)繞方法的執(zhí)行
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;
但這不起作用,因?yàn)樵诜磻?yīng)式堆棧中,當(dāng)執(zhí)行反應(yīng)式管道時(shí),這不會(huì)對(duì)請(qǐng)求的執(zhí)行計(jì)時(shí)。
請(qǐng)問(wèn)記錄所用時(shí)間的正確方式是什么?
謝謝
推薦答案
如果您希望以可重用的方式完成此操作,則可以使用ExchangeFilterFunction
。您可以在spring reference docs
上找到ExchangeFilterFunction
的更多示例
下面是ExchangeFilterFunction
的一個(gè)示例實(shí)現(xiàn),它將對(duì)WebClient
進(jìn)行的每個(gè)外部API調(diào)用進(jìn)行計(jì)時(shí)并記錄結(jié)果。靈感來(lái)自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()));
}
}
然后可以使用提供的WebClient.Builder
ie將其添加到要記錄持續(xù)時(shí)間的任何WebClient
實(shí)例中。
WebClient.builder().filter(metricsLoggingExchangeFilterFunction).build()
這篇關(guān)于Java Spring Webflow,記錄出站http調(diào)用所用的時(shí)間的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,