java - 是否有办法从 AsyncResttemplate 获取 http.client.requests 指标?

标签 java spring-boot spring-boot-actuator spring-micrometer

我正在尝试通过千分尺和普罗米修斯监控我的 Spring Boot 应用程序的其余模板指标。 当我使用 ResttemplateBuilder 构建的 Resttemplate 并用于调用另一个 api 时,它确实获得了预期的 http.client.requests 指标。 但是对于 AsyncResttemplate,当我使用 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

最佳答案

类似这样的事情应该做。

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

这将重用现有的配置。 AsyncRestTemplate 只是 RestTemplate 的包装器,将其与“TaskExecutor”相结合。

注意:请注意,从 Spring 5 开始,AsyncRestTemplate 已被弃用,并且可能会在不久的将来被删除!

关于java - 是否有办法从 AsyncResttemplate 获取 http.client.requests 指标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58621180/

相关文章:

java - 如何在Java中按行号搜索文本文件?

java - 如何在maven java springboot中使用Starter Data Elasticsearch 3.0.1配置elasticsearch 8.5.3中的安全性

java - Spring 致动器 '/auditevents'端点返回404

java - Java 程序将 EBCDIC 转换为 ASCII 的示例 EBCDIC 文件

java - 如何用 Java 下载并解压 ZIP 文件

java - 通过java在MySql中存储字符串数组?

java - 确保特定用户只能看到自己的用户详细信息 - 使用 Spring

java - 如果抛出异常,@Transactional 不起作用

java - 为执行器端点定义不同上下文的正确/最干净的方法是什么?

java - Controller 测试中没有类型 'org.springframework.boot.actuate.health.HealthEndpoint' 的合格 bean