Skip to content

TRPC Middleware Context not Working as Expected with Batch Requests #16262

Closed

Description

@17Amir17

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/nextjs

SDK Version

9.17.0

Framework Version

React Next 15.3.1

Link to Sentry event

https://amir-lf.sentry.io/issues/41286609/?project=4509151724830800&query=is%3Aunresolved%20issue.priority%3A%5Bhigh%2C%20medium%5D&referrer=issue-stream&stream_index=0

Reproduction Example/SDK Setup

Create a repo with minimal code that reproduces this https://github.com/17Amir17/SentryBug
Repo contains a simple nextjs app with trpc and sentry

One route called getCats this route accepts two params one which when true throws an exception and the the other contains an id which gets added as a tag - https://github.com/17Amir17/SentryBug/blob/main/src/pages/api/trpc/%5Btrpc%5D.ts

Steps to Reproduce

There are two problem that I see, to reproduce the first

  1. Click "throw error" button
  2. Two calls to the same trpc route will be called in batch with different parameters
  3. A tag is added with the cat id
  4. And error is thrown
  5. 1 sentry event is created
  6. Tag does not match the context

To reproduce the second

  1. Click fetch button
  2. Two calls to the same trpc route will be called in batch with different parameters
  3. A tag is added with the cat id
  4. 2 sentry events are created
  5. Tag does not match context

Expected Result

For both issues I'd expect to see two events and for the context to match the tag

Actual Result

For the first issue the tags do not match the context and there is only 1 event created

For the second issue the there are two events but the tag does not match the context

Image

Activity

  1. moved this to Waiting for: Product Owner in GitHub Issues with 👀 3on May 12, 2025
  2. andreiborza commented on May 14, 2025

    @andreiborza
    Member

    Hi @17Amir17, thanks for filing this.

    This happens because there's no automatic scope forking going on for the middleware. We're looking into possible workarounds/solutions.

  3. moved this from Waiting for: Product Owner to No status in GitHub Issues with 👀 3on May 14, 2025
  4. andreiborza commented on May 14, 2025

    @andreiborza
    Member

    Because there's no automatic scope forking, you'd have to fork your own scope using for example the Sentry.withScope api.

    Your trpc api would have to look something like this:

    ...
        .query(async ({ input }) => {
          return Sentry.withScope(async (scope) => {
            scope.setTag("catRequestId", input.catRequestId);
    
            await new Promise((resolve) => setTimeout(resolve, 1000));
            if (input.shouldThrow) {
                throw new Error("Error triggered by shouldThrow in getCats");
            }
            Sentry.captureMessage("getCats success");
            return ["Whiskers", "Mittens", "Shadow"];
          });
        }),
    });

    Now, this works well for the second case, but it does not work for the first case because scope data is picked up when the error is captured, which happens in our trpc middleware. By then, the scope we fork ourselves is already gone and so is its data.

    If you want to solve the first case, you'd have to manually try/catch throwing code and capture the error manually using Sentry.captureException:

    ...
        .query(async ({ input }) => {
          return Sentry.withScope(async (scope) => {
            scope.setTag("catRequestId", input.catRequestId);
    
            await new Promise((resolve) => setTimeout(resolve, 1000));
            if (input.shouldThrow) {
              try {
                throw new Error("Error triggered by shouldThrow in getCats");
              } catch (error) {
                Sentry.captureException(error);
              }
    
              return;
            }
            Sentry.captureMessage("getCats success");
            return ["Whiskers", "Mittens", "Shadow"];
          });
        }),

    Hope this helps.

  5. added a commit that references this issue on May 14, 2025
    3b34dca
  6. github-actions commented on May 19, 2025

    @github-actions
    Contributor

    A PR closing this issue has just been released 🚀

    This issue was referenced by PR #16296, which was included in the 9.20.0 release.

  7. andreiborza commented on May 19, 2025

    @andreiborza
    Member

    @17Amir17 this should now work out of the box without having to fork the scope yourself.

  8. 17Amir17 commented on May 19, 2025

    @17Amir17
    Author

    BEAST thanks <3

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

Metadata

Metadata

Assignees

No one assigned

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions