Spring Boot — метрики для MeterBinder никогда не регистрировались

Ситуация: у вас есть метрика, зарегистрированная в Spring Boot через MeterBinder. Возможно, это одна из автоматически настраиваемых метрик, таких как jvm.gc.pause1, или это может быть ваша собственная метрика. Но однажды вы запускаете свое приложение, а оно отсутствует. Об этом не сообщается, это не отображается в актуаторе, оно просто исчезло.

Основная причина: возможно, ваш код или библиотека, которую вы используете, внедряют MeterRegistry. Для этого есть множество законных причин, так что не вините себя. Но внедрение MeterRegistry означает, что он будет создан и инициализирован до того, как будут созданы все ваши bean-компоненты, включая возможные MeterBinders.

Также возможно, что ничего не внедряет MeterRegistry, но Spring решил создать его до MeterBinders по какой-то другой причине. В любом случае MeterBinders перестанет работать на вас, и вы мало что можете с этим поделать.


person noah    schedule 10.04.2019    source источник


Ответы (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 будет запускаться дважды, поэтому вам нужно убедиться, что работа, которую они выполняют, является идемпотентной.

person noah    schedule 10.04.2019