如何使用 Spring-Boot 的 RestTemplate 在 uri 标签中获取 http-client-requests 指标的模板化值?

Dav*_*d D 4 spring resttemplate spring-boot spring-boot-actuator spring-micrometer

我们正在使用 Spring Boot 2.1.4 和micrometer-registry-prometheus依赖项来捕获指标。

我们有一个 Spring Boot 服务使用 RestTemplate 调用另一个服务的情况。此调用生成的指标包含 URI 中的实际值,而不是模板化值。

例如,在/actuator/prometheus端点中,我看到如下条目:

http_client_requests_seconds_count{clientName="someClient",method="GET",status="200",uri="/person/lookup?firstName=Tony&lastName=Soprano",} 1.0

根据文档,我希望看到变量名称而不是值,如下所示:

http_client_requests_seconds_count{clientName="someClient",method="GET",status="200",uri="/person/lookup?firstName={firstName}&lastName={lastName}",} 1.0

有没有办法获取默认http.client.requests指标值以使用 URI 标记的模板化值?

https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics-http-clients 上的 Spring 文档说明了关于 uri 标签的内容:

如果可能,在变量替换之前请求的 URI 模板(例如,/api/person/{id})

我们如何使变量替换成为可能?

mwe*_*uch 8

我假设您正在使用RestTemplateBuilder来构建您的RestTemplate,否则您将无法注册指标。

您实际上是否将模板化的 url 传递到RestTemplates 交换方法并传递参数以进行替换?在2.1.4.RELEASE和上为我工作2.2.1.RELEASE

    template.getForObject("http://localhost:" + this.serverPort + "/hello/{id}",
            String.class, Collections.singletonMap("id", "loop"));
Run Code Online (Sandbox Code Playgroud)

结果是:

http_client_requests_seconds_count{application="micrometered2",clientName="localhost",method="GET",outcome="SUCCESS",status="200",uri="/hello/{id}",} 23.0
Run Code Online (Sandbox Code Playgroud)