I am upgrading my prooject from springboot 2.4.4 to 2.6.7 but in the newer version I am getting this runtime error due to cyclic dependency:
***************************
APPLICATION FAILED TO START
***************************
Description:
The dependencies of some of the beans in the application context form a cycle:
webMvcMetricsFilter defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.class]
┌─────┐
| prometheusMeterRegistry defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.class]
↑ ↓
| meterRegistryConfig defined in URL [jar:file:/Users/myname/Documents/repo/myrepo/my-module/bin/my-module.jar!/com/mypackage/app/metrics/MeterRegistryConfig.class]
└─────┘
This is my MeterRegistryConfig class:
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MeterRegistryConfig implements MeterFilter {
@Autowired
public MeterRegistryConfig(final MeterRegistry registry) {
registry
.config()
.meterFilter(
new MeterFilter() {
@Override
public DistributionStatisticConfig configure(
@NotNull final Meter.Id id, @NotNull final DistributionStatisticConfig config) {
return DistributionStatisticConfig.builder()
.percentilesHistogram(true)
.percentilePrecision(3)
.build()
.merge(config);
}
});
}
}
I am not sure why this cyclic dependency is happening with the newer version and not the older one. Can anyone please help me resolving it?
Spring Boot will automatically add every
MeterFilter
bean to the auto-configuredMeterRegistry
so yourMeterRegistryConfig
in its current form isn't needed. I'd replace it with a@Configuration
class that defines aMeterFilter
bean. Something like this: