Official Sentry SDK for Angular
Links
Angular Version Compatibility
This SDK officially supports Angular 15 to 17.
If you're using an older Angular version please check the
compatibility table in the docs.
If you're using an older version of Angular and experience problems with the Angular SDK, we recommend downgrading the
SDK to version 7.x. Please note that we don't provide any support for Angular versions below 10.
General
This package is a wrapper around @sentry/browser
, with added functionality related to Angular. All methods available
in @sentry/browser
can be imported from @sentry/angular
.
To use this SDK, call Sentry.init(options)
before you bootstrap your Angular application.
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { init } from '@sentry/angular';
import { AppModule } from './app/app.module';
init({
dsn: '__DSN__',
});
enableProdMode();
platformBrowserDynamic()
.bootstrapModule(AppModule)
.then(success => console.log(`Bootstrap success`))
.catch(err => console.error(err));
ErrorHandler
@sentry/angular
exports a function to instantiate an ErrorHandler provider that will automatically send Javascript
errors captured by the Angular's error handler.
import { NgModule, ErrorHandler } from '@angular/core';
import { createErrorHandler } from '@sentry/angular';
@NgModule({
providers: [
{
provide: ErrorHandler,
useValue: createErrorHandler({
showDialog: true,
}),
},
],
})
export class AppModule {}
Additionally, createErrorHandler
accepts a set of options that allows you to configure its behavior. For more details
see ErrorHandlerOptions
interface in src/errorhandler.ts
.
Tracing
@sentry/angular
exports a Trace Service, Directive and Decorators that leverage the tracing features to add
Angular-related spans to transactions. If tracing is not enabled, this functionality will not work. The SDK's
TraceService
itself tracks route changes and durations, while directive and decorators are tracking components
initializations.
Install
Registering a Trace Service is a 3-step process.
- Register and configure the
BrowserTracing
integration, including custom Angular routing instrumentation:
import { init, browserTracingIntegration } from '@sentry/angular';
init({
dsn: '__DSN__',
integrations: [browserTracingIntegration()],
tracePropagationTargets: ['localhost', 'https://yourserver.io/api'],
tracesSampleRate: 1,
});
- Register
SentryTrace
as a provider in Angular's DI system, with a Router
as its dependency:
import { NgModule } from '@angular/core';
import { Router } from '@angular/router';
import { TraceService } from '@sentry/angular';
@NgModule({
providers: [
{
provide: TraceService,
deps: [Router],
},
],
})
export class AppModule {}
- Either require the
TraceService
from inside AppModule
or use APP_INITIALIZER
to force-instantiate Tracing.
@NgModule({
})
export class AppModule {
constructor(trace: TraceService) {}
}
or
import { APP_INITIALIZER } from '@angular/core';
@NgModule({
providers: [
{
provide: APP_INITIALIZER,
useFactory: () => () => {},
deps: [TraceService],
multi: true,
},
],
})
export class AppModule {}
Use
To track Angular components as part of your transactions, you have 3 options.
TraceDirective: used to track a duration between OnInit
and AfterViewInit
lifecycle hooks in template:
import { TraceModule } from '@sentry/angular';
@NgModule({
imports: [TraceModule],
})
export class AppModule {}
Then, inside your component's template (keep in mind that the directive's name attribute is required):
<app-header trace="header"></app-header>
<articles-list trace="articles-list"></articles-list>
<app-footer trace="footer"></app-footer>
TraceClass: used to track a duration between OnInit
and AfterViewInit
lifecycle hooks in components:
import { Component } from '@angular/core';
import { TraceClass } from '@sentry/angular';
@Component({
selector: 'layout-header',
templateUrl: './header.component.html',
})
@TraceClass()
export class HeaderComponent {
}
TraceMethod: used to track a specific lifecycle hooks as point-in-time spans in components:
import { Component, OnInit } from '@angular/core';
import { TraceMethod } from '@sentry/angular';
@Component({
selector: 'app-footer',
templateUrl: './footer.component.html',
})
export class FooterComponent implements OnInit {
@TraceMethod()
ngOnInit() {}
}
You can also add your own custom spans via startSpan()
. For example, if you'd like to track the duration of Angular
boostraping process, you can do it as follows:
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { init, startSpan } from '@sentry/angular';
import { AppModule } from './app/app.module';
startSpan(
{
name: 'platform-browser-dynamic',
op: 'ui.angular.bootstrap',
},
async () => {
await platformBrowserDynamic().bootstrapModule(AppModule);
},
);
8.37.0
Important Changes
- feat(nuxt): Add
piniaIntegration
(#14138)
The Nuxt SDK now allows you to track Pinia state for captured errors. To enable the Pinia plugin, add the piniaIntegration
to your client config:
// sentry.client.config.ts
import { usePinia } from '#imports';
Sentry.init({
integrations: [
Sentry.piniaIntegration(usePinia(), {
/* optional Pinia plugin options */
}),
],
});
- feat: Deprecate metrics API (#14157)
The Sentry Metrics beta has ended in favour of revisiting metrics in another form at a later date.
This new approach will include different APIs, making the current metrics API unnecessary. This release
deprecates the metrics API with the plan to remove in the next SDK major version. If you currently use the
metrics API in your code, you can safely continue to do so but sent data will no longer be processed by Sentry.
Learn more about the end of the Metrics beta.
Other Changes
- feat(browser): Add
http.response_delivery_type
attribute to resource spans (#14056) - feat(browser): Add
skipBrowserExtensionCheck
escape hatch option (#14147) - feat(deps): Bump @opentelemetry/instrumentation from 0.53.0 to 0.54.0 (#14174)
- feat(deps): Bump @opentelemetry/instrumentation-fastify from 0.40.0 to 0.41.0 (#14175)
- feat(deps): Bump @opentelemetry/instrumentation-graphql from 0.43.0 to 0.44.0 (#14173)
- feat(deps): Bump @opentelemetry/instrumentation-mongodb from 0.47.0 to 0.48.0 (#14171)
- feat(deps): Bump @opentelemetry/propagator-aws-xray from 1.25.1 to 1.26.0 (#14172)
- feat(nuxt): Add
asyncFunctionReExports
to define re-exported server functions (#14104) - feat(nuxt): Add
piniaIntegration
(#14138) - fix(browser): Avoid recording long task spans starting before their parent span (#14183)
- fix(core): Ensure errors thrown in async cron jobs bubble up (#14182)
- fix(core): Silently fail
maybeInstrument
(#14140) - fix(nextjs): Resolve path for dynamic webpack import (#13751)
- fix(node): Make sure
modulesIntegration
does not crash esm apps (#14169)
Work in this release was contributed by @rexxars. Thank you for your contribution!