@@ -107,6 +107,15 @@ private boolean shouldApplyScopeData(final @NotNull CheckIn event, final @NotNul
107107 @ NotNull SentryEvent event , final @ Nullable IScope scope , @ Nullable Hint hint ) {
108108 Objects .requireNonNull (event , "SentryEvent is required." );
109109
110+ if (SentryCallbackReentrancyGuard .isActive ()) {
111+ options
112+ .getLogger ()
113+ .log (
114+ SentryLevel .DEBUG ,
115+ "Event captured from within a callback (beforeSend/beforeBreadcrumb/beforeSendLog) was dropped to prevent recursion." );
116+ return SentryId .EMPTY_ID ;
117+ }
118+
110119 if (hint == null ) {
111120 hint = new Hint ();
112121 }
@@ -957,6 +966,15 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint
957966 final @ Nullable ProfilingTraceData profilingTraceData ) {
958967 Objects .requireNonNull (transaction , "Transaction is required." );
959968
969+ if (SentryCallbackReentrancyGuard .isActive ()) {
970+ options
971+ .getLogger ()
972+ .log (
973+ SentryLevel .DEBUG ,
974+ "Transaction captured from within a callback was dropped to prevent recursion." );
975+ return SentryId .EMPTY_ID ;
976+ }
977+
960978 if (hint == null ) {
961979 hint = new Hint ();
962980 }
@@ -1281,6 +1299,15 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint
12811299 @ ApiStatus .Experimental
12821300 @ Override
12831301 public void captureLog (@ Nullable SentryLogEvent logEvent , @ Nullable IScope scope ) {
1302+ if (SentryCallbackReentrancyGuard .isActive ()) {
1303+ options
1304+ .getLogger ()
1305+ .log (
1306+ SentryLevel .DEBUG ,
1307+ "Log captured from within a callback was dropped to prevent recursion." );
1308+ return ;
1309+ }
1310+
12841311 if (logEvent != null && scope != null ) {
12851312 logEvent = processLogEvent (logEvent , scope .getEventProcessors ());
12861313 if (logEvent == null ) {
@@ -1595,6 +1622,7 @@ private void sortBreadcrumbsByDate(
15951622 final SentryOptions .BeforeSendCallback beforeSend = options .getBeforeSend ();
15961623 if (beforeSend != null ) {
15971624 try {
1625+ SentryCallbackReentrancyGuard .enter ();
15981626 event = beforeSend .execute (event , hint );
15991627 } catch (Throwable e ) {
16001628 options
@@ -1606,6 +1634,8 @@ private void sortBreadcrumbsByDate(
16061634
16071635 // drop event in case of an error in beforeSend due to PII concerns
16081636 event = null ;
1637+ } finally {
1638+ SentryCallbackReentrancyGuard .exit ();
16091639 }
16101640 }
16111641 return event ;
@@ -1617,6 +1647,7 @@ private void sortBreadcrumbsByDate(
16171647 options .getBeforeSendTransaction ();
16181648 if (beforeSendTransaction != null ) {
16191649 try {
1650+ SentryCallbackReentrancyGuard .enter ();
16201651 transaction = beforeSendTransaction .execute (transaction , hint );
16211652 } catch (Throwable e ) {
16221653 options
@@ -1628,6 +1659,8 @@ private void sortBreadcrumbsByDate(
16281659
16291660 // drop transaction in case of an error in beforeSend due to PII concerns
16301661 transaction = null ;
1662+ } finally {
1663+ SentryCallbackReentrancyGuard .exit ();
16311664 }
16321665 }
16331666 return transaction ;
@@ -1638,6 +1671,7 @@ private void sortBreadcrumbsByDate(
16381671 final SentryOptions .BeforeSendCallback beforeSendFeedback = options .getBeforeSendFeedback ();
16391672 if (beforeSendFeedback != null ) {
16401673 try {
1674+ SentryCallbackReentrancyGuard .enter ();
16411675 event = beforeSendFeedback .execute (event , hint );
16421676 } catch (Throwable e ) {
16431677 options
@@ -1646,6 +1680,8 @@ private void sortBreadcrumbsByDate(
16461680
16471681 // drop feedback in case of an error in beforeSend due to PII concerns
16481682 event = null ;
1683+ } finally {
1684+ SentryCallbackReentrancyGuard .exit ();
16491685 }
16501686 }
16511687 return event ;
@@ -1656,6 +1692,7 @@ private void sortBreadcrumbsByDate(
16561692 final SentryOptions .BeforeSendReplayCallback beforeSendReplay = options .getBeforeSendReplay ();
16571693 if (beforeSendReplay != null ) {
16581694 try {
1695+ SentryCallbackReentrancyGuard .enter ();
16591696 event = beforeSendReplay .execute (event , hint );
16601697 } catch (Throwable e ) {
16611698 options
@@ -1667,6 +1704,8 @@ private void sortBreadcrumbsByDate(
16671704
16681705 // drop event in case of an error in beforeSend due to PII concerns
16691706 event = null ;
1707+ } finally {
1708+ SentryCallbackReentrancyGuard .exit ();
16701709 }
16711710 }
16721711 return event ;
@@ -1677,6 +1716,7 @@ private void sortBreadcrumbsByDate(
16771716 options .getLogs ().getBeforeSend ();
16781717 if (beforeSendLog != null ) {
16791718 try {
1719+ SentryCallbackReentrancyGuard .enter ();
16801720 event = beforeSendLog .execute (event );
16811721 } catch (Throwable e ) {
16821722 options
@@ -1688,6 +1728,8 @@ private void sortBreadcrumbsByDate(
16881728
16891729 // drop event in case of an error in beforeSendLog due to PII concerns
16901730 event = null ;
1731+ } finally {
1732+ SentryCallbackReentrancyGuard .exit ();
16911733 }
16921734 }
16931735 return event ;
@@ -1699,6 +1741,7 @@ private void sortBreadcrumbsByDate(
16991741 options .getMetrics ().getBeforeSend ();
17001742 if (beforeSendMetric != null ) {
17011743 try {
1744+ SentryCallbackReentrancyGuard .enter ();
17021745 event = beforeSendMetric .execute (event , hint );
17031746 } catch (Throwable e ) {
17041747 options
@@ -1710,6 +1753,8 @@ private void sortBreadcrumbsByDate(
17101753
17111754 // drop event in case of an error in beforeSendMetric due to PII concerns
17121755 event = null ;
1756+ } finally {
1757+ SentryCallbackReentrancyGuard .exit ();
17131758 }
17141759 }
17151760 return event ;
0 commit comments