Skip to content

Commit dd8f7bb

Browse files
Add callback to record the type and amount of data discarded before reaching Sentry
1 parent b2ab4eb commit dd8f7bb

File tree

16 files changed

+258
-9
lines changed

16 files changed

+258
-9
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
- Remove unused method in ManifestMetadataReader ([#4585](https://github.com/getsentry/sentry-java/pull/4585))
1414
- Have single `NetworkCallback` registered at a time to reduce IPC calls ([#4562](https://github.com/getsentry/sentry-java/pull/4562))
1515

16+
### Features
17+
18+
- Add onDiscard to enable users to track the type and amount of data discarded before reaching Sentry ([#3652](https://github.com/getsentry/sentry-java/issues/3652))
19+
1620
## 8.18.0
1721

1822
### Features

sentry-samples/sentry-samples-console/src/main/java/io/sentry/samples/console/Main.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
package io.sentry.samples.console;
22

3-
import io.sentry.Breadcrumb;
4-
import io.sentry.EventProcessor;
5-
import io.sentry.Hint;
6-
import io.sentry.ISpan;
7-
import io.sentry.ITransaction;
8-
import io.sentry.Sentry;
9-
import io.sentry.SentryEvent;
10-
import io.sentry.SentryLevel;
11-
import io.sentry.SpanStatus;
3+
import io.sentry.*;
4+
import io.sentry.clientreport.DiscardReason;
125
import io.sentry.protocol.Message;
136
import io.sentry.protocol.User;
147
import java.util.Collections;
158

169
public class Main {
1710

11+
private static int numberOfDiscardedSpansDueToOverflow = 0;
12+
1813
public static void main(String[] args) throws InterruptedException {
1914
Sentry.init(
2015
options -> {
@@ -59,6 +54,18 @@ public static void main(String[] args) throws InterruptedException {
5954
return breadcrumb;
6055
});
6156

57+
// Record data being discarded, including the reason, type of data, and the number of
58+
// items dropped
59+
options.setOnDiscard(
60+
(reason, category, number) -> {
61+
// Only record the number of lost spans due to overflow conditions
62+
if ((reason.equals(DiscardReason.CACHE_OVERFLOW.getReason())
63+
|| reason.equals(DiscardReason.QUEUE_OVERFLOW.getReason()))
64+
&& category.equals(DataCategory.Span.getCategory())) {
65+
numberOfDiscardedSpansDueToOverflow += number;
66+
}
67+
});
68+
6269
// Configure the background worker which sends events to sentry:
6370
// Wait up to 5 seconds before shutdown while there are events to send.
6471
options.setShutdownTimeoutMillis(5000);

sentry-samples/sentry-samples-servlet/src/main/java/io/sentry/samples/servlet/SentryInitializer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.sentry.samples.servlet;
22

3+
import io.sentry.DataCategory;
34
import io.sentry.Sentry;
5+
import io.sentry.clientreport.DiscardReason;
46
import javax.servlet.ServletContextEvent;
57
import javax.servlet.ServletContextListener;
68
import javax.servlet.annotation.WebListener;
@@ -9,6 +11,8 @@
911
@WebListener
1012
public final class SentryInitializer implements ServletContextListener {
1113

14+
private static int numberOfDiscardedSpansDueToOverflow = 0;
15+
1216
@Override
1317
public void contextInitialized(ServletContextEvent sce) {
1418
Sentry.init(
@@ -57,6 +61,18 @@ public void contextInitialized(ServletContextEvent sce) {
5761
return breadcrumb;
5862
});
5963

64+
// Record data being discarded, including the reason, type of data, and the number of
65+
// items dropped
66+
options.setOnDiscard(
67+
(reason, category, number) -> {
68+
// Only record the number of lost spans due to overflow conditions
69+
if ((reason.equals(DiscardReason.CACHE_OVERFLOW.getReason())
70+
|| reason.equals(DiscardReason.QUEUE_OVERFLOW.getReason()))
71+
&& category.equals(DataCategory.Span.getCategory())) {
72+
numberOfDiscardedSpansDueToOverflow += number;
73+
}
74+
});
75+
6076
// Configure the background worker which sends events to sentry:
6177
// Wait up to 5 seconds before shutdown while there are events to send.
6278
options.setShutdownTimeoutMillis(5000);

sentry-spring-boot-jakarta/src/main/java/io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ static class HubConfiguration {
107107
beforeSendLogsCallback,
108108
final @NotNull ObjectProvider<SentryOptions.BeforeBreadcrumbCallback>
109109
beforeBreadcrumbCallback,
110+
final @NotNull ObjectProvider<SentryOptions.OnDiscardCallback> onDiscardCallback,
110111
final @NotNull ObjectProvider<SentryOptions.TracesSamplerCallback> tracesSamplerCallback,
111112
final @NotNull List<EventProcessor> eventProcessors,
112113
final @NotNull List<Integration> integrations,
@@ -118,6 +119,7 @@ static class HubConfiguration {
118119
beforeSendTransactionCallback.ifAvailable(options::setBeforeSendTransaction);
119120
beforeSendLogsCallback.ifAvailable(callback -> options.getLogs().setBeforeSend(callback));
120121
beforeBreadcrumbCallback.ifAvailable(options::setBeforeBreadcrumb);
122+
onDiscardCallback.ifAvailable(options::setOnDiscard);
121123
tracesSamplerCallback.ifAvailable(options::setTracesSampler);
122124
eventProcessors.forEach(options::addEventProcessor);
123125
integrations.forEach(options::addIntegration);

sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentryAutoConfigurationTest.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,17 @@ class SentryAutoConfigurationTest {
373373
}
374374
}
375375

376+
@Test
377+
fun `registers onDiscardCallback on SentryOptions`() {
378+
contextRunner
379+
.withPropertyValues("sentry.dsn=http://key@localhost/proj")
380+
.withUserConfiguration(CustomOnDiscardCallbackConfiguration::class.java)
381+
.run {
382+
assertThat(it.getBean(SentryOptions::class.java).onDiscard)
383+
.isInstanceOf(CustomOnDiscardCallback::class.java)
384+
}
385+
}
386+
376387
@Test
377388
fun `registers event processor on SentryOptions`() {
378389
contextRunner
@@ -1137,6 +1148,16 @@ class SentryAutoConfigurationTest {
11371148
override fun execute(breadcrumb: Breadcrumb, hint: Hint): Breadcrumb? = null
11381149
}
11391150

1151+
@Configuration(proxyBeanMethods = false)
1152+
open class CustomOnDiscardCallbackConfiguration {
1153+
1154+
@Bean open fun onDiscardCallback() = CustomOnDiscardCallback()
1155+
}
1156+
1157+
class CustomOnDiscardCallback : SentryOptions.OnDiscardCallback {
1158+
override fun execute(reason: String, category: String, countToAdd: Long) {}
1159+
}
1160+
11401161
@Configuration(proxyBeanMethods = false)
11411162
open class CustomEventProcessorConfiguration {
11421163

sentry-spring-boot/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ static class HubConfiguration {
105105
beforeSendLogsCallback,
106106
final @NotNull ObjectProvider<SentryOptions.BeforeBreadcrumbCallback>
107107
beforeBreadcrumbCallback,
108+
final @NotNull ObjectProvider<SentryOptions.OnDiscardCallback> onDiscardCallback,
108109
final @NotNull ObjectProvider<SentryOptions.TracesSamplerCallback> tracesSamplerCallback,
109110
final @NotNull List<EventProcessor> eventProcessors,
110111
final @NotNull List<Integration> integrations,
@@ -116,6 +117,7 @@ static class HubConfiguration {
116117
beforeSendTransactionCallback.ifAvailable(options::setBeforeSendTransaction);
117118
beforeSendLogsCallback.ifAvailable(callback -> options.getLogs().setBeforeSend(callback));
118119
beforeBreadcrumbCallback.ifAvailable(options::setBeforeBreadcrumb);
120+
onDiscardCallback.ifAvailable(options::setOnDiscard);
119121
tracesSamplerCallback.ifAvailable(options::setTracesSampler);
120122
eventProcessors.forEach(options::addEventProcessor);
121123
integrations.forEach(options::addIntegration);

sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentryAutoConfigurationTest.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,17 @@ class SentryAutoConfigurationTest {
372372
}
373373
}
374374

375+
@Test
376+
fun `registers onDiscardCallback on SentryOptions`() {
377+
contextRunner
378+
.withPropertyValues("sentry.dsn=http://key@localhost/proj")
379+
.withUserConfiguration(CustomOnDiscardCallbackConfiguration::class.java)
380+
.run {
381+
assertThat(it.getBean(SentryOptions::class.java).onDiscard)
382+
.isInstanceOf(CustomOnDiscardCallback::class.java)
383+
}
384+
}
385+
375386
@Test
376387
fun `registers event processor on SentryOptions`() {
377388
contextRunner
@@ -1063,6 +1074,16 @@ class SentryAutoConfigurationTest {
10631074
override fun execute(breadcrumb: Breadcrumb, hint: Hint): Breadcrumb? = null
10641075
}
10651076

1077+
@Configuration(proxyBeanMethods = false)
1078+
open class CustomOnDiscardCallbackConfiguration {
1079+
1080+
@Bean open fun onDiscardCallback() = CustomOnDiscardCallback()
1081+
}
1082+
1083+
class CustomOnDiscardCallback : SentryOptions.OnDiscardCallback {
1084+
override fun execute(reason: String, category: String, countToAdd: Long) {}
1085+
}
1086+
10661087
@Configuration(proxyBeanMethods = false)
10671088
open class CustomEventProcessorConfiguration {
10681089

sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryInitBeanPostProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ public SentryInitBeanPostProcessor() {
6161
applicationContext
6262
.getBeanProvider(SentryOptions.BeforeBreadcrumbCallback.class)
6363
.ifAvailable(options::setBeforeBreadcrumb);
64+
applicationContext
65+
.getBeanProvider(SentryOptions.OnDiscardCallback.class)
66+
.ifAvailable(options::setOnDiscard);
6467
applicationContext
6568
.getBeansOfType(EventProcessor.class)
6669
.values()

sentry-spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/EnableSentryTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,11 @@ class EnableSentryTest {
223223
@Bean fun beforeBreadcrumbCallback() = mock<SentryOptions.BeforeBreadcrumbCallback>()
224224
}
225225

226+
@EnableSentry(dsn = "http://key@localhost/proj")
227+
class AppConfigWithCustomOnDiscardCallback {
228+
@Bean fun onDiscardCallback() = mock<SentryOptions.OnDiscardCallback>()
229+
}
230+
226231
@EnableSentry(dsn = "http://key@localhost/proj")
227232
class AppConfigWithCustomEventProcessors {
228233
@Bean fun firstProcessor() = mock<EventProcessor>()

sentry-spring/src/main/java/io/sentry/spring/SentryInitBeanPostProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ public SentryInitBeanPostProcessor() {
6161
applicationContext
6262
.getBeanProvider(SentryOptions.BeforeBreadcrumbCallback.class)
6363
.ifAvailable(options::setBeforeBreadcrumb);
64+
applicationContext
65+
.getBeanProvider(SentryOptions.OnDiscardCallback.class)
66+
.ifAvailable(options::setOnDiscard);
6467
applicationContext
6568
.getBeansOfType(EventProcessor.class)
6669
.values()

0 commit comments

Comments
 (0)