LogbackMetrics: SubstituteLoggerFactory cannot be cast to class LoggerContext (original) (raw)

Describe the bug
https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/LogbackMetrics.java#L56

this(tags, (LoggerContext) LoggerFactory.getILoggerFactory());

ILoggerFactory has another implementation in addition to LoggerContext, namely SubstituteLoggerFactory. We are running our application tests in parallell where our application is setup once for each test. This includes a call to LogbackMetrics() via ktor's MicrometerMetrics. In some cases when LoggerFactory.getILoggerFactory() is called in parallell you receive a SubstituteLoggerFactory instead.

Environment

To Reproduce
Possible to checkout https://github.com/navikt/su-se-bakover and run ./gradlew test
But a smaller case would be to setup a lot of parallell tests calling LogbackMetrics()

Expected behavior

java.lang.ClassCastException: class org.slf4j.helpers.SubstituteLoggerFactory cannot be cast to class ch.qos.logback.classic.LoggerContext (org.slf4j.helpers.SubstituteLoggerFactory and ch.qos.logback.classic.LoggerContext are in unnamed module of loader 'app')
at io.micrometer.core.instrument.binder.logging.LogbackMetrics.(LogbackMetrics.java:56)
at io.micrometer.core.instrument.binder.logging.LogbackMetrics.(LogbackMetrics.java:52)
at no.nav.su.se.bakover.web.routes.NaisRoutesKt$installMetrics$1.invoke(NaisRoutes.kt:56)
at no.nav.su.se.bakover.web.routes.NaisRoutesKt$installMetrics$1.invoke(NaisRoutes.kt:48)
at io.ktor.metrics.micrometer.MicrometerMetrics$Feature.install(MicrometerMetrics.kt:213)
at io.ktor.metrics.micrometer.MicrometerMetrics$Feature.install(MicrometerMetrics.kt:171)
at io.ktor.application.ApplicationFeatureKt.install(ApplicationFeature.kt:68)
at no.nav.su.se.bakover.web.routes.NaisRoutesKt.installMetrics(NaisRoutes.kt:48)