Включение переменной пути конечной точки пружинной загрузки в качестве метрического измерения
У меня есть конечная точка API: /user/{tenant}/create
Я использую пружинный ботинок 2 с микрометром для метрики.
По умолчанию аннотация @Timer для конечной точки весенней загрузки 2 включает следующие теги: исключение, метод, uri, состояние
Я хочу добавить переданное значение для параметра API "tenant" в качестве дополнительного тега для конечной точки
Как мне это сделать с пружинным чехлом 2 и микрометром
2 ответа
Использовать пользовательские 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<>();
}
};
}
@Bean
public WebMvcTagsProvider webMvcTagsProvider() {
return new CustomWebMvcTagsProvider();
}
`
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);
}
}
Начиная с Spring Boot 2.3.0, если вы хотите добавить дополнительные теги к тегам по умолчанию для некоторых запросов, лучшим подходом является добавление @Bean класса WebMvcTagsContributor. Таким образом, вашему коду не нужно беспокоиться о добавлении тегов по умолчанию.
Реализовано в 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;
}
};
}
Подход для добавления переменных пути к тегам по умолчанию:
import io.micrometer.core.instrument.Tag;
import org.springframework.boot.actuate.metrics.web.servlet.WebMvcTagsContributor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.stream.Collectors;
@Configuration
public class WebMvcTagsProviderConfig {
@Bean
public WebMvcTagsContributor webMvcTagsContributor() {
return new WebMvcTagsContributor() {
@Override
public Iterable<Tag> getTags(
HttpServletRequest request, HttpServletResponse response, Object handler, Throwable exception
) {
Map<String, String> pathVariables = ((Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE));
return pathVariables == null
? null
: pathVariables
.entrySet()
.stream()
.map(entry -> Tag.of(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
}
@Override
public Iterable<Tag> getLongRequestTags(HttpServletRequest request, Object handler) {
return null;
}
};
}
}