Skip to content

Browser Profiling | Sentry for Next.js

Source URL: https://docs.sentry.io/platforms/javascript/guides/nextjs/profiling/browser

Browser Profiling is currently in beta. Beta features are still in progress and may have bugs. We recognize the irony.

Profiling captures function-level data from your production code to enable you to fine-tune your app’s performance. It tracks what’s being called, how often, and where. In the browser, this helps you pinpoint causes of UI jank, understand why metrics like Interaction to Next Paint (INP) are slow, or identify long tasks blocking repaints and causing frame drops.

Browser Profiling uses the JS Self-Profiling API, currently only available in Chromium-based browsers (Chrome, Edge). Profiles will only include data from these browsers.

Requirements: @sentry/nextjs SDK version 10.27.0+ (or 7.60.0+ for deprecated transaction-based profiling)

Terminal window
npm install @sentry/nextjs --save

Your server must return Document-Policy: js-profiling in response headers.

In Next.js you can configure document response headers via the headers option in next.config.js:

next.config.mjs

export default withSentryConfig({
async headers() {
return [
{
source: "/:path*",
headers: [
{
key: "Document-Policy",
value: "js-profiling",
},
],
},
];
},
// ... other Next.js config options
});

instrumentation-client.js|ts

import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: "___PUBLIC_DSN___",
integrations: [
// Add browser profiling integration to the list of integrations
Sentry.browserProfilingIntegration(),
],
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for tracing.
// We recommend adjusting this value in production
tracesSampleRate: 1.0,
// Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/],
// Set profileSessionSampleRate to 1.0 to profile during every session.
// The decision, whether to profile or not, is made once per session (when the SDK is initialized).
profileSessionSampleRate: 1.0,
});
ModeDescriptionUse When
Manual (default)You control when profiling runsProfiling specific user flows or interactions
TraceProfiler runs automatically with active spansYou want profiles attached to all traced operations

Start and stop the profiler around code you want to profile:

Sentry.uiProfiler.startProfiler();
// Code here will be profiled
Sentry.uiProfiler.stopProfiler();

Profiles automatically attach to spans. Enable by setting profileLifecycle: "trace":

Sentry.init({
dsn: "___PUBLIC_DSN___",
integrations: [
Sentry.browserTracingIntegration(),
Sentry.browserProfilingIntegration(),
],
tracesSampleRate: 1.0,
profileSessionSampleRate: 1.0,
profileLifecycle: "trace",
});
Sentry ProfilingChrome DevTools
EnvironmentProduction (real users)Local development
Sampling rate100Hz (10ms period)1000Hz (1ms period)
Source mapsDeobfuscated function namesMinified names
Data scopeAggregated across usersSingle session

Troubleshooting

Chrome DevTools shows “Profiling Overhead”

When browserProfilingIntegration is enabled, Chrome DevTools incorrectly attributes rendering work as profiling overhead. Disable the integration when using DevTools locally.

Profiles only from Chrome users

This is expected. The JS Self-Profiling API is currently only implemented in Chromium browsers. Consider this bias when analyzing data.