情况:您已经通过MeterBinder在Spring Boot中注册了一个指标。可能是jvm.gc.pause1
之类的自动配置指标之一,也可能是您自己的自定义指标。但是有一天,您启动您的应用程序,但它丢失了。它没有报告,也没有在Actuator中显示,它就消失了。
根本原因:可能您正在使用的代码或库正在注入MeterRegistry。这样做有很多正当的理由,所以不要怪自己。但是注入MeterRegistry意味着它将在创建所有bean(包括可能的MeterBinders)之前创建并初始化。
也有可能没有注入MeterRegistry,但是出于某些其他原因,Spring决定在MeterBinders之前创建它。无论如何,MeterBinders都会为您停止工作,您无能为力。
答案 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将运行两次,因此您需要确保它们所做的工作是幂等的。