如何修改Spring默认Micrometer指标的URI标签以匹配实际请求路径
如何修改Micrometer HTTP请求指标的URI标签
结论
完全可以实现,不需要创建自定义指标,通过调整Spring的请求处理配置和Micrometer的URI标签生成逻辑就能达成需求。
具体操作步骤
1. 自定义URI标签生成器
Micrometer默认用DefaultUriTagProvider生成URI标签,我们可以写个自定义的子类,专门处理你的TMS路径规则:
import io.micrometer.core.instrument.Tag; import io.micrometer.spring.web.servlet.DefaultUriTagProvider; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; public class CustomTmsUriTagProvider extends DefaultUriTagProvider { // 匹配实际请求URL的正则,提取{L}对应的实际值 private static final Pattern TMS_REQUEST_PATTERN = Pattern.compile("^/TMS/([^/]+)/\\d+/\\d+/\\d+$"); // 原始的模板URI private static final String ORIGINAL_TEMPLATE = "/TMS/{L}/{Z}/{Y}/{X}"; @Override public List<Tag> httpRequestTags(HttpServletRequest request) { List<Tag> defaultTags = super.httpRequestTags(request); // 遍历标签,找到uri标签就修改 return defaultTags.stream().map(tag -> { if ("uri".equals(tag.getKey()) && ORIGINAL_TEMPLATE.equals(tag.getValue())) { String actualRequestUri = request.getRequestURI(); Matcher matcher = TMS_REQUEST_PATTERN.matcher(actualRequestUri); if (matcher.matches()) { // 提取实际的L值,替换模板里的{L} String actualL = matcher.group(1); String newUriTag = "/TMS/" + actualL + "/{Z}/{Y}/{X}"; return Tag.of("uri", newUriTag); } } return tag; }).collect(Collectors.toList()); } }
2. 替换默认的URI标签生成器
在Spring配置类里注册自定义的生成器,让Spring用它替换默认实现:
import io.micrometer.spring.web.servlet.UriTagProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MicrometerCustomConfig { @Bean public UriTagProvider uriTagProvider() { return new CustomTmsUriTagProvider(); } }
验证结果
当请求/TMS/OSM/3/4/4时,生成的指标会变成你想要的样子:
http_server_requests_seconds_sum{error="none",exception="none",method="GET",outcome="SUCCESS",status="200",uri="/TMS/OSM/{Z}/{Y}/{X}",} 3.5174407
内容的提问来源于stack exchange,提问作者edinehi
相关产品推荐
相关产品推荐

