Spring Boot 3集成Micrometer、Zipkin、Prometheus时Prometheus报错:不支持exemplars
问题分析与解决方案
问题原因
Spring Boot 3.x 版本中,Micrometer Tracing 结合 Brave 时,默认会为计数器类型(count)的指标自动添加 Exemplar(关联 traceId 的元数据),但 Prometheus 的计数器指标原生不支持 Exemplars——仅直方图(histogram)和摘要(summary)类型支持,这就导致了http_server_requests_seconds_count这个计数器指标触发了不支持 Exemplar 的错误。而 Spring Boot 2.x 中不存在这个默认行为,移除 Zipkin/Brave 依赖后,Exemplar 自动生成逻辑被关闭,因此恢复正常。
解决方案
1. 过滤特定指标的 Exemplar 生成
通过配置直接禁止计数器类型指标生成 Exemplar,在application.yml或application.properties中添加:
management: metrics: export: prometheus: exemplars: filter: enabled: true # 排除所有count结尾的计数器指标 patterns: "!*_count" # 或者精准排除报错的指标:"!http_server_requests_seconds_count"
这个配置会让 Prometheus 导出器跳过所有计数器类型的 Exemplar 生成,仅为支持的直方图/摘要指标保留 Exemplar。
2. 调整 Tracing 配置,仅为支持的指标类型生成 Exemplar
自定义ExemplarSampler,只允许直方图和摘要类型的指标生成 Exemplar:
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 TracingConfig { @Bean public MeterFilter exemplarFilter() { return new MeterFilter() { @Override public Meter.Id map(Meter.Id id) { // 仅为直方图和摘要类型保留Exemplar支持 if (id.getType() == Meter.Type.COUNTER) { return id.withExemplarSampler(null); } return id; } }; } }
3. 对齐依赖版本兼容性
Spring Boot 3.2.x 对应的 Micrometer Tracing 版本应为 1.3.x(而非当前使用的 1.2.1),升级依赖版本可能修复这个默认行为的问题:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> <version>1.3.1</version> </dependency>
注:建议通过 Spring Boot Starter 的依赖 bom 管理版本,避免手动指定版本号引发兼容性问题。
内容的提问来源于stack exchange,提问作者AnnKont
相关产品推荐
相关产品推荐

