From d2a38ccc2b0092051e9d387165ba7f38032f850b Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 3 Nov 2025 13:35:31 +0100 Subject: [PATCH 1/4] Fix log count in client reports --- .../clientreport/ClientReportRecorder.java | 15 +++++++++-- .../sentry/clientreport/ClientReportTest.kt | 27 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/sentry/src/main/java/io/sentry/clientreport/ClientReportRecorder.java b/sentry/src/main/java/io/sentry/clientreport/ClientReportRecorder.java index 4e2383eb107..7b415ce48c9 100644 --- a/sentry/src/main/java/io/sentry/clientreport/ClientReportRecorder.java +++ b/sentry/src/main/java/io/sentry/clientreport/ClientReportRecorder.java @@ -6,6 +6,7 @@ import io.sentry.SentryEnvelopeItem; import io.sentry.SentryItemType; import io.sentry.SentryLevel; +import io.sentry.SentryLogEvents; import io.sentry.SentryOptions; import io.sentry.protocol.SentrySpan; import io.sentry.protocol.SentryTransaction; @@ -98,9 +99,19 @@ public void recordLostEnvelopeItem( reason.getReason(), DataCategory.Span.getCategory(), spans.size() + 1L); executeOnDiscard(reason, DataCategory.Span, spans.size() + 1L); } + recordLostEventInternal(reason.getReason(), itemCategory.getCategory(), 1L); + executeOnDiscard(reason, itemCategory, 1L); + } else if (itemCategory.equals(DataCategory.LogItem)) { + final @Nullable SentryLogEvents logs = envelopeItem.getLogs(options.getSerializer()); + if (logs != null) { + final long count = logs.getItems().size(); + recordLostEventInternal(reason.getReason(), itemCategory.getCategory(), count); + executeOnDiscard(reason, itemCategory, count); + } + } else { + recordLostEventInternal(reason.getReason(), itemCategory.getCategory(), 1L); + executeOnDiscard(reason, itemCategory, 1L); } - recordLostEventInternal(reason.getReason(), itemCategory.getCategory(), 1L); - executeOnDiscard(reason, itemCategory, 1L); } } catch (Throwable e) { options.getLogger().log(SentryLevel.ERROR, e, "Unable to record lost envelope item."); diff --git a/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt b/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt index 2b34fd839b0..eae216239aa 100644 --- a/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt +++ b/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt @@ -16,6 +16,10 @@ import io.sentry.SentryEnvelope import io.sentry.SentryEnvelopeHeader import io.sentry.SentryEnvelopeItem import io.sentry.SentryEvent +import io.sentry.SentryLogEvent +import io.sentry.SentryLogEvents +import io.sentry.SentryLogLevel +import io.sentry.SentryLongDate import io.sentry.SentryOptions import io.sentry.SentryReplayEvent import io.sentry.SentryTracer @@ -347,6 +351,29 @@ class ClientReportTest { verify(onDiscardMock, times(1)).execute(DiscardReason.BEFORE_SEND, DataCategory.Profile, 1) } + @Test + fun `recording lost client report counts log entries`() { + val onDiscardMock = mock() + givenClientReportRecorder { options -> options.onDiscard = onDiscardMock } + + val envelope = + testHelper.newEnvelope( + SentryEnvelopeItem.fromLogs( + opts.serializer, + SentryLogEvents( + listOf( + SentryLogEvent(SentryId(), SentryLongDate(1), "log message 1", SentryLogLevel.ERROR), + SentryLogEvent(SentryId(), SentryLongDate(2), "log message 2", SentryLogLevel.WARN), + ) + ), + ) + ) + + clientReportRecorder.recordLostEnvelopeItem(DiscardReason.NETWORK_ERROR, envelope.items.first()) + + verify(onDiscardMock, times(1)).execute(DiscardReason.NETWORK_ERROR, DataCategory.LogItem, 2) + } + private fun givenClientReportRecorder( callback: Sentry.OptionsConfiguration? = null ) { From 3bd2cf0e1d48489ad7e94fe945ea4bdcdff2adc0 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 3 Nov 2025 15:29:02 +0100 Subject: [PATCH 2/4] add assertion to test --- .../src/test/java/io/sentry/clientreport/ClientReportTest.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt b/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt index eae216239aa..30cfece6267 100644 --- a/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt +++ b/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt @@ -372,6 +372,10 @@ class ClientReportTest { clientReportRecorder.recordLostEnvelopeItem(DiscardReason.NETWORK_ERROR, envelope.items.first()) verify(onDiscardMock, times(1)).execute(DiscardReason.NETWORK_ERROR, DataCategory.LogItem, 2) + + val clientReport = clientReportRecorder.resetCountsAndGenerateClientReport() + val logItem = clientReport!!.discardedEvents!!.first { it.category == DataCategory.LogItem.category } + assertEquals(2, logItem.quantity) } private fun givenClientReportRecorder( From fc4fc35924890054dbe7de93d2f1b3b56f2e9258 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Wed, 5 Nov 2025 12:49:23 +0000 Subject: [PATCH 3/4] Format code --- .../src/test/java/io/sentry/clientreport/ClientReportTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt b/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt index 30cfece6267..4316af5a2bc 100644 --- a/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt +++ b/sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt @@ -374,7 +374,8 @@ class ClientReportTest { verify(onDiscardMock, times(1)).execute(DiscardReason.NETWORK_ERROR, DataCategory.LogItem, 2) val clientReport = clientReportRecorder.resetCountsAndGenerateClientReport() - val logItem = clientReport!!.discardedEvents!!.first { it.category == DataCategory.LogItem.category } + val logItem = + clientReport!!.discardedEvents!!.first { it.category == DataCategory.LogItem.category } assertEquals(2, logItem.quantity) } From 06f9c6a74ea53a0aee27c062d0782e62f5bc6e3e Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 11 Nov 2025 10:48:55 +0100 Subject: [PATCH 4/4] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5206f8e4f77..8f6c77a6b38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Fixes + +- Fix log count in client reports ([#4869](https://github.com/getsentry/sentry-java/pull/4869)) + ### Improvements - Fallback to distinct-id as user.id logging attribute when user is not set ([#4847](https://github.com/getsentry/sentry-java/pull/4847))