Automatic Instrumentation

Learn what spans are captured after tracing is enabled.

@sentry/nextjs provides a BrowserTracing integration to add automatic instrumentation for monitoring the performance of browser applications, which is enabled by default once you set up tracing in your app. Further, the SDK will automatically enable error collection and tracing in your API routes and Next.js Data Fetchers.

The BrowserTracing integration creates a new transaction for each pageload and navigation event, and creates a child span for every XMLHttpRequest or fetch request that occurs while those transactions are open. Additionally, the SDK creates transactions for all requests to API routes and Next.js data fetchers. Learn more about traces, transactions, and spans.

To enable tracing, simply set either a tracesSampleRate or a tracesSampler in your SDK configuration options, as detailed in Set Up Tracing.

Though the BrowserTracing integration is automatically enabled in @sentry/nextjs, in order to customize its options you must include it in your Sentry.init in instrumentation-client.js:

Copied
import * as Sentry from "@sentry/nextjs";

Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",

  integrations: [Sentry.browserTracingIntegration()],

  tracesSampleRate: 1.0,
  // Set `tracePropagationTargets` to control for which URLs distributed tracing should be enabled
  tracePropagationTargets: [
    "localhost",
    /^\//,
    /^https:\/\/yourserver\.io\/api/,
  ],
});

Supported options:

tracePropagationTargets

TypeArray<string | RegExp>
Default['localhost', /^\/$/]

A list of strings and regular expressions. The JavaScript SDK will attach the sentry-trace and baggage headers to all outgoing XHR/fetch requests whose destination contains a string in the list or matches a regex in the list. If your frontend is making requests to a different domain, you'll need to add it there to propagate the sentry-trace and baggage headers to the backend services, which is required to link spans together as part of a single trace.

The tracePropagationTargets option matches the entire request URL, not just the domain. Using stricter regex to match certain parts of the URL ensures that requests don't unnecessarily have additional headers attached.

The default value of tracePropagationTargets is ['localhost', /^\//]. This means that by default, tracing headers are only attached to requests that contain localhost in their URL or requests whose URL starts with a '/' (for example GET /api/v1/users).

For example:

  • A frontend application is served from example.com.
  • A backend service is served from api.example.com.
  • During development, the backend service is served from localhost.
  • The frontend application makes API calls to the backend.
  • Set the tracePropagationTargets option to ["localhost", /^https:\/\/api\.example\.com/].
  • Now outgoing XHR/fetch requests to your backend service will get the sentry-trace and baggage headers attached.
Copied
Sentry.init({
  // ...
  integrations: [Sentry.browserTracingIntegration()],

  // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
  tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/],
});

You will need to configure your web server CORS to allow the sentry-trace and baggage headers. The configuration might look like "Access-Control-Allow-Headers: sentry-trace" and "Access-Control-Allow-Headers: baggage", but it depends on your set up. If you do not allow the two headers, the request might be blocked.

beforeStartSpan

Type(span: Span) => Span

beforeStartSpan is called at the start of every pageload or navigation span, and is passed an object containing data about the span which will be started. With beforeStartSpan you can modify that data.

Copied
Sentry.init({
  // ...
  integrations: [
    Sentry.browserTracingIntegration({
      beforeStartSpan: (context) => {
        return {
          ...context,
          attributes: {
            ...context.attributes,
            resultFormat: "legacy",
          },
        };
      },
    }),
  ],
});

shouldCreateSpanForRequest

Type(url: string) => boolean

This function can be used to filter out unwanted spans such as XHRs running health checks or something similar.

Copied
Sentry.init({
  // ...
  integrations: [
    Sentry.browserTracingIntegration({
      shouldCreateSpanForRequest: (url) => {
        // Do not create spans for outgoing requests to a `/health/` endpoint
        return !url.match(/\/health\/?$/);
      },
    }),
  ],
});

By default, spans will be created for all requests.

idleTimeout

Typenumber
Default1000

The idle time, measured in ms, to wait until the pageload/navigation span will be finished, if there are no unfinished spans. The pageload/navigation span will use the end timestamp of the last finished span as the endtime.

finalTimeout

Typenumber
Default30000

The maximum duration of the pageload/naivgation span, measured in ms. If the duration exceeds the finalTimeout value, it will be finished.

childSpanTimeout

Typenumber
Default15000

The time, measured in ms, that a child span may run. If the last started child span is still running for more than this time, the pageload/navigation span will be finished.

instrumentNavigation

Typeboolean
Defaulttrue

This flag enables or disables creation of navigation span on history changes.

instrumentPageLoad

Typeboolean
Defaulttrue

This flag enables or disables creation of pageload span on first pageload.

markBackgroundSpans

Typeboolean
Defaulttrue

This option flags pageload/navigation spans when tabs are moved to the background with "cancelled". Because browser background tab timing is not suited for precise measurements of operations and can affect your statistics in nondeterministic ways, we recommend that this option be enabled.

enableLongTask

Typeboolean
Defaulttrue

This option determines whether spans for long tasks automatically get created.

enableLongAnimationFrame

Available since8.18.0
Typeboolean
Defaulttrue

This option determines whether spans for long animation frames get created automatically. If both enableLongAnimationFrame and enableLongTask are enabled, Sentry will send long animation frames and fallback to long tasks (if long animation frames aren't supported by the browser).

enableInp

Available since7.104.0
Typeboolean
Defaulttrue

This option determines whether interactions spans automatically get created when an Interaction to Next Paint (INP) event is detected. Interactions are scored and surfaced in the Web Vitals module.

The default is true starting with SDK version 8.x and false in 7.x.

Copied
Sentry.init({
  // ...
  integrations: [
    Sentry.browserTracingIntegration({
      enableInp: true,
    }),
  ],
});

interactionsSampleRate

Typenumber
Default1.0

This option determines the sample rate of INP spans. interactionsSampleRate is applied on top of tracesSampleRate, therefore if your interactionsSampleRate is set to 0.5 and your tracesSampleRate is set to 0.1, the outcome will be 0.05.

The default is 1.0.

ignoreResourceSpans

Available since9.23.0
TypeArray<string>
Default[]

This option determines which categories or resource spans should be ignored. The resource categories are the span ops (for example resource.script or resource.img)

Copied
Sentry.init({
  // ...
  integrations: [
    Sentry.browserTracingIntegration({
      ignoreResourceSpans: ['resource.css', 'resource.script'],
    }),
  ],
});

By default, all resource spans are captured.

ignorePerformanceApiSpans

Available since9.23.0
TypeArray<string | RegExp>
Default[]

This option allows you to ignore certain spans created from the following browser Performance APIs:

Any mark or measure entries matching the strings or regular expressions in the passed array will not be emitted as mark or measure spans.

Copied
Sentry.init({
  integrations: [
    Sentry.browserTracingIntegration({
      ignorePerformanceApiSpans: ['myMeasurement', /myMark/],
    }),
  ],
});

// no spans will not be created for these:
performance.mark('myMark');
performance.measure('myMeasurement');

// spans will be created for these:
performance.mark('authenticated');
performance.measure('input-duration', ...);

By default, all performance API spans are captured.

Was this helpful?
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").