Prometheus中相同URL高基数问题:如何聚合动态路径指标?
解决Micrometer动态路径导致的Prometheus高基数问题
完全可以通过自定义Micrometer的请求标签生成逻辑,将带动态code参数的路径统一聚合为同一维度,具体实现分两种场景:
Spring MVC 场景
- 自定义
WebMvcTagsProvider,重写路径解析逻辑
创建继承自DefaultWebMvcTagsProvider的自定义类,用正则替换动态code部分:
import io.micrometer.core.instrument.Tags; import io.micrometer.spring.web.servlet.DefaultWebMvcTagsProvider; import jakarta.servlet.http.HttpServletRequest; import java.util.regex.Pattern; public class CustomWebMvcTagsProvider extends DefaultWebMvcTagsProvider { private static final Pattern DYNAMIC_CODE_PATTERN = Pattern.compile("/api/\\d+/authvalue"); @Override protected String resolveUri(HttpServletRequest request, Object handler) { String originalUri = super.resolveUri(request, handler); // 将/api/数字/authvalue替换为统一占位符路径 return DYNAMIC_CODE_PATTERN.matcher(originalUri).replaceAll("/api/xxxx/authvalue"); } }
- 注册自定义Bean
在配置类中将自定义WebMvcTagsProvider注册为Spring Bean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import io.micrometer.spring.web.servlet.WebMvcTagsProvider; @Configuration public class MicrometerMetricConfig { @Bean public WebMvcTagsProvider webMvcTagsProvider() { return new CustomWebMvcTagsProvider(); } }
WebFlux 场景
如果是响应式WebFlux环境,逻辑类似,自定义WebFluxTagsProvider即可:
import io.micrometer.spring.web.reactive.DefaultWebFluxTagsProvider; import org.springframework.web.server.ServerWebExchange; import java.util.regex.Pattern; public class CustomWebFluxTagsProvider extends DefaultWebFluxTagsProvider { private static final Pattern DYNAMIC_CODE_PATTERN = Pattern.compile("/api/\\d+/authvalue"); @Override protected String resolveUri(ServerWebExchange exchange) { String originalUri = super.resolveUri(exchange); return DYNAMIC_CODE_PATTERN.matcher(originalUri).replaceAll("/api/xxxx/authvalue"); } }
注册Bean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import io.micrometer.spring.web.reactive.WebFluxTagsProvider; @Configuration public class MicrometerMetricConfig { @Bean public WebFluxTagsProvider webFluxTagsProvider() { return new CustomWebFluxTagsProvider(); } }
扩展说明
- 如果有多个需要聚合的动态路径,可扩展正则表达式,比如
Pattern.compile("/api/\\d+/authvalue|/user/\\d+/info") - 这种方式会统一修改Micrometer生成的
uri标签值,Prometheus接收到的指标会将所有匹配的请求聚合到同一维度,彻底解决高基数问题
内容的提问来源于stack exchange,提问作者dead programmer
相关产品推荐
相关产品推荐

