Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import io.sentry.SentryLevel;
import io.sentry.SentryLogEvent;
import io.sentry.SentryLogEvents;
import io.sentry.SentryMetricsEvent;
import io.sentry.SentryMetricsEvents;
import io.sentry.SentryOptions;
import io.sentry.protocol.SentrySpan;
import io.sentry.protocol.SentryTransaction;
Expand Down Expand Up @@ -115,6 +117,19 @@ public void recordLostEnvelopeItem(
} else {
options.getLogger().log(SentryLevel.ERROR, "Unable to parse lost logs envelope item.");
}
} else if (itemCategory.equals(DataCategory.TraceMetric)) {
final @Nullable SentryMetricsEvents metrics =
envelopeItem.getMetrics(options.getSerializer());
if (metrics != null) {
final @NotNull List<SentryMetricsEvent> items = metrics.getItems();
final long count = items.size();
recordLostEventInternal(reason.getReason(), itemCategory.getCategory(), count);
executeOnDiscard(reason, itemCategory, count);
} else {
options
.getLogger()
.log(SentryLevel.ERROR, "Unable to parse lost metrics envelope item.");
}
} else {
recordLostEventInternal(reason.getReason(), itemCategory.getCategory(), 1L);
executeOnDiscard(reason, itemCategory, 1L);
Expand Down
32 changes: 32 additions & 0 deletions sentry/src/test/java/io/sentry/clientreport/ClientReportTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import io.sentry.SentryLogEvent
import io.sentry.SentryLogEvents
import io.sentry.SentryLogLevel
import io.sentry.SentryLongDate
import io.sentry.SentryMetricsEvent
import io.sentry.SentryMetricsEvents
import io.sentry.SentryOptions
import io.sentry.SentryReplayEvent
import io.sentry.SentryTracer
Expand Down Expand Up @@ -382,6 +384,36 @@ class ClientReportTest {
assertEquals(226, logByte.quantity)
}

@Test
fun `recording lost client report counts metric entries`() {
val onDiscardMock = mock<SentryOptions.OnDiscardCallback>()
givenClientReportRecorder { options -> options.onDiscard = onDiscardMock }

val envelope =
testHelper.newEnvelope(
SentryEnvelopeItem.fromMetrics(
opts.serializer,
SentryMetricsEvents(
listOf(
SentryMetricsEvent(SentryId(), SentryLongDate(1), "metric1", "counter", 1.0),
SentryMetricsEvent(SentryId(), SentryLongDate(2), "metric2", "gauge", 2.0),
SentryMetricsEvent(SentryId(), SentryLongDate(3), "metric3", "distribution", 3.0),
)
),
)
)

clientReportRecorder.recordLostEnvelopeItem(DiscardReason.NETWORK_ERROR, envelope.items.first())

verify(onDiscardMock, times(1))
.execute(DiscardReason.NETWORK_ERROR, DataCategory.TraceMetric, 3)

val clientReport = clientReportRecorder.resetCountsAndGenerateClientReport()
val metricItem =
clientReport!!.discardedEvents!!.first { it.category == DataCategory.TraceMetric.category }
assertEquals(3, metricItem.quantity)
}

private fun givenClientReportRecorder(
callback: Sentry.OptionsConfiguration<SentryOptions>? = null
) {
Expand Down
Loading