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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:33:16