@danieljvdm/dev-kit 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/package.json +1 -1
- package/skill-sources.jsonc +2 -33
- package/skill-sources.lock.json +15 -117
- package/skills/animate/LICENSE +21 -0
- package/skills/animate/NOTICE +10 -0
- package/skills/animate/SKILL.md +34 -0
- package/skills/animate/references/gestures.md +27 -0
- package/skills/animate/references/glossary.md +136 -0
- package/skills/animate/references/implementation.md +22 -0
- package/skills/animate/references/opportunities.md +18 -0
- package/skills/animate/references/principles.md +48 -0
- package/skills/animate/references/review.md +19 -0
- package/skills/cloudflare-workers/LICENSE +202 -0
- package/skills/cloudflare-workers/NOTICE +9 -0
- package/skills/cloudflare-workers/SKILL.md +26 -0
- package/skills/cloudflare-workers/references/durable-objects.md +68 -0
- package/skills/cloudflare-workers/references/sandbox.md +48 -0
- package/skills/cloudflare-workers/references/workers.md +63 -0
- package/skills/cloudflare-workers/references/wrangler.md +56 -0
- package/skills/design-ui/LICENSE +21 -0
- package/skills/design-ui/NOTICE +8 -0
- package/skills/design-ui/SKILL.md +29 -0
- package/skills/design-ui/references/appearance.md +22 -0
- package/skills/design-ui/references/components.md +33 -0
- package/skills/design-ui/references/exploration.md +50 -0
- package/skills/design-ui/references/libraries.md +39 -0
- package/skills/design-ui/references/themes.md +23 -0
- package/skills/dev-kit/SKILL.md +19 -38
- package/skills/dev-kit/references/cloudflare-worker-api.md +1 -1
- package/skills/dev-kit/references/skills.md +2 -2
- package/skills/effect-development/SKILL.md +27 -0
- package/skills/effect-development/agents/openai.yaml +4 -0
- package/skills/effect-development/references/api/index.md +32 -0
- package/skills/effect-development/references/api/schema-codecs.md +15 -0
- package/skills/{build-effect-apis/references → effect-development/references/api}/verification.md +10 -5
- package/skills/{effect-architecture-audit/SKILL.md → effect-development/references/architecture/index.md} +1 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-client.md +8 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-testing.md +7 -2
- package/skills/effect-development/references/atom/index.md +40 -0
- package/skills/{build-effect-clis/references → effect-development/references/cli}/entrypoints-and-testing.md +6 -2
- package/skills/effect-development/references/cli/index.md +39 -0
- package/skills/effect-development/references/setup.md +15 -0
- package/skills/open-pull-request/SKILL.md +10 -70
- package/skills/open-pull-request/references/evidence.md +22 -0
- package/skills/open-pull-request/references/explanation.md +21 -0
- package/skills/open-pull-request/references/publication.md +21 -0
- package/skills/sentry/LICENSE +202 -0
- package/skills/sentry/LICENSE-UPSTREAM +21 -0
- package/skills/sentry/NOTICE +14 -0
- package/skills/sentry/SKILL.md +33 -0
- package/skills/sentry/references/alert-payloads.md +105 -0
- package/skills/sentry/references/alerts.md +17 -0
- package/skills/sentry/references/artifacts.md +25 -0
- package/skills/sentry/references/auth-token.md +65 -0
- package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
- package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
- package/skills/sentry/references/concepts/crons.md +50 -0
- package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
- package/skills/sentry/references/concepts/errors.md +40 -0
- package/skills/sentry/references/concepts/logging.md +85 -0
- package/skills/sentry/references/concepts/metrics.md +49 -0
- package/skills/sentry/references/concepts/monitors.md +78 -0
- package/skills/sentry/references/concepts/profiling.md +38 -0
- package/skills/sentry/references/concepts/reduce-volume.md +49 -0
- package/skills/sentry/references/concepts/releases.md +43 -0
- package/skills/sentry/references/concepts/session-replay.md +35 -0
- package/skills/sentry/references/concepts/tracing.md +54 -0
- package/skills/sentry/references/concepts/user-feedback.md +36 -0
- package/skills/sentry/references/debug-artifacts/android.md +68 -0
- package/skills/sentry/references/debug-artifacts/apple.md +96 -0
- package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
- package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
- package/skills/sentry/references/debug-artifacts/index.md +75 -0
- package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
- package/skills/sentry/references/debug-artifacts/matching.md +73 -0
- package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
- package/skills/sentry/references/first-error-setup.md +25 -0
- package/skills/sentry/references/instrumentation.md +30 -0
- package/skills/sentry/references/issues.md +32 -0
- package/skills/sentry/references/new-project.md +17 -0
- package/skills/sentry/references/otel-exporter.md +30 -0
- package/skills/sentry/references/release-workflow.md +31 -0
- package/skills/sentry/references/releases/ci-pipeline.md +214 -0
- package/skills/sentry/references/releases/index.md +93 -0
- package/skills/sentry/references/releases/suspect-commits.md +155 -0
- package/skills/sentry/references/releases/tagging.md +131 -0
- package/skills/sentry/references/releases/troubleshooting.md +67 -0
- package/skills/sentry/references/sdks/android/crons.md +305 -0
- package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
- package/skills/sentry/references/sdks/android/index.md +748 -0
- package/skills/sentry/references/sdks/android/integrations.md +48 -0
- package/skills/sentry/references/sdks/android/logging.md +374 -0
- package/skills/sentry/references/sdks/android/metrics.md +288 -0
- package/skills/sentry/references/sdks/android/profiling.md +397 -0
- package/skills/sentry/references/sdks/android/session-replay.md +406 -0
- package/skills/sentry/references/sdks/android/tracing.md +861 -0
- package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
- package/skills/sentry/references/sdks/browser/index.md +714 -0
- package/skills/sentry/references/sdks/browser/logging.md +315 -0
- package/skills/sentry/references/sdks/browser/profiling.md +236 -0
- package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
- package/skills/sentry/references/sdks/browser/tracing.md +561 -0
- package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
- package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
- package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
- package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
- package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
- package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
- package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
- package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
- package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
- package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
- package/skills/sentry/references/sdks/cocoa/index.md +497 -0
- package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
- package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
- package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
- package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
- package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
- package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
- package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
- package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
- package/skills/sentry/references/sdks/dotnet/index.md +614 -0
- package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
- package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
- package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
- package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
- package/skills/sentry/references/sdks/elixir/crons.md +371 -0
- package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
- package/skills/sentry/references/sdks/elixir/index.md +383 -0
- package/skills/sentry/references/sdks/elixir/logging.md +239 -0
- package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
- package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
- package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
- package/skills/sentry/references/sdks/flutter/index.md +728 -0
- package/skills/sentry/references/sdks/flutter/logging.md +387 -0
- package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
- package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
- package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
- package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
- package/skills/sentry/references/sdks/go/crons.md +270 -0
- package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
- package/skills/sentry/references/sdks/go/index.md +324 -0
- package/skills/sentry/references/sdks/go/logging.md +354 -0
- package/skills/sentry/references/sdks/go/metrics.md +273 -0
- package/skills/sentry/references/sdks/go/profiling.md +46 -0
- package/skills/sentry/references/sdks/go/tracing.md +366 -0
- package/skills/sentry/references/sdks/index.md +41 -0
- package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
- package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
- package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
- package/skills/sentry/references/sdks/nestjs/index.md +699 -0
- package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
- package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
- package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
- package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
- package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
- package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
- package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
- package/skills/sentry/references/sdks/nextjs/index.md +491 -0
- package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
- package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
- package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
- package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
- package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
- package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
- package/skills/sentry/references/sdks/node/crons.md +432 -0
- package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
- package/skills/sentry/references/sdks/node/index.md +942 -0
- package/skills/sentry/references/sdks/node/logging.md +380 -0
- package/skills/sentry/references/sdks/node/metrics.md +278 -0
- package/skills/sentry/references/sdks/node/profiling.md +373 -0
- package/skills/sentry/references/sdks/node/tracing.md +878 -0
- package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
- package/skills/sentry/references/sdks/php/crons.md +265 -0
- package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
- package/skills/sentry/references/sdks/php/index.md +362 -0
- package/skills/sentry/references/sdks/php/laravel.md +542 -0
- package/skills/sentry/references/sdks/php/logging.md +242 -0
- package/skills/sentry/references/sdks/php/metrics.md +193 -0
- package/skills/sentry/references/sdks/php/profiling.md +115 -0
- package/skills/sentry/references/sdks/php/symfony.md +552 -0
- package/skills/sentry/references/sdks/php/tracing.md +516 -0
- package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
- package/skills/sentry/references/sdks/python/crons.md +218 -0
- package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
- package/skills/sentry/references/sdks/python/index.md +361 -0
- package/skills/sentry/references/sdks/python/logging.md +234 -0
- package/skills/sentry/references/sdks/python/metrics.md +154 -0
- package/skills/sentry/references/sdks/python/profiling.md +120 -0
- package/skills/sentry/references/sdks/python/tracing.md +364 -0
- package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
- package/skills/sentry/references/sdks/react/index.md +492 -0
- package/skills/sentry/references/sdks/react/logging.md +364 -0
- package/skills/sentry/references/sdks/react/profiling.md +322 -0
- package/skills/sentry/references/sdks/react/react-features.md +1272 -0
- package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
- package/skills/sentry/references/sdks/react/tracing.md +1415 -0
- package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
- package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
- package/skills/sentry/references/sdks/react-native/index.md +1030 -0
- package/skills/sentry/references/sdks/react-native/logging.md +444 -0
- package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
- package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
- package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
- package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
- package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
- package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
- package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
- package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
- package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
- package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
- package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
- package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
- package/skills/sentry/references/sdks/ruby/crons.md +184 -0
- package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
- package/skills/sentry/references/sdks/ruby/index.md +297 -0
- package/skills/sentry/references/sdks/ruby/logging.md +168 -0
- package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
- package/skills/sentry/references/sdks/ruby/migration.md +321 -0
- package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
- package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
- package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
- package/skills/sentry/references/sdks/svelte/index.md +467 -0
- package/skills/sentry/references/sdks/svelte/logging.md +344 -0
- package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
- package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
- package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
- package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
- package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
- package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
- package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
- package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
- package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
- package/skills/sentry/references/search-query-language.md +226 -0
- package/skills/sentry/references/semantics/angular.md +7 -0
- package/skills/sentry/references/semantics/app.md +28 -0
- package/skills/sentry/references/semantics/art.md +17 -0
- package/skills/sentry/references/semantics/aws.md +43 -0
- package/skills/sentry/references/semantics/browser.md +34 -0
- package/skills/sentry/references/semantics/cache.md +12 -0
- package/skills/sentry/references/semantics/client.md +8 -0
- package/skills/sentry/references/semantics/cloud.md +12 -0
- package/skills/sentry/references/semantics/cloudflare.md +23 -0
- package/skills/sentry/references/semantics/code.md +11 -0
- package/skills/sentry/references/semantics/culture.md +11 -0
- package/skills/sentry/references/semantics/db.md +21 -0
- package/skills/sentry/references/semantics/device.md +43 -0
- package/skills/sentry/references/semantics/error.md +7 -0
- package/skills/sentry/references/semantics/event.md +8 -0
- package/skills/sentry/references/semantics/exception.md +10 -0
- package/skills/sentry/references/semantics/faas.md +19 -0
- package/skills/sentry/references/semantics/file.md +8 -0
- package/skills/sentry/references/semantics/flag.md +7 -0
- package/skills/sentry/references/semantics/gcp.md +16 -0
- package/skills/sentry/references/semantics/gen_ai.md +53 -0
- package/skills/sentry/references/semantics/general.md +11 -0
- package/skills/sentry/references/semantics/graphql.md +9 -0
- package/skills/sentry/references/semantics/grpc.md +19 -0
- package/skills/sentry/references/semantics/http.md +34 -0
- package/skills/sentry/references/semantics/index.md +63 -0
- package/skills/sentry/references/semantics/jsonrpc.md +8 -0
- package/skills/sentry/references/semantics/jvm.md +12 -0
- package/skills/sentry/references/semantics/koa.md +7 -0
- package/skills/sentry/references/semantics/logger.md +7 -0
- package/skills/sentry/references/semantics/mcp.md +37 -0
- package/skills/sentry/references/semantics/mdc.md +7 -0
- package/skills/sentry/references/semantics/messaging.md +23 -0
- package/skills/sentry/references/semantics/middleware.md +7 -0
- package/skills/sentry/references/semantics/navigation.md +9 -0
- package/skills/sentry/references/semantics/nel.md +11 -0
- package/skills/sentry/references/semantics/network.md +17 -0
- package/skills/sentry/references/semantics/os.md +15 -0
- package/skills/sentry/references/semantics/otel.md +10 -0
- package/skills/sentry/references/semantics/params.md +7 -0
- package/skills/sentry/references/semantics/process.md +14 -0
- package/skills/sentry/references/semantics/react.md +7 -0
- package/skills/sentry/references/semantics/remix.md +7 -0
- package/skills/sentry/references/semantics/resource.md +7 -0
- package/skills/sentry/references/semantics/rpc.md +10 -0
- package/skills/sentry/references/semantics/score.md +10 -0
- package/skills/sentry/references/semantics/sentry.md +69 -0
- package/skills/sentry/references/semantics/server.md +8 -0
- package/skills/sentry/references/semantics/service.md +8 -0
- package/skills/sentry/references/semantics/session.md +7 -0
- package/skills/sentry/references/semantics/state.md +7 -0
- package/skills/sentry/references/semantics/thread.md +8 -0
- package/skills/sentry/references/semantics/timber.md +7 -0
- package/skills/sentry/references/semantics/trpc.md +8 -0
- package/skills/sentry/references/semantics/ui.md +18 -0
- package/skills/sentry/references/semantics/url.md +15 -0
- package/skills/sentry/references/semantics/user.md +17 -0
- package/skills/sentry/references/semantics/user_agent.md +7 -0
- package/skills/sentry/references/semantics/vercel.md +42 -0
- package/skills/sentry/references/setup-verification.md +39 -0
- package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
- package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
- package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
- package/skills/sentry/references/snapshots/index.md +19 -0
- package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
- package/skills/sentry/references/snapshots/snapshots.md +123 -0
- package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
- package/skills/testing/LICENSE +21 -0
- package/skills/testing/NOTICE +7 -0
- package/skills/testing/SKILL.md +13 -19
- package/skills/testing/agents/openai.yaml +1 -2
- package/skills/testing/references/selection.md +23 -0
- package/skills/testing/references/tdd.md +19 -0
- package/skills/testing/references/test-design.md +17 -0
- package/src/catalog.ts +1 -7
- package/skills/build-effect-apis/SKILL.md +0 -81
- package/skills/build-effect-apis/agents/openai.yaml +0 -4
- package/skills/build-effect-clis/SKILL.md +0 -92
- package/skills/build-effect-clis/agents/openai.yaml +0 -4
- package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
- package/skills/effect-atom-state/SKILL.md +0 -97
- package/skills/effect-atom-state/agents/openai.yaml +0 -4
- package/skills/effect-ts/SKILL.md +0 -35
- package/skills/effect-ts/agents/openai.yaml +0 -4
- /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
- /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/processes-and-platform.md +0 -0
|
@@ -0,0 +1,861 @@
|
|
|
1
|
+
# Error Monitoring — Sentry Browser SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `@sentry/browser` ≥7.0.0\
|
|
4
|
+
> `makeBrowserOfflineTransport` requires `@sentry/browser` ≥7.48.0\
|
|
5
|
+
> `linkedErrorsIntegration` `cause` chain requires Error.cause support (Chrome 93+,
|
|
6
|
+
> Firefox 91+)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## How Automatic Capture Works
|
|
11
|
+
|
|
12
|
+
The browser SDK hooks into the browser environment and captures errors from multiple
|
|
13
|
+
layers automatically:
|
|
14
|
+
|
|
15
|
+
| Layer | Mechanism | Integration |
|
|
16
|
+
| ------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ |
|
|
17
|
+
| Uncaught synchronous exceptions | `window.onerror` | `globalHandlersIntegration` (default on) |
|
|
18
|
+
| Unhandled promise rejections | `window.onunhandledrejection` | `globalHandlersIntegration` (default on) |
|
|
19
|
+
| Errors in `setTimeout` / `setInterval` / `requestAnimationFrame` / `addEventListener` | Patched browser APIs | `browserApiErrorsIntegration` (default on) |
|
|
20
|
+
| Console errors (optional) | Patched `console.error` | `captureConsoleIntegration` (opt-in) |
|
|
21
|
+
|
|
22
|
+
### What Requires Manual Instrumentation
|
|
23
|
+
|
|
24
|
+
The global handlers only catch errors that **escape** your code.
|
|
25
|
+
These are silently swallowed without manual calls:
|
|
26
|
+
|
|
27
|
+
- Errors caught by your own `try/catch` blocks
|
|
28
|
+
- Business-logic failures (validation errors, unexpected states)
|
|
29
|
+
- Async errors in `.then()` chains where `.catch()` is attached
|
|
30
|
+
- User-visible conditions that aren’t exceptions (use `captureMessage`)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Core Capture APIs
|
|
35
|
+
|
|
36
|
+
### `Sentry.captureException(error, captureContext?)`
|
|
37
|
+
|
|
38
|
+
Captures an exception and sends it to Sentry.
|
|
39
|
+
Prefer `Error` objects — they include stack traces.
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
import * as Sentry from "@sentry/browser";
|
|
43
|
+
|
|
44
|
+
// Basic usage
|
|
45
|
+
try {
|
|
46
|
+
riskyOperation();
|
|
47
|
+
} catch (err) {
|
|
48
|
+
Sentry.captureException(err);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// With inline capture context
|
|
52
|
+
try {
|
|
53
|
+
await chargeCard(order);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
Sentry.captureException(err, {
|
|
56
|
+
level: "fatal",
|
|
57
|
+
tags: { module: "checkout", payment_provider: "stripe" },
|
|
58
|
+
extra: { orderId: order.id, amount: order.total },
|
|
59
|
+
user: { id: "u_123", email: "user@example.com" },
|
|
60
|
+
fingerprint: ["checkout-payment-fail"],
|
|
61
|
+
contexts: {
|
|
62
|
+
payment: { provider: "stripe", amount: 9999, currency: "usd" },
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Non-Error values are accepted but may lack stack traces
|
|
68
|
+
Sentry.captureException("Something went wrong as a string");
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**`CaptureContext` shape:**
|
|
72
|
+
|
|
73
|
+
| Field | Type | Description |
|
|
74
|
+
| ------------- | --------------------------------------------------------------- | ----------------------------------- |
|
|
75
|
+
| `level` | `"fatal" \| "error" \| "warning" \| "log" \| "info" \| "debug"` | Severity override for this event |
|
|
76
|
+
| `tags` | `Record<string, string>` | Indexed, filterable key-value pairs |
|
|
77
|
+
| `extra` | `Record<string, unknown>` | Unindexed supplementary data |
|
|
78
|
+
| `user` | `{ id?, email?, username?, ip_address? }` | User identity |
|
|
79
|
+
| `contexts` | `Record<string, Record<string, unknown>>` | Named structured context blocks |
|
|
80
|
+
| `fingerprint` | `string[]` | Custom issue grouping key |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### `Sentry.captureMessage(message, levelOrContext?)`
|
|
85
|
+
|
|
86
|
+
Captures a plain-text message as a Sentry issue.
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
// With a severity level (shorthand second argument)
|
|
90
|
+
Sentry.captureMessage("Something went wrong", "warning");
|
|
91
|
+
Sentry.captureMessage("Payment gateway timeout", "fatal");
|
|
92
|
+
|
|
93
|
+
// With full CaptureContext
|
|
94
|
+
Sentry.captureMessage("User performed invalid action", {
|
|
95
|
+
level: "warning",
|
|
96
|
+
user: { id: "u_456" },
|
|
97
|
+
tags: { feature: "cart", action: "remove-item" },
|
|
98
|
+
extra: { itemId: "sku_789" },
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
> Set `attachStacktrace: true` in `Sentry.init()` to automatically attach a stack trace
|
|
103
|
+
> to message events.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### `Sentry.captureEvent(event)`
|
|
108
|
+
|
|
109
|
+
Sends a fully constructed Sentry event object.
|
|
110
|
+
Use `captureException` or `captureMessage` in application code; use `captureEvent` for
|
|
111
|
+
custom integrations or forwarding from legacy loggers.
|
|
112
|
+
|
|
113
|
+
```javascript
|
|
114
|
+
Sentry.captureEvent({
|
|
115
|
+
message: "Legacy logger forwarded event",
|
|
116
|
+
level: "warning",
|
|
117
|
+
tags: { source: "legacy-logger", module: "billing" },
|
|
118
|
+
extra: { rawLog: "something went wrong at line 42" },
|
|
119
|
+
timestamp: Date.now() / 1000, // Unix timestamp in seconds
|
|
120
|
+
fingerprint: ["legacy-billing-error"],
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Utility APIs
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
// Get the event ID of the last sent error event
|
|
130
|
+
const eventId = Sentry.lastEventId();
|
|
131
|
+
|
|
132
|
+
// Flush all pending events before page unload / shutdown
|
|
133
|
+
await Sentry.flush(2000); // wait up to 2 seconds
|
|
134
|
+
|
|
135
|
+
// Flush and disable the SDK permanently
|
|
136
|
+
await Sentry.close(2000);
|
|
137
|
+
|
|
138
|
+
// Check if SDK is initialized and enabled
|
|
139
|
+
if (Sentry.isEnabled()) {
|
|
140
|
+
/* ... */
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Scope Management
|
|
147
|
+
|
|
148
|
+
Sentry uses three nested scope types.
|
|
149
|
+
Data from all three is merged before each event is sent.
|
|
150
|
+
|
|
151
|
+
| Scope | API | Lifetime | Use Case |
|
|
152
|
+
| ------------- | --------------------- | ----------------------- | ---------------------------------------------------------- |
|
|
153
|
+
| **Global** | `getGlobalScope()` | Entire application | App-wide constants: version, build ID, region |
|
|
154
|
+
| **Isolation** | `getIsolationScope()` | Per page load (browser) | User info, session data, tags set via top-level `setTag()` |
|
|
155
|
+
| **Current** | `withScope()` | Per-event / narrowest | Per-operation data: one API call, one form submit |
|
|
156
|
+
|
|
157
|
+
**Merge priority (later overrides earlier):**
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
Global Scope → Isolation Scope → Current Scope → Event-level CaptureContext
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> **Browser note:** In a browser there is no per-request isolation, so the isolation
|
|
164
|
+
> scope effectively behaves like the global scope.
|
|
165
|
+
> The distinction matters in server-side runtimes (Node.js, Deno, Cloudflare Workers).
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
### `withScope` — Per-Event Scoping (Recommended)
|
|
170
|
+
|
|
171
|
+
Forks the current scope, runs your callback with the fork, and discards it when done.
|
|
172
|
+
This is the preferred way to attach data to a single event without polluting broader
|
|
173
|
+
scope.
|
|
174
|
+
|
|
175
|
+
```javascript
|
|
176
|
+
Sentry.withScope((scope) => {
|
|
177
|
+
scope.setTag("transaction_id", "txn_abc123");
|
|
178
|
+
scope.setExtra("requestPayload", { amount: 50, currency: "USD" });
|
|
179
|
+
scope.setLevel("warning");
|
|
180
|
+
scope.setUser({ id: "u_789" });
|
|
181
|
+
scope.setFingerprint(["payment-error", "stripe"]);
|
|
182
|
+
Sentry.captureException(new Error("Payment failed"));
|
|
183
|
+
// scope is discarded after this callback
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Events captured here are NOT affected by the above scope
|
|
187
|
+
Sentry.captureMessage("This event has no payment tags");
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### Scope Methods
|
|
193
|
+
|
|
194
|
+
Every scope instance exposes the same enrichment API:
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
// Isolation scope — persists for all subsequent events on this page
|
|
198
|
+
Sentry.getIsolationScope().setUser({ id: "u_123", email: "user@example.com" });
|
|
199
|
+
Sentry.getIsolationScope().setTag("app_version", "3.4.1");
|
|
200
|
+
|
|
201
|
+
// Global scope — applied to every event in the app
|
|
202
|
+
Sentry.getGlobalScope().setTag("datacenter", "us-east-1");
|
|
203
|
+
Sentry.getGlobalScope().setContext("build", {
|
|
204
|
+
commit: "abc1234",
|
|
205
|
+
buildDate: "2026-03-03",
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// Scope method reference
|
|
209
|
+
scope.setUser({ id, email, username, ip_address }); // setUser(null) to clear
|
|
210
|
+
scope.setTag("key", "value");
|
|
211
|
+
scope.setTags({ key1: "v1", key2: "v2" });
|
|
212
|
+
scope.setExtra("key", value);
|
|
213
|
+
scope.setExtras({ key1: v1, key2: v2 });
|
|
214
|
+
scope.setContext("name", { key: value }); // setContext("name", null) to remove
|
|
215
|
+
scope.setLevel("warning");
|
|
216
|
+
scope.setFingerprint(["my-group-key"]);
|
|
217
|
+
scope.addBreadcrumb({ category: "auth", message: "User logged in" });
|
|
218
|
+
scope.addEventProcessor((event) => {
|
|
219
|
+
/* modify or drop */ return event;
|
|
220
|
+
});
|
|
221
|
+
scope.clear(); // reset all scope data
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Event Enrichment
|
|
227
|
+
|
|
228
|
+
### Tags — Indexed, Searchable Key-Value Pairs
|
|
229
|
+
|
|
230
|
+
Tags power filtering, search, and tag distribution maps in the Sentry UI.
|
|
231
|
+
|
|
232
|
+
**Constraints:** Key ≤32 chars (`a-zA-Z0-9_.:-`, no spaces).
|
|
233
|
+
Value ≤200 chars, no newlines.
|
|
234
|
+
|
|
235
|
+
```javascript
|
|
236
|
+
// Single tag — applied to all subsequent events (isolation scope)
|
|
237
|
+
Sentry.setTag("page_locale", "de-at");
|
|
238
|
+
Sentry.setTag("subscription_tier", "pro");
|
|
239
|
+
Sentry.setTag("feature_flag", "new_checkout_enabled");
|
|
240
|
+
|
|
241
|
+
// Multiple tags at once
|
|
242
|
+
Sentry.setTags({
|
|
243
|
+
environment: "staging",
|
|
244
|
+
region: "eu-west-1",
|
|
245
|
+
api_version: "v3",
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// Scoped tag — only on this one event
|
|
249
|
+
Sentry.withScope((scope) => {
|
|
250
|
+
scope.setTag("retry_attempt", "3");
|
|
251
|
+
Sentry.captureException(new Error("Max retries exceeded"));
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
### Context — Rich Unindexed Structured Data
|
|
258
|
+
|
|
259
|
+
Context is **not indexed or searchable** but displays in full on the event details page.
|
|
260
|
+
Use it for rich structured data you need for debugging but don’t need to filter on.
|
|
261
|
+
|
|
262
|
+
```javascript
|
|
263
|
+
Sentry.setContext("shopping_cart", {
|
|
264
|
+
itemCount: 3,
|
|
265
|
+
totalAmount: 149.99,
|
|
266
|
+
currency: "USD",
|
|
267
|
+
couponApplied: "SAVE10",
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
Sentry.setContext("device", {
|
|
271
|
+
platform: navigator.platform,
|
|
272
|
+
language: navigator.language,
|
|
273
|
+
screenWidth: screen.width,
|
|
274
|
+
screenHeight: screen.height,
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// Clear a context by passing null
|
|
278
|
+
Sentry.setContext("shopping_cart", null);
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
> **Depth limit:** Nested context objects are normalized to **3 levels deep** by
|
|
282
|
+
> default. Use `normalizeDepth` in `init()` to change this.
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
### User Information
|
|
287
|
+
|
|
288
|
+
```javascript
|
|
289
|
+
// Set user on login
|
|
290
|
+
Sentry.setUser({
|
|
291
|
+
id: "user_abc123",
|
|
292
|
+
email: "alice@example.com",
|
|
293
|
+
username: "alice",
|
|
294
|
+
subscription: "premium", // arbitrary extra field
|
|
295
|
+
org: "acme-corp",
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
// Clear user on logout
|
|
299
|
+
Sentry.setUser(null);
|
|
300
|
+
|
|
301
|
+
// Auto-infer IP address (requires sendDefaultPii: true in init)
|
|
302
|
+
Sentry.setUser({ ip_address: "{{auto}}" });
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### `initialScope` — Set Context at Startup
|
|
308
|
+
|
|
309
|
+
```javascript
|
|
310
|
+
// Object form
|
|
311
|
+
Sentry.init({
|
|
312
|
+
dsn: "___PUBLIC_DSN___",
|
|
313
|
+
initialScope: {
|
|
314
|
+
tags: { "app.version": "1.2.3", region: "us-west" },
|
|
315
|
+
user: { id: 42, email: "john.doe@example.com" },
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
// Callback form (full Scope API access)
|
|
320
|
+
Sentry.init({
|
|
321
|
+
dsn: "___PUBLIC_DSN___",
|
|
322
|
+
initialScope: (scope) => {
|
|
323
|
+
scope.setTags({ a: "b", c: "d" });
|
|
324
|
+
scope.setContext("device", { platform: navigator.platform });
|
|
325
|
+
return scope;
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## Breadcrumbs
|
|
333
|
+
|
|
334
|
+
Breadcrumbs create a trail of events leading up to an issue.
|
|
335
|
+
They’re buffered locally and attached to the next event sent to Sentry.
|
|
336
|
+
|
|
337
|
+
### Automatic Breadcrumbs
|
|
338
|
+
|
|
339
|
+
| Source | What is captured |
|
|
340
|
+
| --------- | -------------------------------------------------------- |
|
|
341
|
+
| `console` | `console.log`, `warn`, `error`, `debug` calls |
|
|
342
|
+
| `dom` | Click and keypress events on DOM elements |
|
|
343
|
+
| `fetch` | All `fetch()` HTTP requests (URL, method, status) |
|
|
344
|
+
| `xhr` | All `XMLHttpRequest` calls |
|
|
345
|
+
| `history` | `history.pushState`, `history.replaceState`, navigations |
|
|
346
|
+
| `sentry` | Internal events when the SDK sends to Sentry |
|
|
347
|
+
|
|
348
|
+
### Manual Breadcrumbs
|
|
349
|
+
|
|
350
|
+
```javascript
|
|
351
|
+
// Authentication event
|
|
352
|
+
Sentry.addBreadcrumb({
|
|
353
|
+
category: "auth",
|
|
354
|
+
message: "User authenticated",
|
|
355
|
+
level: "info",
|
|
356
|
+
data: { userId: user.id, method: "oauth2", provider: "google" },
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
// Navigation event
|
|
360
|
+
Sentry.addBreadcrumb({
|
|
361
|
+
type: "navigation",
|
|
362
|
+
category: "navigation",
|
|
363
|
+
data: { from: "/home", to: "/checkout" },
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// Custom action
|
|
367
|
+
Sentry.addBreadcrumb({
|
|
368
|
+
category: "cart",
|
|
369
|
+
message: "Item added to cart",
|
|
370
|
+
level: "info",
|
|
371
|
+
data: { itemId: "sku_123", quantity: 2, price: 29.99 },
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
// Feature flag
|
|
375
|
+
Sentry.addBreadcrumb({
|
|
376
|
+
type: "debug",
|
|
377
|
+
category: "feature-flag",
|
|
378
|
+
message: "New checkout flow enabled",
|
|
379
|
+
level: "debug",
|
|
380
|
+
data: { flag: "checkout_v2", value: true },
|
|
381
|
+
});
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**Breadcrumb schema:**
|
|
385
|
+
|
|
386
|
+
| Field | Type | Description |
|
|
387
|
+
| ----------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
|
|
388
|
+
| `message` | `string` | Human-readable description |
|
|
389
|
+
| `type` | `"default" \| "debug" \| "error" \| "info" \| "navigation" \| "http" \| "query" \| "ui" \| "user"` | Breadcrumb type |
|
|
390
|
+
| `level` | `"fatal" \| "error" \| "warning" \| "log" \| "info" \| "debug"` | Severity |
|
|
391
|
+
| `category` | `string` | Dot-namespaced: `"auth"`, `"ui.click"`, `"api.request"` |
|
|
392
|
+
| `data` | `Record<string, unknown>` | Arbitrary structured payload |
|
|
393
|
+
| `timestamp` | `number` | Unix timestamp; auto-set if omitted |
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
### Breadcrumb Configuration
|
|
398
|
+
|
|
399
|
+
```javascript
|
|
400
|
+
Sentry.init({
|
|
401
|
+
dsn: "___PUBLIC_DSN___",
|
|
402
|
+
maxBreadcrumbs: 50, // default: 100
|
|
403
|
+
|
|
404
|
+
beforeBreadcrumb(breadcrumb, hint) {
|
|
405
|
+
// Drop UI click breadcrumbs
|
|
406
|
+
if (breadcrumb.category === "ui.click") return null;
|
|
407
|
+
|
|
408
|
+
// Enrich XHR breadcrumbs with request body size
|
|
409
|
+
if (breadcrumb.type === "http" && hint?.xhr) {
|
|
410
|
+
breadcrumb.data = {
|
|
411
|
+
...breadcrumb.data,
|
|
412
|
+
requestBodySize: hint.xhr.requestBody?.length ?? 0,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Drop console.debug noise in production
|
|
417
|
+
if (breadcrumb.category === "console" && breadcrumb.level === "debug") {
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return breadcrumb;
|
|
422
|
+
},
|
|
423
|
+
|
|
424
|
+
integrations: [
|
|
425
|
+
Sentry.breadcrumbsIntegration({
|
|
426
|
+
console: true,
|
|
427
|
+
dom: { serializeAttribute: ["data-testid", "aria-label"] },
|
|
428
|
+
fetch: true,
|
|
429
|
+
history: true,
|
|
430
|
+
xhr: true,
|
|
431
|
+
sentry: true,
|
|
432
|
+
}),
|
|
433
|
+
],
|
|
434
|
+
});
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Hooks — `beforeSend`, `beforeSendTransaction`, `beforeBreadcrumb`
|
|
440
|
+
|
|
441
|
+
### `beforeSend` — Modify or Drop Error Events
|
|
442
|
+
|
|
443
|
+
Called last, just before an error event is sent.
|
|
444
|
+
All scope data has already been applied.
|
|
445
|
+
Return the event to send it, or `null` to drop it.
|
|
446
|
+
|
|
447
|
+
```javascript
|
|
448
|
+
Sentry.init({
|
|
449
|
+
dsn: "___PUBLIC_DSN___",
|
|
450
|
+
|
|
451
|
+
beforeSend(event, hint) {
|
|
452
|
+
const err = hint.originalException;
|
|
453
|
+
|
|
454
|
+
// --- Drop known noisy errors ---
|
|
455
|
+
if (event.exception?.values?.[0]?.value?.includes("ResizeObserver")) {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// --- Drop browser extension errors ---
|
|
460
|
+
if (
|
|
461
|
+
event.exception?.values?.[0]?.stacktrace?.frames?.some((frame) =>
|
|
462
|
+
frame.filename?.includes("extension://"),
|
|
463
|
+
)
|
|
464
|
+
) {
|
|
465
|
+
return null;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// --- PII scrubbing ---
|
|
469
|
+
if (event.user?.email) {
|
|
470
|
+
delete event.user.email;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// --- Custom fingerprinting based on original exception ---
|
|
474
|
+
if (err instanceof NetworkError) {
|
|
475
|
+
event.fingerprint = ["network-error", err.statusCode?.toString() ?? "unknown"];
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// --- Add extra context from the original exception ---
|
|
479
|
+
if (err instanceof ApiError) {
|
|
480
|
+
event.extra = {
|
|
481
|
+
...event.extra,
|
|
482
|
+
requestId: err.requestId,
|
|
483
|
+
endpoint: err.endpoint,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
return event;
|
|
488
|
+
},
|
|
489
|
+
});
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
**`hint` object properties:**
|
|
493
|
+
|
|
494
|
+
| Property | Type | Description |
|
|
495
|
+
| -------------------- | ------------------------- | ------------------------------------------------------- |
|
|
496
|
+
| `originalException` | `unknown` | The original exception that triggered the event |
|
|
497
|
+
| `syntheticException` | `Error \| null` | Synthetic Error generated for string/non-Error captures |
|
|
498
|
+
| `event_id` | `string` | The generated event ID |
|
|
499
|
+
| `data` | `Record<string, unknown>` | Arbitrary extra data |
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
### `beforeSendTransaction` — Modify or Drop Transaction Events
|
|
504
|
+
|
|
505
|
+
Same as `beforeSend` but for performance transaction events.
|
|
506
|
+
|
|
507
|
+
```javascript
|
|
508
|
+
Sentry.init({
|
|
509
|
+
beforeSendTransaction(event) {
|
|
510
|
+
// Drop health check transactions
|
|
511
|
+
if (event.transaction === "/health" || event.transaction === "/ping") {
|
|
512
|
+
return null;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// Scrub PII from transaction name
|
|
516
|
+
event.transaction = event.transaction?.replace(/\/users\/\d+/, "/users/:id");
|
|
517
|
+
|
|
518
|
+
return event;
|
|
519
|
+
},
|
|
520
|
+
});
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## Event Processors
|
|
526
|
+
|
|
527
|
+
Event processors intercept every event before it’s sent.
|
|
528
|
+
Unlike `beforeSend`, multiple processors can be registered and run in series.
|
|
529
|
+
|
|
530
|
+
```javascript
|
|
531
|
+
// Global event processor — runs on ALL events
|
|
532
|
+
Sentry.addEventProcessor((event, hint) => {
|
|
533
|
+
// Add build metadata to every event
|
|
534
|
+
event.tags = {
|
|
535
|
+
...event.tags,
|
|
536
|
+
build_sha: BUILD_SHA,
|
|
537
|
+
deploy_env: DEPLOY_ENV,
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
// Drop events with no stack trace in production
|
|
541
|
+
if (IS_PRODUCTION && !event.exception?.values?.[0]?.stacktrace?.frames?.length) {
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
return event;
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
// Scope-level processor — only applies within withScope
|
|
549
|
+
Sentry.withScope((scope) => {
|
|
550
|
+
scope.addEventProcessor((event) => {
|
|
551
|
+
event.tags = { ...event.tags, source: "checkout-flow" };
|
|
552
|
+
return event;
|
|
553
|
+
});
|
|
554
|
+
Sentry.captureException(new Error("Checkout failed"));
|
|
555
|
+
});
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
**Key differences vs.
|
|
559
|
+
`beforeSend`:**
|
|
560
|
+
|
|
561
|
+
| Feature | `addEventProcessor` | `beforeSend` |
|
|
562
|
+
| ------------------- | ---------------------------- | -------------------------------------- |
|
|
563
|
+
| Execution order | Unspecified among processors | **Always last** (after all processors) |
|
|
564
|
+
| Multiple allowed | ✅ Unlimited | ❌ Only one |
|
|
565
|
+
| Scope-level support | ✅ Yes | ❌ Global init only |
|
|
566
|
+
| Async support | ✅ (slower) | ✅ |
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## Fingerprinting
|
|
571
|
+
|
|
572
|
+
Every event has a fingerprint array.
|
|
573
|
+
Events with the same fingerprint are grouped into the same issue.
|
|
574
|
+
|
|
575
|
+
### Extending Default Grouping
|
|
576
|
+
|
|
577
|
+
Use `{{ default }}` to keep Sentry’s default grouping and add extra discriminators:
|
|
578
|
+
|
|
579
|
+
```javascript
|
|
580
|
+
Sentry.init({
|
|
581
|
+
beforeSend(event, hint) {
|
|
582
|
+
const err = hint.originalException;
|
|
583
|
+
|
|
584
|
+
if (err instanceof ApiError) {
|
|
585
|
+
// Keep default grouping but split further by RPC function + error code
|
|
586
|
+
event.fingerprint = ["{{ default }}", err.functionName, String(err.errorCode)];
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
return event;
|
|
590
|
+
},
|
|
591
|
+
});
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
### Overriding Default Grouping
|
|
595
|
+
|
|
596
|
+
Omit `{{ default }}` to completely replace the auto-generated fingerprint (collapses all
|
|
597
|
+
matching errors into one issue):
|
|
598
|
+
|
|
599
|
+
```javascript
|
|
600
|
+
Sentry.init({
|
|
601
|
+
beforeSend(event, hint) {
|
|
602
|
+
const err = hint.originalException;
|
|
603
|
+
|
|
604
|
+
if (err?.message?.includes("timeout")) {
|
|
605
|
+
event.fingerprint = ["network-timeout"];
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
if (err?.name === "ChunkLoadError") {
|
|
609
|
+
event.fingerprint = ["chunk-load-failure"];
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
return event;
|
|
613
|
+
},
|
|
614
|
+
});
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
### Inline Fingerprint on Capture
|
|
618
|
+
|
|
619
|
+
```javascript
|
|
620
|
+
Sentry.captureException(err, {
|
|
621
|
+
fingerprint: ["payment-gateway", "stripe", err.code],
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
Sentry.captureMessage("Rate limit exceeded", {
|
|
625
|
+
fingerprint: ["rate-limit", endpoint],
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
// Group by HTTP method + path + status code
|
|
629
|
+
Sentry.withScope((scope) => {
|
|
630
|
+
scope.setFingerprint([method, path, String(err.statusCode)]);
|
|
631
|
+
Sentry.captureException(err);
|
|
632
|
+
});
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
**Fingerprint variables:**
|
|
636
|
+
|
|
637
|
+
| Variable | Resolves to |
|
|
638
|
+
| ------------------- | ------------------------------------- |
|
|
639
|
+
| `{{ default }}` | The auto-generated Sentry fingerprint |
|
|
640
|
+
| `{{ transaction }}` | The transaction name |
|
|
641
|
+
| `{{ function }}` | The function name in the stack trace |
|
|
642
|
+
| `{{ type }}` | The exception type |
|
|
643
|
+
| `{{ module }}` | The module name |
|
|
644
|
+
| `{{ value }}` | The exception value/message |
|
|
645
|
+
|
|
646
|
+
---
|
|
647
|
+
|
|
648
|
+
## Event Filtering
|
|
649
|
+
|
|
650
|
+
### `ignoreErrors` — Pattern-Based Filtering
|
|
651
|
+
|
|
652
|
+
```javascript
|
|
653
|
+
Sentry.init({
|
|
654
|
+
ignoreErrors: [
|
|
655
|
+
// String (partial match):
|
|
656
|
+
"ResizeObserver loop limit exceeded",
|
|
657
|
+
"fb_xd_fragment",
|
|
658
|
+
"Non-Error exception captured",
|
|
659
|
+
|
|
660
|
+
// Regex (full control):
|
|
661
|
+
/^Network Error$/,
|
|
662
|
+
/ChunkLoadError/,
|
|
663
|
+
/Loading chunk \d+ failed/,
|
|
664
|
+
/^Script error\.?$/,
|
|
665
|
+
],
|
|
666
|
+
});
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### `allowUrls` / `denyUrls` — Filter by Script Origin
|
|
670
|
+
|
|
671
|
+
These filter based on **stack frame URLs** (where the code lives), not the page URL.
|
|
672
|
+
|
|
673
|
+
```javascript
|
|
674
|
+
Sentry.init({
|
|
675
|
+
// Only capture errors from your own scripts
|
|
676
|
+
allowUrls: [/https?:\/\/((cdn|www)\.)?myapp\.com/],
|
|
677
|
+
|
|
678
|
+
// Never capture errors from these script origins
|
|
679
|
+
denyUrls: [
|
|
680
|
+
/extensions\//i,
|
|
681
|
+
/^chrome:\/\//i,
|
|
682
|
+
/^moz-extension:\/\//i,
|
|
683
|
+
/^safari-extension:\/\//i,
|
|
684
|
+
/ads\.doubleclick\.net/,
|
|
685
|
+
],
|
|
686
|
+
});
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### `sampleRate` — Error Volume Reduction
|
|
690
|
+
|
|
691
|
+
```javascript
|
|
692
|
+
Sentry.init({
|
|
693
|
+
sampleRate: 0.25, // Capture 25% of errors (randomly sampled)
|
|
694
|
+
});
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
---
|
|
698
|
+
|
|
699
|
+
## Default Integrations
|
|
700
|
+
|
|
701
|
+
### Auto-Enabled Browser Integrations (9 total)
|
|
702
|
+
|
|
703
|
+
| Integration | Purpose | Key Config |
|
|
704
|
+
| ----------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
|
|
705
|
+
| `breadcrumbsIntegration` | Records breadcrumbs from console, DOM, fetch, XHR, history | `console`, `dom`, `fetch`, `history`, `xhr` |
|
|
706
|
+
| `browserApiErrorsIntegration` | Wraps `setTimeout`, `setInterval`, `requestAnimationFrame`, `addEventListener` in try/catch | `setTimeout`, `setInterval`, `requestAnimationFrame`, `eventTarget` |
|
|
707
|
+
| `browserSessionIntegration` | Tracks release health (session per page load / route change) | `lifecycle: "route" \| "page"` |
|
|
708
|
+
| `dedupeIntegration` | Prevents duplicate events from rapid-succession throws | None |
|
|
709
|
+
| `functionToStringIntegration` | Preserves original function names in wrapped stack traces | None |
|
|
710
|
+
| `globalHandlersIntegration` | Attaches `window.onerror` and `window.onunhandledrejection` | `onerror`, `onunhandledrejection` |
|
|
711
|
+
| `httpContextIntegration` | Attaches page URL, User-Agent, Referer to every event | None |
|
|
712
|
+
| `inboundFiltersIntegration` | Client-side filtering via `ignoreErrors`, `denyUrls`, `allowUrls` | Configured via top-level init options |
|
|
713
|
+
| `linkedErrorsIntegration` | Follows `error.cause` chain and attaches linked errors | `key: "cause"`, `limit: 5` |
|
|
714
|
+
|
|
715
|
+
### Modifying Default Integrations
|
|
716
|
+
|
|
717
|
+
```javascript
|
|
718
|
+
// Disable a single default integration by name
|
|
719
|
+
Sentry.init({
|
|
720
|
+
integrations: (defaults) => defaults.filter((i) => i.name !== "Breadcrumbs"),
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
// Reconfigure a default integration
|
|
724
|
+
Sentry.init({
|
|
725
|
+
integrations: [
|
|
726
|
+
Sentry.breadcrumbsIntegration({ console: false }),
|
|
727
|
+
Sentry.linkedErrorsIntegration({ limit: 10 }),
|
|
728
|
+
Sentry.globalHandlersIntegration({ onunhandledrejection: false }),
|
|
729
|
+
Sentry.browserSessionIntegration({ lifecycle: "page" }),
|
|
730
|
+
],
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
// Disable ALL defaults (start from scratch)
|
|
734
|
+
Sentry.init({
|
|
735
|
+
defaultIntegrations: false,
|
|
736
|
+
integrations: [Sentry.globalHandlersIntegration(), Sentry.linkedErrorsIntegration()],
|
|
737
|
+
});
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
### Adding Integrations After `init()`
|
|
741
|
+
|
|
742
|
+
```javascript
|
|
743
|
+
// Lazy-add after init
|
|
744
|
+
Sentry.addIntegration(Sentry.reportingObserverIntegration());
|
|
745
|
+
|
|
746
|
+
// Dynamic import from npm (recommended with bundlers)
|
|
747
|
+
const { captureConsoleIntegration } = await import("@sentry/browser");
|
|
748
|
+
Sentry.addIntegration(captureConsoleIntegration({ levels: ["error", "warn"] }));
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
---
|
|
752
|
+
|
|
753
|
+
## Transport
|
|
754
|
+
|
|
755
|
+
### Default Transport
|
|
756
|
+
|
|
757
|
+
The browser SDK uses a `fetch`-based transport.
|
|
758
|
+
Events are sent as POST requests to the Sentry ingestion endpoint.
|
|
759
|
+
|
|
760
|
+
### Offline Transport — IndexedDB Queue
|
|
761
|
+
|
|
762
|
+
Stores events when offline and replays them when the browser reconnects:
|
|
763
|
+
|
|
764
|
+
```javascript
|
|
765
|
+
import { makeBrowserOfflineTransport, makeFetchTransport } from "@sentry/browser";
|
|
766
|
+
import * as Sentry from "@sentry/browser";
|
|
767
|
+
|
|
768
|
+
Sentry.init({
|
|
769
|
+
dsn: "___PUBLIC_DSN___",
|
|
770
|
+
transport: makeBrowserOfflineTransport(makeFetchTransport),
|
|
771
|
+
});
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
### Tunneling — Bypass Ad-Blockers
|
|
775
|
+
|
|
776
|
+
Route all Sentry traffic through your own server endpoint:
|
|
777
|
+
|
|
778
|
+
```javascript
|
|
779
|
+
Sentry.init({
|
|
780
|
+
dsn: "___PUBLIC_DSN___", // Still required for header generation
|
|
781
|
+
tunnel: "https://myapp.com/sentry-tunnel",
|
|
782
|
+
});
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
Your server endpoint forwards the payload to Sentry’s ingestion URL. See
|
|
786
|
+
[Dealing with Ad-Blockers](https://docs.sentry.io/platforms/javascript/troubleshooting/#dealing-with-ad-blockers)
|
|
787
|
+
for a full tunneling server implementation.
|
|
788
|
+
|
|
789
|
+
### Custom Transport
|
|
790
|
+
|
|
791
|
+
```javascript
|
|
792
|
+
import { createTransport } from "@sentry/core";
|
|
793
|
+
import * as Sentry from "@sentry/browser";
|
|
794
|
+
|
|
795
|
+
function makeCustomFetchTransport(options) {
|
|
796
|
+
function makeRequest(request) {
|
|
797
|
+
return fetch(options.url, {
|
|
798
|
+
body: request.body,
|
|
799
|
+
method: "POST",
|
|
800
|
+
referrerPolicy: "origin",
|
|
801
|
+
headers: {
|
|
802
|
+
...options.headers,
|
|
803
|
+
"X-Custom-Header": "my-value",
|
|
804
|
+
},
|
|
805
|
+
}).then((response) => ({
|
|
806
|
+
statusCode: response.status,
|
|
807
|
+
headers: {
|
|
808
|
+
"x-sentry-rate-limits": response.headers.get("X-Sentry-Rate-Limits"),
|
|
809
|
+
"retry-after": response.headers.get("Retry-After"),
|
|
810
|
+
},
|
|
811
|
+
}));
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
return createTransport(options, makeRequest);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
Sentry.init({
|
|
818
|
+
dsn: "___PUBLIC_DSN___",
|
|
819
|
+
transport: makeCustomFetchTransport,
|
|
820
|
+
});
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
---
|
|
824
|
+
|
|
825
|
+
## Best Practices
|
|
826
|
+
|
|
827
|
+
- **Set user context after authentication** — call `Sentry.setUser()` after login
|
|
828
|
+
completes, not in `Sentry.init`.
|
|
829
|
+
- **Clear user on logout** — always call `Sentry.setUser(null)` when the user signs out.
|
|
830
|
+
- **Use `withScope` for per-event context** — avoid mutating the isolation scope for
|
|
831
|
+
temporary data.
|
|
832
|
+
- **Use tags for filterable data, context for debugging data** — tags are indexed;
|
|
833
|
+
context is not.
|
|
834
|
+
- **Filter noise early** — use `ignoreErrors` and `denyUrls` to drop known-bad events
|
|
835
|
+
before `beforeSend`.
|
|
836
|
+
- **Avoid capturing in render paths** — wrap Sentry calls in event handlers or
|
|
837
|
+
`try/catch` blocks.
|
|
838
|
+
- **Set `release` and `environment`** — required for source map resolution and
|
|
839
|
+
environment-aware alerting.
|
|
840
|
+
- **Use `beforeSend` for PII scrubbing** — never send emails, credit card numbers, or
|
|
841
|
+
passwords as tags/extra.
|
|
842
|
+
- **Use `{{ default }}` in fingerprints** to extend, not replace, Sentry’s grouping when
|
|
843
|
+
appropriate.
|
|
844
|
+
|
|
845
|
+
---
|
|
846
|
+
|
|
847
|
+
## Troubleshooting
|
|
848
|
+
|
|
849
|
+
| Issue | Solution |
|
|
850
|
+
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
851
|
+
| Errors from browser extensions captured | Add `/extensions\//i`, `/^chrome:\/\//i`, `/^safari-extension:\/\//i` to `denyUrls` |
|
|
852
|
+
| `ResizeObserver loop` flooding issues | Add `"ResizeObserver loop limit exceeded"` to `ignoreErrors` |
|
|
853
|
+
| Script errors with no details | Cross-origin scripts without CORS headers appear as `"Script error."` — add CORS headers or use `allowUrls` |
|
|
854
|
+
| Events sent twice | If using multiple `Sentry.init()` calls, only the first takes effect. Check for duplicate SDK instances. |
|
|
855
|
+
| `beforeSend` returning `null` but events still sent | Check `beforeSendTransaction` — it’s a separate hook for performance events |
|
|
856
|
+
| User context missing on events | Call `Sentry.setUser()` after authentication completes; verify it’s not being called before auth |
|
|
857
|
+
| `configureScope is not a function` | Deprecated in SDK v8. Replace with `getIsolationScope()` or `withScope()` |
|
|
858
|
+
| Tags not appearing on events | Verify the tag isn’t being overwritten by a built-in Sentry tag (`browser`, `os`, `url`, `environment`, `release`) |
|
|
859
|
+
| High event volume from known errors | Add patterns to `ignoreErrors` or use `sampleRate` to reduce volume |
|
|
860
|
+
| Unhandled rejections not captured | Verify `globalHandlersIntegration({ onunhandledrejection: true })` is active (it is by default) |
|
|
861
|
+
| `linkedErrorsIntegration` not showing cause chain | Requires `Error.cause` support — Chrome 93+, Firefox 91+. Ensure the SDK version is ≥7.0.0. |
|