Skip to content

Commit 50e4f46

Browse files
adinauerclaude
andcommitted
fix(sentry): Log unknown key recovery failures
Log a second error when unknown-field recovery itself fails. This makes nextUnknown consistent with the list and map recovery paths and makes truncated payload failures easier to diagnose. Add regression coverage for unknown-key deserialization failures that also leave the stream unrecoverable. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent cc962a6 commit 50e4f46

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

sentry/src/main/java/io/sentry/JsonObjectReader.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,11 @@ public void nextUnknown(ILogger logger, Map<String, Object> unknown, String name
9898
if (recoveryState != null) {
9999
try {
100100
recoverValue(recoveryState);
101-
} catch (Exception ignored) {
102-
// stream is unrecoverable
101+
} catch (Exception recoveryException) {
102+
logger.log(
103+
SentryLevel.ERROR,
104+
"Stream unrecoverable after unknown key deserialization failure.",
105+
recoveryException);
103106
}
104107
}
105108
} finally {

sentry/src/test/java/io/sentry/JsonObjectReaderTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.mockito.kotlin.eq
1010
import org.mockito.kotlin.mock
1111
import org.mockito.kotlin.never
1212
import org.mockito.kotlin.verify
13+
import org.mockito.kotlin.verifyNoMoreInteractions
1314

1415
class JsonObjectReaderTest {
1516
class Fixture {
@@ -424,6 +425,32 @@ class JsonObjectReaderTest {
424425
)
425426
}
426427

428+
@Test(timeout = 1000L)
429+
fun `nextUnknown logs when recovery fails`() {
430+
val unknown = mutableMapOf<String, Any>()
431+
val reader = fixture.getSut("{\"key\": {\"value\": \"fail\"")
432+
reader.beginObject()
433+
val name = reader.nextName()
434+
435+
reader.nextUnknown(fixture.logger, unknown, name)
436+
437+
assertEquals(emptyMap(), unknown)
438+
verify(fixture.logger)
439+
.log(
440+
eq(SentryLevel.ERROR),
441+
any<Throwable>(),
442+
eq("Error deserializing unknown key: %s"),
443+
eq("key"),
444+
)
445+
verify(fixture.logger)
446+
.log(
447+
eq(SentryLevel.ERROR),
448+
eq("Stream unrecoverable after unknown key deserialization failure."),
449+
any<Throwable>(),
450+
)
451+
verifyNoMoreInteractions(fixture.logger)
452+
}
453+
427454
// nextDateOrNull
428455

429456
@Test

0 commit comments

Comments
 (0)