Skip to content

fix: count exception filter and exception processor failures as callback_error, and stop dropping events when an SDK processor fails - #5688

Open
jamescrosswell wants to merge 4 commits into
mainfrom
fix/processor-isolation-5684
Open

jamescrosswell wants to merge 4 commits into
mainfrom
fix/processor-isolation-5684

Conversation

@jamescrosswell

@jamescrosswell jamescrosswell commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

Follow-up to #5607, part of #5634. This covers items 3 and 4 there. They share a fix, so they're in one PR.

Summary

  • Exception filters and exception processors get the same isolation as event processors. When an IExceptionFilter or ISentryEventExceptionProcessor throws, the SDK logs an error naming it, drops the event, and records callback_error. Before, the throw fell through to CaptureEvent's catch-all. That dropped the event, logged a generic message and counted nothing.
  • A failing SDK processor no longer counts as the user's callback failing. SDK-owned event, exception and transaction processors implement a new internal ISdkProcessor marker. When one throws, the SDK logs the error and runs the remaining processors, as fix(core): [Callback Errors 3] Drop failed processor data sentry-java#6142 does. That's right for an SDK bug: the user's data isn't dropped, and the failure doesn't show up in their Stats as their own callback.

Notes for review

  • Behaviour change: since 6.12.0, a throwing SDK processor dropped the event or transaction and recorded callback_error. Now it's sent, without whatever that processor would have added.
  • The stack trace factory can be supplied by the user, and it's called from inside MainExceptionProcessor and MainSentryEventProcessor. Both calls now catch a failure there and log it. The event keeps its exception type, message and enrichment, and loses only the stack trace.
  • DelegateEventProcessor and DelegateTransactionProcessor are deliberately not marked. They wrap the user's own lambdas (scope.AddEventProcessor(Func<…>)), and a test covers this.
  • The two Entity Framework exception processors are public. Implementing an internal interface leaves their public API, and the approval snapshots, unchanged. A user subclass inherits the marker, as in Java.
  • sentry-unity's own processors aren't marked. Sentry.Unity already has InternalsVisibleTo, so it can opt in later.

Closes #5684
Closes #5685

🤖 Generated with Claude Code

…ack_error, and stop dropping events when an SDK processor fails

A throwing IExceptionFilter or ISentryEventExceptionProcessor now logs an
error naming it, drops the event and records callback_error, rather than
falling through to CaptureEvent's catch-all.

SDK-owned event, exception and transaction processors implement an
internal ISdkProcessor marker. When one throws, the error is logged and
processing continues, so an SDK bug neither drops the user's data nor
shows up in their Stats as their own callback failing.

Closes #5684
Closes #5685

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@codecov

codecov Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 75.22%. Comparing base (8973c9b) to head (f2796cf).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #5688      +/-   ##
==========================================
+ Coverage   75.21%   75.22%   +0.01%     
==========================================
  Files         515      516       +1     
  Lines       18989    19022      +33     
  Branches     3693     3698       +5     
==========================================
+ Hits        14282    14310      +28     
- Misses       3852     3857       +5     
  Partials      855      855              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread src/Sentry/Internal/ISdkProcessor.cs Outdated
@jamescrosswell

Copy link
Copy Markdown
Collaborator Author

@ric-oliv looks like a lot to review but it's mostly just adding the marker attribute everywhere... then a few short lines checking for that marker attribute.

@jamescrosswell
jamescrosswell marked this pull request as ready for review October 7, 2026 22:45
@github-actions github-actions Bot added the risk: medium PR risk score: medium label Oct 7, 2026
Comment thread src/Sentry/Internal/MainExceptionProcessor.cs
Comment thread src/Sentry/Internal/MainSentryEventProcessor.cs
ISentryStackTraceFactory can be user-supplied. Now that a failing SDK
processor no longer drops the event, a throw from the factory would send
an event with no SentryExceptions (MainExceptionProcessor) or without the
enricher's SDK, environment and OS/runtime context (MainSentryEventProcessor).
Catch it at both call sites, log it, and omit only the stack trace.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Comment thread src/Sentry/SentryClient.cs Outdated
Comment thread test/Sentry.Tests/SentryClientTests.cs
ApplyExceptionFilters now catches only the filter call itself, logs and
records callback_error there, and reports the failure through an out
parameter. SDK code in the filtering path is no longer caught and
miscounted as the user's callback_error; it reaches CaptureEvent's
catch-all as before.

Also cover a throwing scope.AddTransactionProcessor lambda, so marking
DelegateTransactionProcessor as an SDK processor would fail a test.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk: medium PR risk score: medium

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Don't report SDK event processor failures as the user's callback_error Isolate IExceptionFilter and ISentryEventExceptionProcessor failures

2 participants