LogbackMetrics: SubstituteLoggerFactory cannot be cast to class LoggerContext (original) (raw)
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
- Micrometer version 1.7.5
- Micrometer registry prometheus
- OS: macOs and Ubuntu 20
- Java version: 16 and 17
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)