Skip to content

The sentry-trace header is not being sent with fetch requests #3547

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
6 of 10 tasks
taylorlapeyre opened this issue May 14, 2021 · 6 comments
Closed
6 of 10 tasks

The sentry-trace header is not being sent with fetch requests #3547

taylorlapeyre opened this issue May 14, 2021 · 6 comments

Comments

@taylorlapeyre
Copy link

Example event: https://sentry.io/organizations/project-wren/issues/2399314422/events/85d536082ab64b56bf22835c708d986f/

Package + Version

  • @sentry/browser: "^1.4.9",
  • @sentry/node: "^6.3.5"
  • @sentry/tracing: ""^6.3.5""
  • raven-js
  • raven-node (raven for node)
  • other:

Version:

1.4.9

Description

It seems like the sentry-trace header is not being sent in fetch requests that we send from our app's frontend. We construct our requests this way:

function generateHeaders() {
  const headers = new Headers({
    'Content-Type': 'application/json',
  });

  const token = getSessionToken();

  if (token) {
    headers.set('Authorization', `Bearer ${token}`);
  }

  // another internal header not relevant, 
  headers.set('...', 'something');

  return headers;
}


async function post(endpoint, body) {
  const request = new Request(`${API_URL}/${endpoint}`, {
    method: 'POST',
    headers: generateHeaders(),
    body: JSON.stringify(body),
  });

  const response = await fetch(request);

  if (contentType && contentType.includes('application/json')) {
    const responseBody = await response.json();
    return [response, responseBody];
  }

  return [response, null];
}

We aren't seeing any distributed tracing for our backend service for requests being initiated this way, and the sentry header is not present:

Screen Shot 2021-05-14 at 2 23 16 PM

Our Sentry init:

Sentry.init({
  dsn: '...'
  integrations: [
    new Integrations.BrowserTracing(),
    new SentryFullStory('project-wren'),
  ],
  environment: getReleaseStageFromURL(),
  release: window.appVersion,
  tracingOrigins: ['localhost', 'wren.co'],
  ignoreErrors: [
    'disguiseToken',
    'cancelled',
    'Illegal invocation',
    'Failed to load Stripe.js',
    'Non-Error promise rejection captured',
    'chunk',
  ],
  beforeSend(event) {
    const user = getStore().getState().user;
    if (event.exception) {
      Sentry.showReportDialog({
        eventId: event.event_id,
        user: {
          name: user.firstName,
          email: user.email,
        },
      });
    }

    return event;
  },

  // Set tracesSampleRate to 1.0 to capture 100%
  // of transactions for performance monitoring.
  // We recommend adjusting this value in production
  tracesSampleRate: 0.5,
});
@kamilogorek
Copy link
Contributor

There has to be an active transaction in order for sentry-trace header to be sent. You can try to call Sentry.getCurrentHub().getScope().getTransaction() just before you send an API request to see whether there's something to be even attached.

@bzeskis
Copy link

bzeskis commented Jun 7, 2021

Hi Taylor, have you managed to find a solution?

@taylorlapeyre
Copy link
Author

Hey @bzeskis, yes this can be closed!

@fliespl
Copy link

fliespl commented Dec 5, 2021

@taylorlapeyre do you mind sharing you solution? Currently struggling with same :) Pageload metrics are being sent, but later on XHR/Fetch requests are not.

@boukeversteegh
Copy link

boukeversteegh commented Jan 21, 2022

I'm having the same issue. I cannot find documentation that explains how I can configure sentry to keep tracing after the initial pageload.

Sentry.init({
  Vue,
  dsn: config.api.sentry.dsn,
  integrations: [
    new Integrations.BrowserTracing({
      routingInstrumentation: Sentry.vueRouterInstrumentation(router),
      tracingOrigins: [config.hosts.com, config.services.api.host],
    }),
  ],
  tracesSampleRate: 1.0,
})

When I look at the options in BrowserTracing, it implies that it will generate a new transaction automatically on each URL change, and that each transaction lasts at most 1 second.

However, only the very first API request will get a sentry-trace, and everything after doesn't.


Update: I found out the issue in my case is not 'first' vs 'subsequent' requests. My first request was done with window.fetch, whereas my follow up requests were done with an API client generated by swagger-codegen (typescript-fetch). Once I change my first request to use the API client as well, no traces are added even for the first request.

In short, there's an issue with tracing using typescript-fetch api clients with sentry, I may report an issue if I cannot solve it.

@boukeversteegh
Copy link

Potentially related issue: #4439

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants