Spring Boot 2.X集成Micrometer/Prometheus自定义指标不显示问题
问题解决:Spring Boot 2.X自定义Micrometer指标未在Prometheus端点显示
核心问题为手动实例化了独立的CompositeMeterRegistry与PrometheusMeterRegistry,而Spring Boot Actuator的/actuator/prometheus端点只会读取Spring容器自动管理的MeterRegistry实例中注册的指标,两者完全隔离,因此自定义的指标不会被暴露。
1. 补全必要依赖
确保build.gradle中同时包含Actuator和Prometheus注册器依赖:
implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-registry-prometheus:latest.release'
2. 调整配置文件
在application.properties或application.yml中暴露Prometheus端点:
# 暴露prometheus端点 management.endpoints.web.exposure.include=prometheus # 可选配置:开启全局指标标签,方便多实例指标聚合 management.metrics.tags.application=${spring.application.name}
3. 调整代码实现
无需手动创建MeterRegistry实例,直接注入Spring自动管理的实例即可:
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.time.Duration; @Component public class CustomMetricService { // 直接注入Spring自动配置的MeterRegistry,内部已自动组合Prometheus注册器 @Autowired private MeterRegistry meterRegistry; public void doSomethingWithMetric() { long start = System.currentTimeMillis(); doSomething(); long duration = System.currentTimeMillis() - start; // 注册并记录Timer Timer timer = Timer.builder("test.times") .publishPercentiles(0.5, 0.75, 0.95) // 注意:最大/最小预期值不要设为相同,会影响统计准确性,建议按实际业务耗时调整 .maximumExpectedValue(Duration.ofSeconds(15)) .minimumExpectedValue(Duration.ofMillis(10)) .register(meterRegistry); timer.record(duration, TimeUnit.MILLISECONDS); meterRegistry.timer("test.times.new").record(duration, TimeUnit.MILLISECONDS); // 注册Gauge AtomicInteger test = meterRegistry.gauge("custom.gauge", new AtomicInteger(8)); test.set(30); // 注册并递增Counter meterRegistry.counter("custom.counter").increment(); } }
效果验证
重启服务后触发一次上述业务方法的执行,再次访问/actuator/prometheus即可看到所有自定义指标。
内容的提问来源于stack exchange,提问作者prix
相关产品推荐
相关产品推荐

