What is @sentry/react?
The @sentry/react package is designed for error monitoring and performance tracking in React applications. It provides a comprehensive set of tools to capture exceptions, track performance issues, and improve the overall reliability of React applications. By integrating Sentry into a React project, developers can gain insights into errors and performance bottlenecks, allowing for quicker debugging and optimization.
What are @sentry/react's main functionalities?
Error Boundary
This feature automatically catches JavaScript errors anywhere in the child component tree of the Error Boundary and logs them to Sentry. It also displays a fallback UI instead of the component tree that crashed.
import React from 'react';
import * as Sentry from '@sentry/react';
const MyApp = () => (
<Sentry.ErrorBoundary fallback={'An error has occurred'}>
<YourApp />
</Sentry.ErrorBoundary>
);
Performance Monitoring
Enables performance monitoring in your React application. By setting the `tracesSampleRate` to a value between 0 and 1, you can control the percentage of transactions sent to Sentry for performance analysis.
import * as Sentry from '@sentry/react';
Sentry.init({
dsn: 'YOUR_DSN',
tracesSampleRate: 1.0,
});
Custom Error Tracking
Allows for manual reporting of errors or exceptions to Sentry, giving developers the flexibility to capture specific issues that may not be automatically detected.
import * as Sentry from '@sentry/react';
Sentry.captureException(new Error('This is my custom error.'));
Other packages similar to @sentry/react
logrocket
LogRocket is a frontend application monitoring solution that provides session replay, performance monitoring, and error tracking. While it offers similar error tracking capabilities to @sentry/react, LogRocket distinguishes itself with its session replay feature, allowing developers to see exactly what users saw when an error occurred.
bugsnag
Bugsnag offers error monitoring and application stability management for various programming languages and frameworks, including React. Compared to @sentry/react, Bugsnag emphasizes application stability metrics and provides detailed error grouping and analysis, making it easier to prioritize and fix critical errors.
Official Sentry SDK for ReactJS
Links
General
This package is a wrapper around @sentry/browser
, with added functionality related to React. All methods available in
@sentry/browser
can be imported from @sentry/react
.
To use this SDK, call Sentry.init(options)
before you mount your React component.
import React from 'react';
import { createRoot } from 'react-dom/client';
import * as Sentry from '@sentry/react';
Sentry.init({
dsn: '__DSN__',
});
const container = document.getElementById(“app”);
const root = createRoot(container);
root.render(<App />);
React 19
Starting with React 19, the createRoot
and hydrateRoot
methods expose error hooks that can be used to capture errors
automatically. Use the Sentry.reactErrorHandler
function to capture errors in the error hooks you are interested in.
const container = document.getElementById(“app”);
const root = createRoot(container, {
onUncaughtError: Sentry.reactErrorHandler((error, errorInfo) => {
console.warn('Uncaught error', error, errorInfo.componentStack);
}),
onCaughtError: Sentry.reactErrorHandler(),
onRecoverableError: Sentry.reactErrorHandler(),
});
root.render(<App />);
If you want more finely grained control over error handling, we recommend only adding the onUncaughtError
and
onRecoverableError
hooks and using an ErrorBoundary
component instead of the onCaughtError
hook.
ErrorBoundary
@sentry/react
exports an ErrorBoundary component that will automatically send Javascript errors from inside a
component tree to Sentry, and set a fallback UI.
app.js
import React from 'react';
import * as Sentry from '@sentry/react';
function FallbackComponent() {
return <div>An error has occurred</div>;
}
class App extends React.Component {
render() {
return (
<Sentry.ErrorBoundary fallback={FallbackComponent} showDialog>
<OtherComponents />
</Sentry.ErrorBoundary>
);
}
}
export default App;
Profiler
@sentry/react
exports a Profiler component that leverages the tracing features to add React-related spans to
transactions. If tracing is not enabled, the Profiler component will not work. The Profiler tracks component mount,
render duration and updates.
app.js
import React from 'react';
import * as Sentry from '@sentry/react';
class App extends React.Component {
render() {
return (
<FancyComponent>
<InsideComponent someProp={2} />
<AnotherComponent />
</FancyComponent>
);
}
}
export default Sentry.withProfiler(App);
9.0.0
Version 9.0.0
marks a release of the Sentry JavaScript SDKs that contains breaking changes.
The goal of this release is to trim down on unused and potentially confusing APIs, prepare the SDKs for future framework versions to build deeper instrumentation, and remove old polyfills to reduce the packages' size.
How To Upgrade
Please carefully read through the migration guide in the Sentry docs on how to upgrade from version 8 to version 9.
Make sure to select your specific platform/framework in the top left corner: https://docs.sentry.io/platforms/javascript/migration/v8-to-v9/
A comprehensive migration guide outlining all changes for all the frameworks can be found within the Sentry JavaScript SDK Repository: https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md
Breaking Changes
- doc(deno)!: Make Deno v2 the minimum supported version (#15085)
- feat!: Bump typescript to
~5.0.0
(#14758) - feat!: Drop
nitro-utils
package (#14998) - feat!: Only collect ip addresses with
sendDefaultPii: true
(#15084) - feat!: Remove
autoSessionTracking
option (#14802) - feat!: Remove
enableTracing
(#15078) - feat!: Remove
getCurrentHub()
, Hub
, and getCurrentHubShim()
(#15122) - feat!: Remove
spanId
from propagation context (#14733) - feat!: Remove deprecated and unused code (#15077)
- feat!: Remove metrics API from the JS SDK (#14745)
- feat!: Require Node
>=18
as minimum supported version (#14749) - feat(astro)!: Respect user-specified source map setting (#14941)
- feat(browser)!: Remove
captureUserFeedback
method (#14820) - feat(build)!: Drop pre-ES2020 polyfills (#14882)
- feat(core)!: Add
normalizedRequest
to samplingContext
(#14902) - feat(core)!: Always use session from isolation scope (#14860)
- feat(core)!: Pass root spans to
beforeSendSpan
and disallow returning null
(#14831) - feat(core)!: Remove
BAGGAGE_HEADER_NAME
export (#14785) - feat(core)!: Remove
TransactionNamingScheme
type (#14865) - feat(core)!: Remove
addOpenTelemetryInstrumentation
method (#14792) - feat(core)!: Remove
arrayify
method (#14782) - feat(core)!: Remove
debugIntegration
and sessionTimingIntegration
(#14747) - feat(core)!: Remove
flatten
method (#14784) - feat(core)!: Remove
getDomElement
method (#14797) - feat(core)!: Remove
makeFifoCache
method (#14786) - feat(core)!: Remove
memoBuilder
export & WeakSet
fallback (#14859) - feat(core)!: Remove
transactionContext
from samplingContext
(#14904) - feat(core)!: Remove
urlEncode
method (#14783) - feat(core)!: Remove deprecated
Request
type (#14858) - feat(core)!: Remove deprecated request data methods (#14896)
- feat(core)!: Remove standalone
Client
interface & deprecate BaseClient
(#14800) - feat(core)!: Remove validSeverityLevels export (#14765)
- feat(core)!: Stop accepting
event
as argument for recordDroppedEvent
(#14999) - feat(core)!: Stop setting user in
requestDataIntegration
(#14898) - feat(core)!: Type sdkProcessingMetadata more strictly (#14855)
- feat(core)!: Update
hasTracingEnabled
to consider empty trace config (#14857) - feat(core)!: Update
requestDataIntegration
handling (#14806) - feat(deno)!: Remove deno prepack (#14829)
- feat(ember)!: Officially drop support for ember
<=3.x
(#15032) - feat(nestjs)!: Move
nestIntegration
into nest sdk and remove setupNestErrorHandler
(#14751) - feat(nestjs)!: Remove
@WithSentry
decorator (#14762) - feat(nestjs)!: Remove
SentryService
(#14759) - feat(nextjs)!: Don't rely on Next.js Build ID for release names (#14939)
- feat(nextjs)!: Remove
experimental_captureRequestError
(#14607) - feat(nextjs)!: Respect user-provided source map generation settings (#14956)
- feat(node)!: Add support for Prisma v6 and drop v5 support (#15120)
- feat(node)!: Avoid http spans by default for custom OTEL setups (#14678)
- feat(node)!: Collect request sessions via HTTP instrumentation (#14658)
- feat(node)!: Remove
processThreadBreadcrumbIntegration
(#14666) - feat(node)!: Remove fine grained
registerEsmLoaderHooks
(#15002) - feat(opentelemetry)!: Exclusively pass root spans through sampling pipeline (#14951)
- feat(pinia)!: Include state of all stores in breadcrumb (#15312)
- feat(react)!: Raise minimum supported TanStack Router version to
1.63.0
(#15030) - feat(react)!: Remove deprecated
getNumberOfUrlSegments
method (#14744) - feat(react)!: Remove deprecated react router methods (#14743)
- feat(react)!: Update
ErrorBoundary
componentStack
type (#14742) - feat(remix)!: Drop support for Remix v1 (#14988)
- feat(remix)!: Remove
autoInstrumentRemix
option (#15074) - feat(solidstart)!: Default to
--import
setup and add autoInjectServerSentry
(#14862) - feat(solidstart)!: No longer export
sentrySolidStartVite
(#15143) - feat(solidstart)!: Respect user-provided source map setting (#14979)
- feat(svelte)!: Disable component update tracking by default (#15265)
- feat(sveltekit)!: Drop support for SvelteKit @1.x (#15037)
- feat(sveltekit)!: Remove
fetchProxyScriptNonce
option (#15123) - feat(sveltekit)!: Respect user-provided source map generation settings (#14886)
- feat(utils)!: Remove
@sentry/utils
package (#14830) - feat(vue)!: Remove configuring Vue tracing options anywhere else other than through the
vueIntegration
's tracingOptions
option (#14856) - feat(vue/nuxt)!: No longer create
"update"
spans for component tracking by default (#14602) - fix(node)!: Fix name of
vercelAIIntegration
to VercelAI
(#15298) - fix(vue)!: Remove
logError
from vueIntegration
(#14958) - ref!: Don't polyfill optional chaining and nullish coalescing (#14603)
- ref(core)!: Cleanup internal types, including
ReportDialogOptions
(#14861) - ref(core)!: Mark exceptions from
captureConsoleIntegration
as handled: true
by default (#14734) - ref(core)!: Move
shutdownTimeout
option type from core to node (#15217) - ref(core)!: Remove
Scope
type interface in favor of using Scope
class (#14721) - ref(core)!: Remove backwards compatible SentryCarrier type (#14697)
Other Changes
- chore(browser): Export ipAddress helpers for use in other SDKs (#15079)
- deps(node): Bump
import-in-the-middle
to 1.12.0
(#14796) - feat(aws): Rename AWS lambda layer name to
SentryNodeServerlessSDKv9
(#14927) - feat(aws-serverless): Upgrade OTEL deps (#15091)
- feat(browser): Set
user.ip_address
explicitly to {{auto}}
(#15008) - feat(core): Add
inheritOrSampleWith
helper to traceSampler
(#15277) - feat(core): Emit client reports for unsampled root spans on span start (#14936)
- feat(core): Rename
hasTracingEnabled
to hasSpansEnabled
(#15309) - feat(core): Streamline
SpanJSON
type (#14693) - feat(deno): Don't bundle
@sentry/deno
(#15014) - feat(deno): Don't publish to
deno.land
(#15016) - feat(deno): Stop inlining types from core (#14729)
- feat(deps): Bump @opentelemetry/instrumentation-amqplib from 0.45.0 to 0.46.0 (#14835)
- feat(deps): Bump @opentelemetry/instrumentation-aws-lambda from 0.49.0 to 0.50.0 (#14833)
- feat(deps): Bump @opentelemetry/instrumentation-express from 0.46.0 to 0.47.0 (#14834)
- feat(deps): Bump @opentelemetry/instrumentation-mysql2 from 0.44.0 to 0.45.0 (#14836)
- feat(deps): Bump @opentelemetry/propagation-utils from 0.30.14 to 0.30.15 (#14832)
- feat(deps): bump @opentelemetry/context-async-hooks from 1.29.0 to 1.30.0 (#14869)
- feat(deps): bump @opentelemetry/instrumentation-generic-pool from 0.42.0 to 0.43.0 (#14870)
- feat(deps): bump @opentelemetry/instrumentation-knex from 0.43.0 to 0.44.0 (#14872)
- feat(deps): bump @opentelemetry/instrumentation-mongodb from 0.50.0 to 0.51.0 (#14871)
- feat(deps): bump @opentelemetry/instrumentation-tedious from 0.17.0 to 0.18.0 (#14868)
- feat(deps): bump @sentry/cli from 2.39.1 to 2.41.1 (#15173)
- feat(flags): Add Statsig browser integration (#15319)
- feat(gatsby): Preserve user-provided source map settings (#15006)
- feat(nestjs): Remove
SentryTracingInterceptor
, SentryGlobalGraphQLFilter
, SentryGlobalGenericFilter
(#14761) - feat(nextjs): Directly forward
sourcemaps.disable
to webpack plugin (#15109) - feat(node): Add
processSessionIntegration
(#15081) - feat(node): Add missing
vercelAIIntegration
export (#15318) - feat(node): Capture exceptions from
worker_threads
(#15105) - feat(nuxt): Add enabled to disable Sentry module (#15337)
- feat(nuxt): add
silent
, errorHandler
, release
to SourceMapsOptions
(#15246) - feat(profiling-node): Use
@sentry-internal/node-cpu-profiler
(#15208) - feat(replay): Update fflate to 0.8.2 (#14867)
- feat(solidstart): Add
autoInjectServerSentry: 'experimental_dynamic-import
(#14863) - feat(sveltekit): Only inject fetch proxy script for SvelteKit < 2.16.0 (#15126)
- feat(user feedback): Adds draw tool for UF screenshot annotations (#15062)
- feat(user feedback): Adds toolbar for cropping and annotating (#15282)
- feat: Avoid class fields all-together (#14887)
- feat: Only emit
__esModule
properties in CJS modules when there is a default export (#15018) - feat: Pass
parentSampleRate
to tracesSampler
(#15024) - feat: Propagate and use a sampling random (#14989)
- fix(browser): Remove
browserPerformanceTimeOrigin
side-effects (#14025) - fix(core): Ensure debugIds are applied to all exceptions in an event (#14881)
- fix(core): Fork scope if custom scope is passed to
startSpanManual
(#14901) - fix(core): Fork scope if custom scope is passed to
startSpan
(#14900) - fix(core): Only fall back to
sendDefaultPii
for IP collection in requestDataIntegration
(#15125) - fix(nextjs): Flush with
waitUntil
in captureRequestError
(#15146) - fix(nextjs): Use batched devserver symbolication endpoint (#15335)
- fix(node): Don't leak
__span
property into breadcrumbs (#14798) - fix(node): Fix sample rand propagation for negative sampling decisions (#15045)
- fix(node): Missing
release
from ANR sessions (#15138) - fix(node): Set the correct fallback URL fields for outgoing https requests if they are not defined (#15316)
- fix(nuxt): Detect Azure Function runtime for flushing with timeout (#15288)
- fix(react): From location can be undefined in Tanstack Router Instrumentation (#15235)
- fix(react): Import default for hoistNonReactStatics (#15238)
- fix(react): Support lazy-loaded routes and components. (#15039)
- fix(solidstart): Do not copy release-injection map file (#15302)
- ref(browser): Improve active span handling for
browserTracingIntegration
(#14959) - ref(browser): Improve setting of propagation scope for navigation spans (#15108)
- ref(browser): Skip browser extension warning in non-debug builds (#15310)
- ref(browser): Update
supportsHistory
check & history usage (#14696) - ref(core): Ensure non-recording root spans have frozen DSC (#14964)
- ref(core): Log debug message when capturing error events (#14701)
- ref(core): Move log message about invalid sample rate (#15215)
- ref(node): Streamline check for adding performance integrations (#15021)
- ref(react): Adapt tanstack router type (#15241)
- ref(svelte): Remove SvelteKit detection (#15313)
- ref(sveltekit): Clean up sub-request check (#15251)
Work in this release was contributed by @aloisklink, @arturovt, @aryanvdesh, @benjick, @chris-basebone, @davidturissini, @GrizliK1988, @jahands, @jrandolf, @kunal-511, @maximepvrt, @maxmaxme, @mstrokin, @nathankleyn, @nwalters512, @tannerlinsley, @tjhiggins, and @Zen-cronic. Thank you for your contributions!