Spring Boot - метрики для MeterBinder никогда не регистрировались - PullRequest
0 голосов
/ 10 апреля 2019

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

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

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

1 Ответ

0 голосов
/ 10 апреля 2019

Мое решение - создать свой собственный постпроцессор:

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

...