When using these dependencies:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator-autoconfigure</artifactId>
</dependency>

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>

the application startup fails with

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'observationRegistry' defined in class path resource [org/springframework/boot/actuate/autoconfigure/observation/ObservationAutoConfiguration.class]: io/micrometer/core/instrument/observation/MeterObservationHandler
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:611) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1374) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1294) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:861) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:765) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    ... 90 common frames omitted
Caused by: java.lang.NoClassDefFoundError: io/micrometer/core/instrument/observation/MeterObservationHandler
    at org.springframework.boot.actuate.autoconfigure.observation.TracingObservationHandlerGrouping.apply(TracingObservationHandlerGrouping.java:48) ~[spring-boot-actuator-autoconfigure-3.0.0-SNAPSHOT.jar:3.0.0-SNAPSHOT]
    at org.springframework.boot.actuate.autoconfigure.observation.ObservationRegistryConfigurer.registerHandlers(ObservationRegistryConfigurer.java:71) ~[spring-boot-actuator-autoconfigure-3.0.0-SNAPSHOT.jar:3.0.0-SNAPSHOT]
    at org.springframework.boot.actuate.autoconfigure.observation.ObservationRegistryConfigurer.configure(ObservationRegistryConfigurer.java:66) ~[spring-boot-actuator-autoconfigure-3.0.0-SNAPSHOT.jar:3.0.0-SNAPSHOT]
    at org.springframework.boot.actuate.autoconfigure.observation.ObservationRegistryPostProcessor.postProcessAfterInitialization(ObservationRegistryPostProcessor.java:64) ~[spring-boot-actuator-autoconfigure-3.0.0-SNAPSHOT.jar:3.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:440) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1756) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604) ~[spring-beans-6.0.0-20220710.183850-587.jar:6.0.0-SNAPSHOT]
    ... 100 common frames omitted
Caused by: java.lang.ClassNotFoundException: io.micrometer.core.instrument.observation.MeterObservationHandler
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
    ... 107 common frames omitted

This is because org.springframework.boot.actuate.autoconfigure.observation.TracingObservationHandlerGrouping references MeterObservationHandler but the auto-configuration for it has no guard on micrometer-core where MeterObservationHandler is coming from.

We have auto-configuration for those cases:

  • only metrics: org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration.OnlyMetricsConfiguration
  • metrics & tracing: org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration.TracingConfiguration

The configuration for "only tracing" is missing.

A user is unlikely to trigger this, as spring-boot-starter-actuator pulls in micrometer-core, too.

Comment From: wilkinsona

This problem has been addressed in the recent observability refinements.

Comment From: frakhlystov

sorry I don't understand how to fix the issue?

Comment From: wilkinsona

@frakhlystov there shouldn't be a need for you to do anything as we believe the problem was addressed by other changes during the development of 3.0. If you're seeing the auto-configuration cause a ClassNotFoundException for io.micrometer.core.instrument.observation.MeterObservationHandler and you would like use to investigate, please open a new issue with a minimal sample that reproduces the failure.