Spring Boot Actuator采集Prometheus指标不全,是否存在配置限制?
Spring Boot Actuator Prometheus 指标丢失问题解决
问题根因
你遇到的是Micrometer标签基数限制导致的指标丢失。Micrometer作为Spring Boot指标收集的底层框架,为避免高基数标签(比如uri)引发Prometheus存储、查询性能下降,默认对每个指标的标签值数量(基数)做了限制。当API数量超过该限制时,新API请求对应的uri标签值会被标记为unknown,不会生成独立的指标条目,最终表现为Prometheus无法采集到后续API的指标。
解决方案
1. 通过配置文件全局调整标签基数限制
直接在application.yml或application.properties中配置全局最大标签基数,设置为大于你的API总数(比如350):
YAML格式:
management: metrics: tags: maximum-cardinality: 350 distribution: percentiles-histogram: http: server: requests: true
Properties格式:
management.metrics.tags.maximum-cardinality=350 management.metrics.distribution.percentiles-histogram.http.server.requests=true
2. 自定义MeterFilter单独调整HTTP请求的uri标签基数
如果不想全局调整所有指标的基数限制,可编写配置类,仅针对http_server_requests指标的uri标签设置更高的基数:
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; @Configuration public class MetricsConfig { @Bean public MeterFilter uriCardinalityFilter() { return new MeterFilter() { @Override public Meter.Id map(Meter.Id id) { if ("http_server_requests".equals(id.getName())) { return id.withTag("uri", id.getTag("uri")); } return id; } @Override public MeterFilterReply accept(Meter.Id id) { if ("http_server_requests".equals(id.getName())) { // 设置uri标签最大基数为350,可根据实际API数量调整 return MeterFilterReply.accept(id, "uri", 350); } return MeterFilterReply.accept(); } }; } }
3. 过滤不需要采集的指标节省基数空间
如果部分API(比如Actuator自身端点、健康检查接口)无需采集指标,可通过MeterFilter过滤这些请求,减少uri标签的基数占用:
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; @Configuration public class MetricsFilterConfig { @Bean public MeterFilter unwantedUriFilter() { return MeterFilter.deny(id -> { if ("http_server_requests".equals(id.getName())) { String uri = id.getTag("uri"); return uri != null && (uri.startsWith("/actuator/") || uri.equals("/health")); } return false; }); } }
验证方法
修改配置后重启应用,调用所有300个API接口,访问/actuator/prometheus端点,搜索http_server_requests_seconds_count等指标,确认是否包含所有API的uri标签值。
内容的提问来源于stack exchange,提问作者jhonshonjs
相关产品推荐
相关产品推荐

