包括Spring Boot端点路径变量作为度量维度

Roh*_*tty 1 java spring-boot micrometer spring-micrometer

我有api端点:/ user / {tenant} / create

我正在使用带有测微计的Spring Boot 2进行度量。

默认情况下,Spring Boot 2端点的@Timer注释包含以下标记:exception,method,uri,status

我想将api参数“ tenant”的传递值添加为端点的额外标记

如何使用弹簧靴2和千分尺进行操作

Roh*_*tty 9

@Bean
public WebMvcTagsProvider webMvcTagsProvider() {
    return new CustomWebMvcTagsProvider();
}
Run Code Online (Sandbox Code Playgroud)

    public class CustomWebMvcTagsProvider extends DefaultWebMvcTagsProvider {
      public Iterable<Tag> getTags(HttpServletRequest request, HttpServletResponse response, Object handler, Throwable exception) {
        return Tags.of(super.getTags(request, response, handler, exception)).and(getTenantTag(request));
      }

      private Tag getTenantTag(HttpServletRequest request) {
        String tenant = ((Map<String, String>)request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE)).get("tenant");
        if(tenant == null){
            tenant = "na";
        }
        return Tag.of("tenant", tenant);
      }
    }

Run Code Online (Sandbox Code Playgroud)


小智 7

从 Spring Boot 2.3.0 开始,如果您想在某些请求的默认标签上添加额外的标签,更好的方法是添加 WebMvcTagsContributor 类的 @Bean。这样您的代码就不必担心放入默认标签。

在https://github.com/spring-projects/spring-boot/issues/20175中实现

代码如下所示:

@Bean
public WebMvcTagsContributor webMvcTagsContributor() {
    return new WebMvcTagsContributor() {
        @Override
        public Iterable<Tag> getTags(HttpServletRequest request, HttpServletResponse response, Object handler, Throwable exception) {
            Tags tags = Tags.empty();
            tags = tags.and(Tag.of("my_tag", "somevalue"));
            return tags;
        }

        @Override
        public Iterable<Tag> getLongRequestTags(HttpServletRequest request, Object handler) {
            return null;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)


Fra*_*man 5

使用custom WebMvcTagsProvider,例如:

@Bean
public WebMvcTagsProvider webMvcTagsProvider() {
    return new WebMvcTagsProvider() {
        @Override
        public Iterable<Tag> getTags(HttpServletRequest request, HttpServletResponse response, Object handler, Throwable exception) {
            return ((Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE))
                    .entrySet()
                    .stream()
                    .map(entry -> new ImmutableTag(entry.getKey(), entry.getValue()))
                    .collect(Collectors.toList());
        }

        @Override
        public Iterable<Tag> getLongRequestTags(HttpServletRequest request, Object handler) {
            return new ArrayList<>();
        }
    };
}
Run Code Online (Sandbox Code Playgroud)