Skip to content

Commit 878fd7b

Browse files
donbeaveadinauer
andauthored
Fix "class ch.qos.logback.classic.spi.ThrowableProxyVO cannot be cast to class ch.qos.logback.classic.spi.ThrowableProxy" (#4206)
* Fix "class ch.qos.logback.classic.spi.ThrowableProxyVO cannot be cast to class ch.qos.logback.classic.spi.ThrowableProxy" 15:44:34,110 |-ERROR in io.sentry.logback.SentryAppender[SENTRY_ORIGINAL] - Appender [SENTRY_ORIGINAL] failed to append. java.lang.ClassCastException: class ch.qos.logback.classic.spi.ThrowableProxyVO cannot be cast to class ch.qos.logback.classic.spi.ThrowableProxy (ch.qos.logback.classic.spi.ThrowableProxyVO and ch.qos.logback.classic.spi.ThrowableProxy are in unnamed module of loader 'app') at java.lang.ClassCastException: class ch.qos.logback.classic.spi.ThrowableProxyVO cannot be cast to class ch.qos.logback.classic.spi.ThrowableProxy (ch.qos.logback.classic.spi.ThrowableProxyVO and ch.qos.logback.classic.spi.ThrowableProxy are in unnamed module of loader 'app') at at io.sentry.logback.SentryAppender.createEvent(SentryAppender.java:113) at at io.sentry.logback.SentryAppender.append(SentryAppender.java:80) at at io.sentry.logback.SentryAppender.append(SentryAppender.java:41) at at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85) at at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51) at at io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender.append(OpenTelemetryAppender.java:111) at at io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender.append(OpenTelemetryAppender.java:30) at at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85) at at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51) at at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:272) at at ch.qos.logback.classic.Logger.callAppenders(Logger.java:259) at at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:426) at at ch.qos.logback.classic.Logger.filterAndLog_2(Logger.java:419) at at ch.qos.logback.classic.Logger.error(Logger.java:535) at at io.micronaut.runtime.Micronaut.handleStartupException(Micronaut.java:343) at at io.micronaut.runtime.Micronaut.start(Micronaut.java:173) at at io.micronaut.runtime.Micronaut.run(Micronaut.java:328) at at io.micronaut.runtime.Micronaut.run(Micronaut.java:314) * Spotless * Added changelog. * add test * move and extend changelog entry --------- Co-authored-by: Alexander Dinauer <[email protected]> Co-authored-by: Alexander Dinauer <[email protected]>
1 parent 21a214b commit 878fd7b

File tree

3 files changed

+36
-8
lines changed

3 files changed

+36
-8
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
- Add support for setting in-app-includes/in-app-excludes via AndroidManifest.xml ([#4240](https://github.com/getsentry/sentry-java/pull/4240))
1414
- Modifications to OkHttp requests are now properly propagated to the affected span / breadcrumbs ([#4238](https://github.com/getsentry/sentry-java/pull/4238))
1515
- Please ensure the SentryOkHttpInterceptor is added last to your OkHttpClient, as otherwise changes to the `Request` by subsequent interceptors won't be considered
16+
- Fix "class ch.qos.logback.classic.spi.ThrowableProxyVO cannot be cast to class ch.qos.logback.classic.spi.ThrowableProxy" ([#4206](https://github.com/getsentry/sentry-java/pull/4206))
17+
- In this case we cannot report the `Throwable` to Sentry as it's not available
18+
- If you are using OpenTelemetry v1 `OpenTelemetryAppender`, please consider upgrading to v2
1619

1720
### Features
1821

sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,16 @@ protected void append(@NotNull ILoggingEvent eventObject) {
110110
event.setLogger(loggingEvent.getLoggerName());
111111
event.setLevel(formatLevel(loggingEvent.getLevel()));
112112

113-
final ThrowableProxy throwableInformation = (ThrowableProxy) loggingEvent.getThrowableProxy();
114-
if (throwableInformation != null) {
115-
final Mechanism mechanism = new Mechanism();
116-
mechanism.setType(MECHANISM_TYPE);
117-
final Throwable mechanismException =
118-
new ExceptionMechanismException(
119-
mechanism, throwableInformation.getThrowable(), Thread.currentThread());
120-
event.setThrowable(mechanismException);
113+
if (loggingEvent.getThrowableProxy() instanceof ThrowableProxy) {
114+
final ThrowableProxy throwableInformation = (ThrowableProxy) loggingEvent.getThrowableProxy();
115+
if (throwableInformation != null) {
116+
final Mechanism mechanism = new Mechanism();
117+
mechanism.setType(MECHANISM_TYPE);
118+
final Throwable mechanismException =
119+
new ExceptionMechanismException(
120+
mechanism, throwableInformation.getThrowable(), Thread.currentThread());
121+
event.setThrowable(mechanismException);
122+
}
121123
}
122124

123125
if (loggingEvent.getThreadName() != null) {

sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import ch.qos.logback.classic.Level
44
import ch.qos.logback.classic.LoggerContext
55
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
66
import ch.qos.logback.classic.spi.ILoggingEvent
7+
import ch.qos.logback.classic.spi.LoggingEvent
8+
import ch.qos.logback.classic.spi.LoggingEventVO
9+
import ch.qos.logback.classic.spi.ThrowableProxy
710
import ch.qos.logback.core.encoder.Encoder
811
import ch.qos.logback.core.encoder.EncoderBase
912
import ch.qos.logback.core.status.Status
@@ -536,4 +539,24 @@ class SentryAppenderTest {
536539
assertTrue(Sentry.isEnabled())
537540
System.clearProperty("sentry.dsn")
538541
}
542+
543+
@Test
544+
fun `does not crash on ThrowableProxyVO`() {
545+
fixture = Fixture()
546+
val throwableProxy = ThrowableProxy(RuntimeException("hello proxy throwable"))
547+
val loggingEvent = LoggingEvent()
548+
loggingEvent.level = Level.ERROR
549+
loggingEvent.setThrowableProxy(throwableProxy)
550+
val loggingEventVO = LoggingEventVO.build(loggingEvent)
551+
552+
fixture.appender.append(loggingEventVO)
553+
554+
verify(fixture.transport).send(
555+
checkEvent { event ->
556+
assertEquals(SentryLevel.ERROR, event.level)
557+
assertNull(event.exceptions)
558+
},
559+
anyOrNull()
560+
)
561+
}
539562
}

0 commit comments

Comments
 (0)