Spring Boot-MeterBinder的指标从未注册

时间:2019-04-10 04:46:51

标签: java spring spring-boot spring-micrometer

情况:您已经通过MeterBinder在Spring Boot中注册了一个指标。可能是jvm.gc.pause1之类的自动配置指标之一,也可能是您自己的自定义指标。但是有一天,您启动您的应用程序,但它丢失了。它没有报告,也没有在Actuator中显示,它就消失了。

根本原因:可能您正在使用的代码或库正在注入MeterRegistry。这样做有很多正当的理由,所以不要怪自己。但是注入MeterRegistry意味着它将在创建所有bean(包括可能的MeterBinders)之前创建并初始化。

也有可能没有注入MeterRegistry,但是出于某些其他原因,Spring决定在MeterBinders之前创建它。无论如何,MeterBinders都会为您停止工作,您无能为力。

1 个答案:

答案 0 :(得分:0)

我的解决方案是创建自己的后处理器:

@Component
class FixMeterBinders implements BeanPostProcessor {

    @Autowired
    ObjectProvider<MeterRegistry> meters;

    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if(bean instanceof MeterBinder) {
            ((MeterBinder)bean).bindTo(meters.getObject());
        }
        return bean;
    }
}

此方法有一个很大的缺点:如果Spring的后处理器按预期工作,则每个MeterBinder将运行两次,因此您需要确保它们所做的工作是幂等的。