Spring boot 如何使spring boot RestTemplate客户端度量不为查询参数创建新标记

Spring boot 如何使spring boot RestTemplate客户端度量不为查询参数创建新标记,spring-boot,spring-boot-actuator,Spring Boot,Spring Boot Actuator,我有一个spring引导应用程序,它定义了一个RestTemplatebean,如下所示: @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } @Autowired private RestTemplate restTemplate; private String uriTemplate = "http://my.domain.com/books

我有一个spring引导应用程序,它定义了一个
RestTemplate
bean,如下所示:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.build();
}
@Autowired
private RestTemplate restTemplate;

private String uriTemplate = "http://my.domain.com/bookstore-api/books";

public List<Book> getBooksByAuthor(String author) {
    // create URI for "http://my.domain.com/bookstore-api/books?author={authorId}"
    UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder
            .fromUriString(uriTemplate)
            .queryParam("author", author);

    // make the GET 
    ResponseEntity<Book[]> responseEntity = restTemplate.getForEntity(uriComponentsBuilder.toUriString(),Book[].class);

    // rest ommitted for brevity
}
另外,拉入
弹簧靴启动器执行器
io。千分尺:千分尺注册普罗米修斯

当我使用注入的REST模板时,如下所示:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.build();
}
@Autowired
private RestTemplate restTemplate;

private String uriTemplate = "http://my.domain.com/bookstore-api/books";

public List<Book> getBooksByAuthor(String author) {
    // create URI for "http://my.domain.com/bookstore-api/books?author={authorId}"
    UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder
            .fromUriString(uriTemplate)
            .queryParam("author", author);

    // make the GET 
    ResponseEntity<Book[]> responseEntity = restTemplate.getForEntity(uriComponentsBuilder.toUriString(),Book[].class);

    // rest ommitted for brevity
}
这将是好的,除了有很多作者在那里,最终我会得到“太多标签”例外

我希望有以下内容(类似于路径变量的模板化方式):


这是否可以通过修改我使用
UriComponentsBuilder
的方式来实现?我找到的最接近的方法是定义我自己的
restemplateExchangeTagsProvider
,并覆盖默认值以进行一些疯狂的正则表达式替换。

我也遇到了同样的问题。也许这些信息会对你有所帮助

在我的例子中,restTemplate.setUriTemplateHandler(handler)已经覆盖了annonymous MetricsClientHttpRequestInterceptor#createUriTemplateHandler。 而原始的url模板并没有存储在普罗米修斯的内存中

DefaultUriBuilderFactory builderFactory = new DefaultUriBuilderFactory();
builderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);

customizer.customize(restTemplate);
restTemplate.setUriTemplateHandler(handler);
所以, 我更改了命令的顺序:

restTemplate.setUriTemplateHandler(handler);
customizer.customize(restTemplate);

请检查MetricsClientHttpRequestInterceptor.customize(restTemplate)之后是否没有restTemplate的设置命令。

我也遇到了同样的问题。也许这些信息会对你有所帮助

在我的例子中,restTemplate.setUriTemplateHandler(handler)已经覆盖了annonymous MetricsClientHttpRequestInterceptor#createUriTemplateHandler。 而原始的url模板并没有存储在普罗米修斯的内存中

DefaultUriBuilderFactory builderFactory = new DefaultUriBuilderFactory();
builderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);

customizer.customize(restTemplate);
restTemplate.setUriTemplateHandler(handler);
所以, 我更改了命令的顺序:

restTemplate.setUriTemplateHandler(handler);
customizer.customize(restTemplate);

请检查MetricsClientHttpRequestInterceptor.customize(restTemplate)之后是否没有restTemplate的设置命令。

刚刚修复了SpringBoot 2.4.5中的相同问题,使用:

responseEntity = restTemplate.exchange(
                config.getDataUrl(),
                HttpMethod.GET,
                httpEntity,
                new ParameterizedTypeReference<String>() {},
                rowId);
指标:

http_client_requests_seconds_count{clientName="data-service-dev.apps.cloud.net",method="GET",outcome="SUCCESS",status="200",uri="/api/hbase/getData?rowId={rowId}",} 1.0
...

刚刚修复了SpringBoot 2.4.5中的相同问题,使用:

responseEntity = restTemplate.exchange(
                config.getDataUrl(),
                HttpMethod.GET,
                httpEntity,
                new ParameterizedTypeReference<String>() {},
                rowId);
指标:

http_client_requests_seconds_count{clientName="data-service-dev.apps.cloud.net",method="GET",outcome="SUCCESS",status="200",uri="/api/hbase/getData?rowId={rowId}",} 1.0
...