Spring 6中如何自定义配置AutoTimer(WebMvcMetricsFilter迁移场景)
Spring Boot 3.1.x + Micrometer 1.11 自定义请求延迟桶配置方案
Spring Boot 3.x 移除了WebMvcMetricsFilter,改用Observation API处理请求指标。要实现原AutoTimer的自定义延迟桶配置,可按以下步骤操作:
1. 自定义ObservationAutoTimer Bean
原AutoTimer的延迟桶配置,对应到Observation API中通过ObservationAutoTimer.Builder定义。直接创建自定义Bean覆盖默认配置:
import io.micrometer.core.instrument.Timer; import io.micrometer.observation.Observation; import io.micrometer.observation.annotation.ObservationAutoTimer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CustomMetricConfig { @Bean public ObservationAutoTimer customRequestAutoTimer() { // 替换为你原来使用的延迟桶数值 double[] customDelayBuckets = {0.05, 0.1, 0.25, 0.5, 1.0, 2.0, 5.0, 10.0}; return ObservationAutoTimer.builder() // 启用百分位数直方图 .timerConfig(timerConfig -> timerConfig .publishPercentileHistogram(true) .percentilesHistogramBuckets(customDelayBuckets)) // 可选:指定该配置仅对Web请求观测生效 .matchers(matchers -> matchers.add(Observation.Matcher.forName("web.request"))) .build(); } }
2. 确保Web MVC Observation拦截器生效
Spring Boot 3.x 默认通过ObservationWebMvcAutoConfiguration自动配置请求观测拦截器,无需手动添加。如果是自定义拦截器处理指标,需结合ObservationRegistry实现计时逻辑:
import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; public class CustomMetricInterceptor implements HandlerInterceptor { private final ObservationRegistry observationRegistry; public CustomMetricInterceptor(ObservationRegistry observationRegistry) { this.observationRegistry = observationRegistry; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 创建观测实例并绑定到请求上下文 Observation requestObservation = Observation.createNotStarted("web.request.custom", observationRegistry) .tag("request.uri", request.getRequestURI()) .tag("request.method", request.getMethod()); requestObservation.start(); request.setAttribute("REQUEST_OBSERVATION", requestObservation); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { Observation requestObservation = (Observation) request.getAttribute("REQUEST_OBSERVATION"); if (requestObservation != null) { // 补充响应状态、异常等标签 requestObservation.tag("response.status", String.valueOf(response.getStatus())); if (ex != null) { requestObservation.error(ex); } requestObservation.stop(); } } }
注册自定义拦截器时注入ObservationRegistry:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebMvcConfig implements WebMvcConfigurer { private final ObservationRegistry observationRegistry; public WebMvcConfig(ObservationRegistry observationRegistry) { this.observationRegistry = observationRegistry; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CustomMetricInterceptor(observationRegistry)) .addPathPatterns("/**"); } }
3. 验证配置生效
启动应用后,通过Actuator的/actuator/metrics/http.server.requests端点(需开启Actuator)查看指标详情,检查percentileHistogramBuckets是否与自定义桶一致。
内容的提问来源于stack exchange,提问作者Alberto San José
相关产品推荐
相关产品推荐

