从 AsyncResttemplate 中获取 http.client.requests 指标的方法有哪些?

6

我正在尝试通过Micrometer和Prometheus监控Spring Boot应用程序的RestTemplate指标。 当我使用使用ResttemplateBuilder构建的Resttemplate并用于调用另一个api时,它确实获得了预期的http.client.requests指标。 但是,对于使用AsyncResttemplate创建并用于调用另一个api的情况下,它没有提供任何http.client.requests指标。

这是我创建AsyncResttemplate bean的代码

    @Bean
    public AsyncRestTemplate asyncRestTemplate(){
        return new AsyncRestTemplate();
    }

当我使用异步调用另一个API时,以下是代码:

    public ListenableFuture async() {
        ListenableFuture<ResponseEntity<AccountResponse>> accountResponseList = asyncRestTemplate.exchange(accountUrl, HttpMethod.GET, new HttpEntity<>(new HttpHeaders()), AccountResponse.class);
        accountResponseList.addCallback(new ListenableFutureCallback<ResponseEntity<AccountResponse>>() {
            @Override
            public void onSuccess(ResponseEntity<AccountResponse> accountResponseResponseEntity) {
                System.out.println("Success");
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.println("Failure");
            }
        });
        return accountResponseList;
    }

这些是在pom.xml中导入的相关依赖项:

<dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

这是我希望从micrometer-prometheus指标获取的内容。

# HELP http_client_requests_seconds Timer of RestTemplate operation
# TYPE http_client_requests_seconds summary
http_client_requests_seconds_count{application="${spring.application.name}",clientName="localhost",method="GET",status="200",uri="/getAllAccount",} 1.0
http_client_requests_seconds_sum{application="${spring.application.name}",clientName="localhost",method="GET",status="200",uri="/getAllAccount",} 0.0242929
# HELP http_client_requests_seconds_max Timer of RestTemplate operation
# TYPE http_client_requests_seconds_max gauge
http_client_requests_seconds_max{application="${spring.application.name}",clientName="localhost",method="GET",status="200",uri="/getAllAccount",} 0.0242929

上述指标是从ResttemplateBuilder获得的,是否有一种方式可以获取AsyncRestTemplate的指标呢?
更新:根据M. Deinum的建议,我将bean更改为...
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.setConnectTimeout(Duration.ofSeconds(500)).build();
    }

    @Bean
    public AsyncRestTemplate asyncRestTemplate(RestTemplate restTemplate){
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        SimpleAsyncTaskExecutor asyncTaskExecutor = new SimpleAsyncTaskExecutor();
        asyncTaskExecutor.setConcurrencyLimit(10);
        requestFactory.setTaskExecutor(asyncTaskExecutor);
        return new AsyncRestTemplate(requestFactory, restTemplate);
    }

但仍未从异步调用中获得任何http.client.requests。


使用 RestTemplateBuilder 创建一个 RestTemplate,并使用它来构建一个 AsyncRestTemplateAsyncRestTemplate 只是 RestTemplate 的包装器)。 - M. Deinum
1个回答

3

应该做一些类似这样的事情。

@Bean
public AsyncRestTemplate asyncRestTemplate(RestTemplateBuilder builder){
  RestTemplate rest = builder.build();
  AsyncClientHttpRequestFactory requestFactory = (AsyncClientHttpRequestFactory) rest.getRequestFactory();
  return new AsyncRestTemplate(requestFactory, rest);
}

这将重用现有的配置。 AsyncRestTemplate 只是一个包装器,它将 RestTemplate 与 `TaskExecutor` 结合在一起。
注意:请注意,AsyncRestTemplate 自 Spring 5 起已被弃用,并且可能在不久的将来被删除!

我尝试了一下,出现了以下异常: Caused by: java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.AsyncClientHttpRequestFactory - PD1743
糟糕,没有考虑到包装。使用new SimpleClientHttpRequestFactory()代替从RestTemplate获取它。除非您已经自己配置了另一个ClientHttpRequestFactory,否则请重用并注入该工厂。 - M. Deinum
尝试了这个配置并成功进行了调用,但我仍然无法获取http.client.requests指标。 - PD1743
那么你是真的使用了构建器来处理RestTemplate,还是进行了一些额外的配置?像定义一个bean一样? - M. Deinum
我已经发布了更改的事情,但仍未从http.client.requests获得任何指标。 - PD1743

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接