Есть ли способ получить метрики http.client.requests от AsyncResttemplate? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь отслеживать показатели шаблона отдыха для моего приложения с весенней загрузкой через микрометр и прометей. Когда я использую Resttemplate, созданный с помощью ResttemplateBuilder, и использую его для вызова другого API, он получил ожидаемые метрики http.client.requests. Но для AsyncResttemplate, когда я создаю с AsyncResttemplate и использую его для вызова другого API, он не предоставляет никаких метрик http.client.requests.

Этот код создается при создании bean-компонента AsyncResttemplate

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

Это код, когда я вызываю другой API с async

    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>

Это то, что я ожидаюполучить из метрик микрометра-прометея

# 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?

Обновление: По совету М. Дейна я изменяю 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 от асинхронного вызова

1 Ответ

1 голос
/ 30 октября 2019

Нечто подобное должно сделать.

@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 устарела и, вероятно, будет удалена где-то в ближайшем будущем !.

...