From a25e0995fef343b3d4c24ee19de292424e34211d Mon Sep 17 00:00:00 2001 From: Alexey Zhokhov Date: Tue, 25 Feb 2025 00:53:49 +0300 Subject: [PATCH 1/5] 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) --- .../java/io/sentry/logback/SentryAppender.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java index 77ce05f47f3..1084b0b9667 100644 --- a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java +++ b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java @@ -110,14 +110,16 @@ protected void append(@NotNull ILoggingEvent eventObject) { event.setLogger(loggingEvent.getLoggerName()); event.setLevel(formatLevel(loggingEvent.getLevel())); - final ThrowableProxy throwableInformation = (ThrowableProxy) loggingEvent.getThrowableProxy(); - if (throwableInformation != null) { - final Mechanism mechanism = new Mechanism(); - mechanism.setType(MECHANISM_TYPE); - final Throwable mechanismException = - new ExceptionMechanismException( - mechanism, throwableInformation.getThrowable(), Thread.currentThread()); - event.setThrowable(mechanismException); + if (loggingEvent.getThrowableProxy() instanceof ThrowableProxy) { + final ThrowableProxy throwableInformation = (ThrowableProxy) loggingEvent.getThrowableProxy(); + if (throwableInformation != null) { + final Mechanism mechanism = new Mechanism(); + mechanism.setType(MECHANISM_TYPE); + final Throwable mechanismException = + new ExceptionMechanismException( + mechanism, throwableInformation.getThrowable(), Thread.currentThread()); + event.setThrowable(mechanismException); + } } if (loggingEvent.getThreadName() != null) { From 33fddfac039217561e14065e87251eedb92c100e Mon Sep 17 00:00:00 2001 From: Alexey Zhokhov Date: Tue, 25 Feb 2025 02:24:46 +0300 Subject: [PATCH 2/5] Spotless --- .../src/main/java/io/sentry/logback/SentryAppender.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java index 1084b0b9667..614e3dcb0f7 100644 --- a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java +++ b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java @@ -116,8 +116,8 @@ protected void append(@NotNull ILoggingEvent eventObject) { final Mechanism mechanism = new Mechanism(); mechanism.setType(MECHANISM_TYPE); final Throwable mechanismException = - new ExceptionMechanismException( - mechanism, throwableInformation.getThrowable(), Thread.currentThread()); + new ExceptionMechanismException( + mechanism, throwableInformation.getThrowable(), Thread.currentThread()); event.setThrowable(mechanismException); } } From c4cd8b98b151e78f861923f6a994d0113e7a71c3 Mon Sep 17 00:00:00 2001 From: Alexey Zhokhov Date: Tue, 25 Feb 2025 02:31:59 +0300 Subject: [PATCH 3/5] Added changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52dddc8b44a..f29b488a565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Features +- 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)) - The `ignoredErrors` option is now configurable via the manifest property `io.sentry.traces.ignored-errors` ([#4178](https://github.com/getsentry/sentry-java/pull/4178)) - A list of active Spring profiles is attached to payloads sent to Sentry (errors, traces, etc.) and displayed in the UI when using our Spring or Spring Boot integrations ([#4147](https://github.com/getsentry/sentry-java/pull/4147)) - This consists of an empty list when only the default profile is active From f5268ca057d18c114f311ead9355107ccf1d0fc9 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Wed, 12 Mar 2025 10:13:13 +0100 Subject: [PATCH 4/5] add test --- .../io/sentry/logback/SentryAppenderTest.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt b/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt index 526220d333b..c4971748b10 100644 --- a/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt +++ b/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt @@ -4,6 +4,9 @@ import ch.qos.logback.classic.Level import ch.qos.logback.classic.LoggerContext import ch.qos.logback.classic.encoder.PatternLayoutEncoder import ch.qos.logback.classic.spi.ILoggingEvent +import ch.qos.logback.classic.spi.LoggingEvent +import ch.qos.logback.classic.spi.LoggingEventVO +import ch.qos.logback.classic.spi.ThrowableProxy import ch.qos.logback.core.encoder.Encoder import ch.qos.logback.core.encoder.EncoderBase import ch.qos.logback.core.status.Status @@ -536,4 +539,24 @@ class SentryAppenderTest { assertTrue(Sentry.isEnabled()) System.clearProperty("sentry.dsn") } + + @Test + fun `does not crash on ThrowableProxyVO`() { + fixture = Fixture() + val throwableProxy = ThrowableProxy(RuntimeException("hello proxy throwable")) + val loggingEvent = LoggingEvent() + loggingEvent.level = Level.ERROR + loggingEvent.setThrowableProxy(throwableProxy) + val loggingEventVO = LoggingEventVO.build(loggingEvent) + + fixture.appender.append(loggingEventVO) + + verify(fixture.transport).send( + checkEvent { event -> + assertEquals(SentryLevel.ERROR, event.level) + assertNull(event.exceptions) + }, + anyOrNull() + ) + } } From 9e2339f48a76898239cfae1cf18c756b4507d5e4 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Wed, 12 Mar 2025 10:30:17 +0100 Subject: [PATCH 5/5] move and extend changelog entry --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f29b488a565..0c9ad85e130 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,6 @@ ### Features -- 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)) - The `ignoredErrors` option is now configurable via the manifest property `io.sentry.traces.ignored-errors` ([#4178](https://github.com/getsentry/sentry-java/pull/4178)) - A list of active Spring profiles is attached to payloads sent to Sentry (errors, traces, etc.) and displayed in the UI when using our Spring or Spring Boot integrations ([#4147](https://github.com/getsentry/sentry-java/pull/4147)) - This consists of an empty list when only the default profile is active @@ -15,6 +14,9 @@ ### Fixes - `SentryOptions.setTracePropagationTargets` is no longer marked internal ([#4170](https://github.com/getsentry/sentry-java/pull/4170)) +- 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)) + - In this case we cannot report the `Throwable` to Sentry as it's not available + - If you are using OpenTelemetry v1 `OpenTelemetryAppender`, please consider upgrading to v2 ### Behavioural Changes