You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:40:19