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

Spring Boot 3.0.6升级后Prometheus指标status由2xx变具体状态码的解决咨询

解决Spring Boot 3.x升级后Prometheus HTTP指标status标签从聚合值变具体码的问题

问题根源

Spring Boot 3.x依赖的Micrometer版本(1.10+)调整了HTTP请求指标的状态码标签默认行为:原本会将200/201这类状态码聚合为2xx,现在默认输出具体的状态码值,这直接导致原有依赖2xx/3xx等标签的Grafana面板失效。

解决方案

方案1:自定义MeterFilter转换状态码标签

创建自定义MeterFilter,将具体状态码替换为聚合格式的标签值:

import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.MeterFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.regex.Pattern;

@Configuration
public class PrometheusMetricsConfig {

    private static final Pattern STATUS_CODE_PATTERN = Pattern.compile("^([1-5])\\d{2}$");

    @Bean
    public MeterFilter statusCodeAggregationFilter() {
        return new MeterFilter() {
            @Override
            public Meter.Id map(Meter.Id id) {
                if ("http_server_requests_seconds".equals(id.getName())) {
                    String status = id.getTag("status");
                    if (status != null && STATUS_CODE_PATTERN.matcher(status).matches()) {
                        String aggregatedStatus = status.charAt(0) + "xx";
                        return id.withTag("status", aggregatedStatus);
                    }
                }
                return id;
            }
        };
    }
}

这段代码会匹配http_server_requests_seconds指标的status标签,将3位具体状态码转换为1xx/2xx/3xx/4xx/5xx格式的聚合值,和Spring Boot 2.x的行为保持一致。

方案2:调整Micrometer的HttpStatusMapper配置

如果使用Spring MVC,可通过配置WebMvcMetricsFilter指定聚合状态码映射器:

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.binder.http.DefaultHttpStatusMapper;
import io.micrometer.core.instrument.binder.http.HttpStatusMapper;
import org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebMvcMetricsConfig {

    @Bean
    public WebMvcMetricsFilter webMvcMetricsFilter(MeterRegistry meterRegistry) {
        HttpStatusMapper statusMapper = DefaultHttpStatusMapper.forPattern();
        return new WebMvcMetricsFilter(meterRegistry, statusMapper);
    }
}

DefaultHttpStatusMapper.forPattern()会恢复Spring Boot 2.x使用的聚合状态码映射规则。

方案3:Prometheus端relabel规则(应急方案)

若暂时无法修改应用代码,可在Prometheus配置中添加relabel规则转换状态码:

scrape_configs:
  - job_name: 'your-app'
    # 其他原有配置...
    relabel_configs:
      - source_labels: [status]
        regex: '^([1-5])\d{2}$'
        replacement: '${1}xx'
        target_label: status

该方式无需改动应用,但需重启Prometheus,适合快速应急修复。

验证

重启应用(或Prometheus)后,查看http_server_requests_seconds_count指标,status标签应恢复为2xx这类聚合值,原有Grafana面板即可正常工作。

内容的提问来源于stack exchange,提问作者Sachin Mankotia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:01:35