Mikita Karaliou
Mikita Karaliou

Reputation: 86

@ConditionalOnBean doesn't work properly with micrometer MeterRegistry

I am trying to expose metrics out of my spring boot application using micrometer.

Following configuration didn't work for some reason:

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter({ MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class })
@ConditionalOnClass(MeterRegistry.class)
@ConditionalOnBean(MeterRegistry.class)
public class SuperTestAutoConfig {
    @Bean
    public Object testBean() {
        return new Object();
    }
}

Spring says:

SuperTestAutoConfig:
      Did not match:
         - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) did not find any beans of type io.micrometer.core.instrument.MeterRegistry (OnBeanCondition)
      Matched:
         - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition)

But for absolutely the same annotated configuration JvmMetricsAutoConfiguration it works perfectly:

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter({ MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class })
@ConditionalOnClass(MeterRegistry.class)
@ConditionalOnBean(MeterRegistry.class)
public class JvmMetricsAutoConfiguration {}

Log says:

   JvmMetricsAutoConfiguration matched:
      - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition)
      - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'prometheusMeterRegistry' (OnBeanCondition)

Fully example is here: https://filebin.net/gjxnwwksaqs1x8zg

Upvotes: 1

Views: 1252

Answers (1)

Mikita Karaliou
Mikita Karaliou

Reputation: 86

The reason was in missing spring.factories definition for this autoconfig. After listing this class in spring.factories it works perfectly as expected.

Upvotes: 3

Related Questions