Spring Boot 3中Micrometer HTTP服务请求指标缺失异常标签如何恢复?
恢复Spring Boot 3中HTTP请求指标的exception和error标签
Spring Boot 3 基于 Micrometer 1.10+ 版本,遵循 OpenTelemetry 规范调整了 HTTP 请求指标的默认标签集,移除了原 Spring Boot 2 中的exception和error标签。如果需要恢复这两个标签,可以通过以下两种方式实现:
方案一:自定义Web请求标签提供者(推荐)
针对Spring MVC或WebFlux场景,分别自定义对应的TagsProvider,直接在指标构建阶段添加标签:
Spring MVC场景
创建配置类,继承并扩展默认的DefaultWebMvcTagsProvider:
import io.micrometer.core.instrument.Tag; import io.micrometer.spring.web.servlet.DefaultWebMvcTagsProvider; import io.micrometer.spring.web.servlet.WebMvcTagsProvider; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; @Configuration public class MetricsConfig { @Bean public WebMvcTagsProvider webMvcTagsProvider() { return new DefaultWebMvcTagsProvider() { @Override public Iterable<Tag> errorTags(HttpServletRequest request, HttpServletResponse response, Object handler, Throwable exception) { List<Tag> tags = new ArrayList<>(super.errorTags(request, response, handler, exception)); if (exception != null) { // 添加exception和error标签,值为异常类的简单名称 tags.add(Tag.of("exception", exception.getClass().getSimpleName())); tags.add(Tag.of("error", exception.getClass().getSimpleName())); } return tags; } }; } }
WebFlux场景
类似地,扩展DefaultWebFluxTagsProvider:
import io.micrometer.core.instrument.Tag; import io.micrometer.spring.web.reactive.DefaultWebFluxTagsProvider; import io.micrometer.spring.web.reactive.WebFluxTagsProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.server.ServerWebExchange; import java.util.ArrayList; import java.util.List; @Configuration public class MetricsConfig { @Bean public WebFluxTagsProvider webFluxTagsProvider() { return new DefaultWebFluxTagsProvider() { @Override public Iterable<Tag> errorTags(ServerWebExchange exchange, Throwable exception) { List<Tag> tags = new ArrayList<>(super.errorTags(exchange, exception)); if (exception != null) { tags.add(Tag.of("exception", exception.getClass().getSimpleName())); tags.add(Tag.of("error", exception.getClass().getSimpleName())); } return tags; } }; } }
方案二:全局MeterFilter动态添加标签
通过全局的MeterFilter对HTTP请求指标进行修改,动态补充标签。这种方式更通用,但需要额外处理异常上下文的传递:
import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterFilter; import io.micrometer.core.instrument.Tag; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; @Configuration public class MetricsFilterConfig { @Bean public MeterFilter addExceptionAndErrorTags() { return new MeterFilter() { @Override public Meter.Id map(Meter.Id id) { if (id.getName().startsWith("http.server.requests")) { List<Tag> existingTags = new ArrayList<>(id.getTags()); // 判断是否为服务端错误请求 boolean isServerError = existingTags.stream() .anyMatch(tag -> "outcome".equals(tag.getKey()) && "SERVER_ERROR".equals(tag.getValue())); if (isServerError) { // 这里可以结合全局异常处理器,将异常信息通过ThreadLocal或请求属性传递过来 // 示例中使用默认值,实际场景替换为真实异常类名 existingTags.add(Tag.of("exception", "ServerErrorException")); existingTags.add(Tag.of("error", "ServerErrorException")); } return id.withTags(existingTags); } return id; } }; } }
说明
- 方案一能直接获取到请求处理过程中的异常对象,标签值更准确,是优先推荐的方式。
- 方案二需要结合你的异常处理逻辑传递异常信息,否则只能添加固定值标签,适合不需要精准异常类名的场景。
配置完成后重启应用,错误请求的http_server_requests_*指标就会重新包含exception和error标签。
内容的提问来源于stack exchange,提问作者F_SO_K
相关产品推荐
相关产品推荐

