1

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

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

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

4

1 回答 1

1

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

@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 将运行两次,因此您需要确保它们所做的工作是幂等的。

于 2019-04-10T04:46:51.010 回答