当前位置: 首页 > 知识库问答 >
问题:

Java Spring Webflux,记录出站http调用所用的时间

康烨伟
2023-03-14
 @Override
    public Mono<String> sendOutboundRequest() {
        return webClient.post().retrieve().bodyToMono(String.class);
    }
 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;

共有1个答案

赫连正初
2023-03-14

如果您希望以一种可重用的方式完成此操作,可以使用ExchangeFilterFunction。您可以在spring参考文档中找到ExchangeFilterFunction的更多示例

下面是ExchangeFilterFunction的示例实现,它将对WebClient进行的每个外部api调用计时并记录结果。这从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.builderIE将其添加到任何WebClient实例中,以便记录持续时间。

WebClient.builder().filter(metricsLoggingExchangeFilterFunction).build()
 类似资料:
  • 我有istio v1。1.6安装在Kubernetes v1上。11.使用istio存储库中提供的舵图和一系列覆盖,包括: 问题是,我不能向运行在端口80(内部)上的服务发出任何简单的出站HTTP请求 来自特使的istio代理日志中的响应标志表示无法找到正确的路由: NR:除了404响应代码之外,没有为给定请求配置路由。 也许值得补充的是: > 其他出站呼叫任何端口以外的80工作完全正常。 检查代

  • 类似于Servlet.Filter)在Web中添加时.xml可以拦截任何独立于框架(Spring / CXF / Jersy等)的传入JVM /传出(作为响应),我正在尝试找到一个API,它可以拦截来自JVM的任何传出HTTP调用,以添加/修改独立于框架的标头。此外,通过代理路由请求听起来令人不知所措。 论坛上经常会误解“呼出HTTP呼叫”这个词,所以让我用例子来解释一下。 让我们假设有两个JVM

  • 我有一个要求,在我必须使用不同的有效负载值对Httpendpoint进行Http出站调用的循环中,调用函数不必等待从出站调用收到的响应,因此基本上出站调用将在循环中异步发生。 有没有办法用Http.outbound网关

  • 获取错误: 混合内容:“HTTPS:xxx”处的页面是通过HTTPS加载的,但请求的XMLHttpRequestendpoint“http://127.0.0.1/xxx”不安全。此请求已被阻止;必须通过HTTPS提供内容。 而且 未捕获得NetworkError:无法对“XMLHttpRequest”执行“Send”:无法加载“http://127.0.0.1/xxx”. 两周前,我可以成功运行

  • 我有一个使用微服务架构的应用程序,服务受Spring OAuth2客户端凭据授予类型的保护。我们使用spring WebClient和spring OAuth客户端库从一个服务调用另一个服务,因为它透明地处理OAuth凭据的获取。 正如我们所知,Spring(OAuth客户端)会调用授权服务器,在Auth服务器没有令牌或当前令牌过期时,从Auth服务器请求一个新令牌。每当Spring(OAuth客

  • 我试图从DynamoDB表中设置ElasticSearch导入过程。我已经创建了AWS Lambda并启用了带有触发器的DynamoDB流,该触发器为每个添加/更新的记录调用我的Lambda。现在我想执行初始种子操作(将DynamoDB表中当前的所有记录导入ElasticSearch)。我该怎么做?有没有办法让表中的所有记录都“重新处理”并添加到流中(这样我的lambda就可以处理它们)?还是最好