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
相关产品推荐
相关产品推荐

