@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,628 @@
|
|
|
1
|
+
# Tracing — Sentry Next.js SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `@sentry/nextjs` ≥8.0.0\
|
|
4
|
+
> `withServerActionInstrumentation`: ≥8.0.0\
|
|
5
|
+
> `enableLongAnimationFrame`: ≥8.18.0\
|
|
6
|
+
> `ignoreSpans`: ≥10.2.0
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## How Tracing Is Activated
|
|
11
|
+
|
|
12
|
+
Tracing is enabled by setting **`tracesSampleRate`** or **`tracesSampler`** in all three
|
|
13
|
+
runtime config files.
|
|
14
|
+
Without one of these, no spans are created.
|
|
15
|
+
|
|
16
|
+
| Config file | Runtime | What it traces |
|
|
17
|
+
| --------------------------- | ------- | -------------------------------------------------------------- |
|
|
18
|
+
| `instrumentation-client.ts` | Browser | Page loads, navigations, fetch/XHR, Web Vitals, INP |
|
|
19
|
+
| `sentry.server.config.ts` | Node.js | API routes, RSC renders, `getServerSideProps`, background work |
|
|
20
|
+
| `sentry.edge.config.ts` | Edge | Next.js middleware |
|
|
21
|
+
|
|
22
|
+
> ⚠️ **All three must have tracing configured.** Missing one means that runtime produces
|
|
23
|
+
> no spans.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## `tracesSampleRate` — Uniform Sampling
|
|
28
|
+
|
|
29
|
+
A number between `0.0` and `1.0`. Set the same option in all three configs:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// Recommended: 100% in development, lower in production
|
|
33
|
+
tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1,
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
> **To disable tracing entirely:** omit both `tracesSampleRate` and `tracesSampler`.
|
|
37
|
+
> Setting `tracesSampleRate: 0` is not the same — it still activates instrumentation but
|
|
38
|
+
> sends nothing.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## `tracesSampler` — Dynamic Per-Request Sampling
|
|
43
|
+
|
|
44
|
+
When defined, `tracesSampler` takes **precedence** over `tracesSampleRate`. Receives a
|
|
45
|
+
`SamplingContext` and returns a number (0–1) or boolean.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// TypeScript: SamplingContext shape
|
|
49
|
+
interface SamplingContext {
|
|
50
|
+
name: string; // e.g. "GET /api/users"
|
|
51
|
+
attributes: SpanAttributes | undefined;
|
|
52
|
+
parentSampled: boolean | undefined; // parent's sampling decision
|
|
53
|
+
parentSampleRate: number | undefined;
|
|
54
|
+
inheritOrSampleWith: (fallbackRate: number) => number;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Route-Based Sampling
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
Sentry.init({
|
|
62
|
+
tracesSampler: ({ name, inheritOrSampleWith }) => {
|
|
63
|
+
// Always drop health checks
|
|
64
|
+
if (name.includes("/health") || name.includes("/ping")) return 0;
|
|
65
|
+
|
|
66
|
+
// Always sample critical flows
|
|
67
|
+
if (name.includes("/checkout") || name.includes("/payment")) return 1.0;
|
|
68
|
+
|
|
69
|
+
// Sample admin routes at 50%
|
|
70
|
+
if (name.includes("/admin")) return 0.5;
|
|
71
|
+
|
|
72
|
+
// For everything else: honor parent's decision, fall back to 10%
|
|
73
|
+
return inheritOrSampleWith(0.1);
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### With Parent Trace Inheritance
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
Sentry.init({
|
|
82
|
+
tracesSampler: ({ name, parentSampled, inheritOrSampleWith }) => {
|
|
83
|
+
if (name.includes("healthcheck")) return 0;
|
|
84
|
+
if (name.includes("auth")) return 1;
|
|
85
|
+
// inheritOrSampleWith: respects parent decision if present, else uses fallback
|
|
86
|
+
return inheritOrSampleWith(0.5);
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Why use `inheritOrSampleWith` instead of checking `parentSampled` directly?**\
|
|
92
|
+
It ensures consistent rates flow through distributed traces, enables accurate metric
|
|
93
|
+
extrapolation, and sets the correct `sentry-sampled` value in downstream `baggage`.
|
|
94
|
+
|
|
95
|
+
### Sampling Precedence
|
|
96
|
+
|
|
97
|
+
1. `tracesSampler` function (if defined) — evaluated first
|
|
98
|
+
2. Parent’s sampling decision (propagated via `sentry-trace` header)
|
|
99
|
+
3. `tracesSampleRate` (uniform fallback)
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Auto-Instrumented Operations
|
|
104
|
+
|
|
105
|
+
### Client-Side (Browser)
|
|
106
|
+
|
|
107
|
+
| Operation | Op | What’s captured |
|
|
108
|
+
| ---------------------- | ------------------------- | --------------------------------------------------------- |
|
|
109
|
+
| Initial page load | `pageload` | LCP, CLS, FCP, TTFB Web Vitals; resource load child spans |
|
|
110
|
+
| Client-side navigation | `navigation` | Route change duration; child fetch/XHR spans |
|
|
111
|
+
| `fetch()` requests | `http.client` | URL, method, status code, duration, HTTP timings |
|
|
112
|
+
| `XMLHttpRequest` | `http.client` | Same as fetch |
|
|
113
|
+
| User interactions | `ui.interaction` | INP (Interaction to Next Paint) — emitted on page hide |
|
|
114
|
+
| Long Tasks (> 50ms) | `ui.long-task` | Main-thread blocking events |
|
|
115
|
+
| Long Animation Frames | `ui.long-animation-frame` | LoAF rendering work — SDK ≥8.18.0 |
|
|
116
|
+
|
|
117
|
+
### Server-Side (Node.js)
|
|
118
|
+
|
|
119
|
+
| Operation | Op | Notes |
|
|
120
|
+
| --------------------------------- | ------------- | ---------------------------------------- |
|
|
121
|
+
| API route handlers (App Router) | `http.server` | `app/api/*/route.ts` — auto-instrumented |
|
|
122
|
+
| API route handlers (Pages Router) | `http.server` | `pages/api/*.ts` — auto-instrumented |
|
|
123
|
+
| React Server Components | `http.server` | RSC render times |
|
|
124
|
+
| `getServerSideProps` | `http.server` | Pages Router SSR data fetching |
|
|
125
|
+
| Edge Middleware | `http.server` | Via `sentry.edge.config.ts` |
|
|
126
|
+
|
|
127
|
+
> ⚠️ **Server Actions are NOT auto-instrumented.** Wrap each with
|
|
128
|
+
> `withServerActionInstrumentation()` — see below.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## `browserTracingIntegration` Options
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// instrumentation-client.ts
|
|
136
|
+
Sentry.init({
|
|
137
|
+
integrations: [
|
|
138
|
+
Sentry.browserTracingIntegration({
|
|
139
|
+
// Page Load & Navigation
|
|
140
|
+
instrumentPageLoad: true, // default: true
|
|
141
|
+
instrumentNavigation: true, // default: true
|
|
142
|
+
|
|
143
|
+
// HTTP spans
|
|
144
|
+
traceFetch: true, // default: true
|
|
145
|
+
traceXHR: true, // default: true
|
|
146
|
+
enableHTTPTimings: true, // default: true
|
|
147
|
+
shouldCreateSpanForRequest: (url) => !url.includes("/health"),
|
|
148
|
+
|
|
149
|
+
// Performance observations
|
|
150
|
+
enableLongTask: true, // default: true
|
|
151
|
+
enableLongAnimationFrame: true, // default: true (SDK ≥8.18.0)
|
|
152
|
+
enableInp: true, // INP spans
|
|
153
|
+
|
|
154
|
+
// Span lifecycle
|
|
155
|
+
idleTimeout: 1000, // ms: wait after last child before ending
|
|
156
|
+
finalTimeout: 30000, // ms: hard cap on span duration
|
|
157
|
+
childSpanTimeout: 15000, // ms: max time for child spans
|
|
158
|
+
|
|
159
|
+
// Span naming — parameterize URLs
|
|
160
|
+
beforeStartSpan: (context) => ({
|
|
161
|
+
...context,
|
|
162
|
+
name: context.name.replace(/\/\d+/g, "/<id>"),
|
|
163
|
+
}),
|
|
164
|
+
|
|
165
|
+
// Span filtering
|
|
166
|
+
ignoreResourceSpans: ["resource.css", "resource.script", "resource.img"],
|
|
167
|
+
}),
|
|
168
|
+
],
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Custom Spans
|
|
175
|
+
|
|
176
|
+
### `Sentry.startSpan()` — Active, Auto-Ending (Recommended)
|
|
177
|
+
|
|
178
|
+
Wraps a block of work.
|
|
179
|
+
The span becomes active (children nest under it) and ends automatically when the
|
|
180
|
+
callback returns or resolves:
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// Async
|
|
184
|
+
const data = await Sentry.startSpan(
|
|
185
|
+
{
|
|
186
|
+
name: "fetchUserProfile",
|
|
187
|
+
op: "http.client",
|
|
188
|
+
attributes: { "user.id": userId, "cache.hit": false },
|
|
189
|
+
},
|
|
190
|
+
async () => {
|
|
191
|
+
const res = await fetch(`/api/users/${userId}`);
|
|
192
|
+
return res.json();
|
|
193
|
+
},
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
// Sync
|
|
197
|
+
const result = Sentry.startSpan({ name: "computeRecommendations", op: "function" }, () =>
|
|
198
|
+
expensiveComputation(),
|
|
199
|
+
);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Nested Spans (Parent–Child Hierarchy)
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
await Sentry.startSpan({ name: "checkout-flow", op: "function" }, async () => {
|
|
206
|
+
// These are automatically children of "checkout-flow"
|
|
207
|
+
const cart = await Sentry.startSpan({ name: "fetchCart", op: "db.query" }, () =>
|
|
208
|
+
db.cart.findUnique({ where: { userId } }),
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
const payment = await Sentry.startSpan({ name: "processPayment", op: "http.client" }, () =>
|
|
212
|
+
stripe.paymentIntents.create({ amount: cart.total }),
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
return { cart, payment };
|
|
216
|
+
});
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### `Sentry.startSpanManual()` — Active, Manual End
|
|
220
|
+
|
|
221
|
+
Use when the span lifetime cannot be enclosed in a callback:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
function authMiddleware(req: Request, res: Response, next: NextFunction) {
|
|
225
|
+
return Sentry.startSpanManual({ name: "auth.verify", op: "middleware" }, (span) => {
|
|
226
|
+
res.once("finish", () => {
|
|
227
|
+
span.setStatus({ code: res.statusCode < 400 ? 1 : 2 });
|
|
228
|
+
span.end(); // ← required
|
|
229
|
+
});
|
|
230
|
+
return next();
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### `Sentry.startInactiveSpan()` — Not Active, Manual End
|
|
236
|
+
|
|
237
|
+
Creates a span that is **never** automatically made active.
|
|
238
|
+
Use for parallel work or event-based tracking:
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
// Parallel independent operations
|
|
242
|
+
const spanA = Sentry.startInactiveSpan({ name: "operation-a" });
|
|
243
|
+
const spanB = Sentry.startInactiveSpan({ name: "operation-b" });
|
|
244
|
+
|
|
245
|
+
await Promise.all([doA(), doB()]);
|
|
246
|
+
|
|
247
|
+
spanA.end();
|
|
248
|
+
spanB.end();
|
|
249
|
+
|
|
250
|
+
// Explicit parent assignment
|
|
251
|
+
const parent = Sentry.startInactiveSpan({ name: "parent" });
|
|
252
|
+
const child = Sentry.startInactiveSpan({ name: "child", parentSpan: parent });
|
|
253
|
+
child.end();
|
|
254
|
+
parent.end();
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Browser: `setActiveSpanInBrowser()` — Persistent Active Span
|
|
258
|
+
|
|
259
|
+
When a callback-based API isn’t practical (e.g., UI event handlers), keep a span active
|
|
260
|
+
across event calls. Available since SDK v10.15.0:
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
let checkoutSpan: Sentry.Span | undefined;
|
|
264
|
+
|
|
265
|
+
onCheckoutStart(() => {
|
|
266
|
+
checkoutSpan = Sentry.startInactiveSpan({ name: "checkout-flow" });
|
|
267
|
+
Sentry.setActiveSpanInBrowser(checkoutSpan);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
onCheckoutComplete(() => {
|
|
271
|
+
checkoutSpan?.end();
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
> ⚠️ `setActiveSpanInBrowser` is **browser-only**.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Span Options Reference
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
interface StartSpanOptions {
|
|
283
|
+
name: string; // Required: label shown in the UI
|
|
284
|
+
op?: string; // Operation category (see table below)
|
|
285
|
+
attributes?: Record<string, string | number | boolean>;
|
|
286
|
+
parentSpan?: Span; // Override automatic parent
|
|
287
|
+
onlyIfParent?: boolean; // Skip span if no active parent exists
|
|
288
|
+
forceTransaction?: boolean; // Force display as root transaction in UI
|
|
289
|
+
startTime?: number; // Unix timestamp in seconds
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Common `op` values:**
|
|
294
|
+
|
|
295
|
+
| `op` | Use for |
|
|
296
|
+
| --------------------------------- | ---------------------------------------- |
|
|
297
|
+
| `http.client` | Outgoing HTTP requests (fetch, XHR) |
|
|
298
|
+
| `http.server` | Incoming HTTP requests (API routes, SSR) |
|
|
299
|
+
| `db` / `db.query` | Database queries |
|
|
300
|
+
| `db.redis` | Redis operations |
|
|
301
|
+
| `function` | General function calls |
|
|
302
|
+
| `ui.render` | Component render time |
|
|
303
|
+
| `ui.action.click` | Click event handling |
|
|
304
|
+
| `cache.get` / `cache.put` | Cache reads/writes |
|
|
305
|
+
| `queue.publish` / `queue.process` | Message queue operations |
|
|
306
|
+
| `task` | Background / scheduled work |
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## Span Enrichment
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// Set attributes on the currently active span
|
|
314
|
+
const span = Sentry.getActiveSpan();
|
|
315
|
+
if (span) {
|
|
316
|
+
span.setAttribute("db.table", "users");
|
|
317
|
+
span.setAttributes({
|
|
318
|
+
"http.method": "POST",
|
|
319
|
+
"order.total": 99.99,
|
|
320
|
+
"user.tier": "premium",
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// Status: 0=unset, 1=ok, 2=error
|
|
324
|
+
span.setStatus({ code: 1 });
|
|
325
|
+
span.setStatus({ code: 2, message: "Payment declined" });
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Rename a span at runtime
|
|
329
|
+
const span = Sentry.getActiveSpan();
|
|
330
|
+
if (span) Sentry.updateSpanName(span, "GET /users/:id");
|
|
331
|
+
|
|
332
|
+
// Modify all spans globally before sending
|
|
333
|
+
Sentry.init({
|
|
334
|
+
beforeSendSpan(span) {
|
|
335
|
+
span.data = {
|
|
336
|
+
...span.data,
|
|
337
|
+
"deployment.region": process.env.AWS_REGION ?? "unknown",
|
|
338
|
+
};
|
|
339
|
+
return span; // return null to drop (but prefer ignoreSpans for that)
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Server Actions — `withServerActionInstrumentation()`
|
|
347
|
+
|
|
348
|
+
Server Actions are not auto-instrumented.
|
|
349
|
+
Wrap each with `withServerActionInstrumentation()`:
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
// app/actions/order.ts
|
|
353
|
+
"use server";
|
|
354
|
+
import * as Sentry from "@sentry/nextjs";
|
|
355
|
+
import { headers } from "next/headers";
|
|
356
|
+
|
|
357
|
+
export async function createOrder(formData: FormData) {
|
|
358
|
+
return Sentry.withServerActionInstrumentation(
|
|
359
|
+
"createOrder", // Action name (becomes span name)
|
|
360
|
+
{
|
|
361
|
+
headers: await headers(), // Enables distributed trace continuation
|
|
362
|
+
formData, // Logged as span data
|
|
363
|
+
recordResponse: true, // Capture the return value
|
|
364
|
+
},
|
|
365
|
+
async () => {
|
|
366
|
+
const order = await db.orders.create({
|
|
367
|
+
data: { items: formData.get("items"), userId: getCurrentUser() },
|
|
368
|
+
});
|
|
369
|
+
return { success: true, orderId: order.id };
|
|
370
|
+
},
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**Options:**
|
|
376
|
+
|
|
377
|
+
| Option | Type | Description |
|
|
378
|
+
| ---------------- | ---------- | --------------------------------------------------------------------------- |
|
|
379
|
+
| `formData` | `FormData` | Logged with the span |
|
|
380
|
+
| `headers` | `Headers` | Required for distributed trace continuation — always pass `await headers()` |
|
|
381
|
+
| `recordResponse` | `boolean` | Whether to capture the return value as span data |
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Distributed Tracing
|
|
386
|
+
|
|
387
|
+
### How It Works
|
|
388
|
+
|
|
389
|
+
Sentry injects two HTTP headers into outgoing requests:
|
|
390
|
+
|
|
391
|
+
| Header | Format | Purpose |
|
|
392
|
+
| -------------- | -------------------------------- | ------------------------------------ |
|
|
393
|
+
| `sentry-trace` | `{traceId}-{spanId}-{sampled}` | Carries trace context |
|
|
394
|
+
| `baggage` | W3C Baggage with `sentry-*` keys | Carries sampling decision + metadata |
|
|
395
|
+
|
|
396
|
+
Backends must allowlist these headers for CORS:
|
|
397
|
+
|
|
398
|
+
```
|
|
399
|
+
Access-Control-Allow-Headers: sentry-trace, baggage
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### `tracePropagationTargets`
|
|
403
|
+
|
|
404
|
+
Controls which outgoing requests get trace headers.
|
|
405
|
+
Accepts strings (substring match) and/or RegExp:
|
|
406
|
+
|
|
407
|
+
```typescript
|
|
408
|
+
// instrumentation-client.ts
|
|
409
|
+
Sentry.init({
|
|
410
|
+
tracePropagationTargets: [
|
|
411
|
+
"localhost", // any URL containing "localhost"
|
|
412
|
+
/^https:\/\/api\.yourapp\.com/, // your API
|
|
413
|
+
/^https:\/\/auth\.yourapp\.com/, // auth service
|
|
414
|
+
/^\//, // all same-origin relative paths
|
|
415
|
+
],
|
|
416
|
+
});
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Default:** `['localhost', /^\//]` — only localhost and same-origin requests.\
|
|
420
|
+
**Disable entirely:** `tracePropagationTargets: []`
|
|
421
|
+
|
|
422
|
+
> ⚠️ If your API is at `http://localhost:3001`, use `"localhost:3001"` or a regex
|
|
423
|
+
> matching the port — `"localhost"` alone won’t match.
|
|
424
|
+
|
|
425
|
+
### Automatic SSR → Client Trace Continuation
|
|
426
|
+
|
|
427
|
+
When Next.js server-renders a page, Sentry emits trace context as `<meta>` tags in
|
|
428
|
+
`<head>`. The browser SDK reads them automatically to continue the same trace:
|
|
429
|
+
|
|
430
|
+
```html
|
|
431
|
+
<!-- Auto-injected by Next.js SDK — no configuration needed -->
|
|
432
|
+
<meta name="sentry-trace" content="12345678...-1234567890123456-1" />
|
|
433
|
+
<meta name="baggage" content="sentry-trace_id=12345678...,sentry-sample_rate=0.1,..." />
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
This means a single distributed trace spans the server render **and** subsequent
|
|
437
|
+
client-side activity.
|
|
438
|
+
|
|
439
|
+
### Manual Trace Propagation (Non-HTTP Channels)
|
|
440
|
+
|
|
441
|
+
For WebSockets, message queues, or other protocols:
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
// Sender — extract current trace context
|
|
445
|
+
const traceData = Sentry.getTraceData();
|
|
446
|
+
// Returns: { "sentry-trace": "...", "baggage": "..." }
|
|
447
|
+
|
|
448
|
+
webSocket.send(
|
|
449
|
+
JSON.stringify({
|
|
450
|
+
payload: myData,
|
|
451
|
+
_sentryMeta: {
|
|
452
|
+
sentryTrace: traceData["sentry-trace"],
|
|
453
|
+
baggage: traceData["baggage"],
|
|
454
|
+
},
|
|
455
|
+
}),
|
|
456
|
+
);
|
|
457
|
+
|
|
458
|
+
// Receiver — continue the trace
|
|
459
|
+
const { sentryTrace, baggage } = message._sentryMeta;
|
|
460
|
+
|
|
461
|
+
Sentry.continueTrace({ sentryTrace, baggage }, () => {
|
|
462
|
+
return Sentry.startSpan({ name: "handleWebSocketMessage" }, () => {
|
|
463
|
+
processMessage(message);
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Head-Based Sampling
|
|
469
|
+
|
|
470
|
+
The originating (head) service makes the sampling decision.
|
|
471
|
+
That decision propagates to all downstream services via `sentry-trace`. All services
|
|
472
|
+
either all sample or all drop the trace — ensuring complete traces, never partial ones.
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
## Advanced Span APIs
|
|
477
|
+
|
|
478
|
+
### `continueTrace()` — Continue Incoming Trace
|
|
479
|
+
|
|
480
|
+
```typescript
|
|
481
|
+
// When receiving trace headers from a message queue, cron trigger, etc.
|
|
482
|
+
Sentry.continueTrace(
|
|
483
|
+
{
|
|
484
|
+
sentryTrace: incomingHeaders["sentry-trace"],
|
|
485
|
+
baggage: incomingHeaders["baggage"],
|
|
486
|
+
},
|
|
487
|
+
() => {
|
|
488
|
+
return Sentry.startSpan({ name: "processJob", op: "function" }, () => doWork());
|
|
489
|
+
},
|
|
490
|
+
);
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### `startNewTrace()` — Force a New Trace
|
|
494
|
+
|
|
495
|
+
```typescript
|
|
496
|
+
// Break the distributed chain — start a completely independent trace
|
|
497
|
+
Sentry.startNewTrace(() => {
|
|
498
|
+
return Sentry.startSpan({ name: "isolated-operation" }, () => doWork());
|
|
499
|
+
});
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### `suppressTracing()` — Prevent Span Capture
|
|
503
|
+
|
|
504
|
+
```typescript
|
|
505
|
+
// Prevent spans inside this callback from being sent to Sentry
|
|
506
|
+
const result = Sentry.suppressTracing(() => {
|
|
507
|
+
return fetch("/internal/health"); // No span created
|
|
508
|
+
});
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### `getActiveSpan()`, `getRootSpan()`
|
|
512
|
+
|
|
513
|
+
```typescript
|
|
514
|
+
const span = Sentry.getActiveSpan();
|
|
515
|
+
if (span) {
|
|
516
|
+
span.setAttribute("custom.key", "value");
|
|
517
|
+
const root = Sentry.getRootSpan(span);
|
|
518
|
+
console.log(Sentry.spanToJSON(root).name);
|
|
519
|
+
}
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### `withActiveSpan()` — Run Code with a Specific Active Span
|
|
523
|
+
|
|
524
|
+
```typescript
|
|
525
|
+
const mySpan = Sentry.startInactiveSpan({ name: "background-task" });
|
|
526
|
+
|
|
527
|
+
await Sentry.withActiveSpan(mySpan, async (scope) => {
|
|
528
|
+
scope.setTag("task.type", "email");
|
|
529
|
+
await sendEmails(); // Errors associate with mySpan
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
mySpan.end();
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### `forceTransaction` and `onlyIfParent`
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
// Forces span to appear as root transaction in Sentry UI
|
|
539
|
+
Sentry.startSpan({ name: "background-job", op: "function", forceTransaction: true }, () =>
|
|
540
|
+
runBackgroundJob(),
|
|
541
|
+
);
|
|
542
|
+
|
|
543
|
+
// Only creates span when an active parent exists (drops orphan spans)
|
|
544
|
+
Sentry.startSpan({ name: "optional-metric", onlyIfParent: true }, () => measureSomething());
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### Browser Flat Span Hierarchy
|
|
548
|
+
|
|
549
|
+
In browsers, all child spans are attached flat to the root span by default.
|
|
550
|
+
To opt into true nesting (use with care — can produce incorrect data with concurrent
|
|
551
|
+
async operations):
|
|
552
|
+
|
|
553
|
+
```typescript
|
|
554
|
+
Sentry.init({
|
|
555
|
+
parentSpanIsAlwaysRootSpan: false,
|
|
556
|
+
});
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
---
|
|
560
|
+
|
|
561
|
+
## Complete Config Example (All Three Runtimes)
|
|
562
|
+
|
|
563
|
+
```typescript
|
|
564
|
+
// instrumentation-client.ts (Browser)
|
|
565
|
+
import * as Sentry from "@sentry/nextjs";
|
|
566
|
+
|
|
567
|
+
Sentry.init({
|
|
568
|
+
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
|
|
569
|
+
environment: process.env.NODE_ENV,
|
|
570
|
+
|
|
571
|
+
integrations: [
|
|
572
|
+
Sentry.browserTracingIntegration({
|
|
573
|
+
shouldCreateSpanForRequest: (url) => !url.match(/\/health$/),
|
|
574
|
+
}),
|
|
575
|
+
],
|
|
576
|
+
|
|
577
|
+
tracesSampler: ({ name, inheritOrSampleWith }) => {
|
|
578
|
+
if (name.includes("health")) return 0;
|
|
579
|
+
if (name.includes("/checkout")) return 1.0;
|
|
580
|
+
return inheritOrSampleWith(0.1);
|
|
581
|
+
},
|
|
582
|
+
|
|
583
|
+
tracePropagationTargets: ["localhost", /^https:\/\/api\.myapp\.com/],
|
|
584
|
+
});
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
```typescript
|
|
588
|
+
// sentry.server.config.ts (Node.js)
|
|
589
|
+
import * as Sentry from "@sentry/nextjs";
|
|
590
|
+
|
|
591
|
+
Sentry.init({
|
|
592
|
+
dsn: process.env.SENTRY_DSN,
|
|
593
|
+
environment: process.env.NODE_ENV,
|
|
594
|
+
|
|
595
|
+
tracesSampler: ({ name, inheritOrSampleWith }) => {
|
|
596
|
+
if (name.includes("healthcheck")) return 0;
|
|
597
|
+
return inheritOrSampleWith(0.1);
|
|
598
|
+
},
|
|
599
|
+
});
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
```typescript
|
|
603
|
+
// sentry.edge.config.ts (Edge)
|
|
604
|
+
import * as Sentry from "@sentry/nextjs";
|
|
605
|
+
|
|
606
|
+
Sentry.init({
|
|
607
|
+
dsn: process.env.SENTRY_DSN,
|
|
608
|
+
tracesSampleRate: 0.1,
|
|
609
|
+
});
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Troubleshooting
|
|
615
|
+
|
|
616
|
+
| Issue | Solution |
|
|
617
|
+
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
|
|
618
|
+
| No transactions in Performance dashboard | Verify `tracesSampleRate` or `tracesSampler` is set; confirm it’s set in all three runtime configs |
|
|
619
|
+
| Server Actions not traced | Wrap each with `withServerActionInstrumentation()`; it’s not auto-instrumented |
|
|
620
|
+
| Distributed trace not linking frontend → backend | Add backend URL to `tracePropagationTargets`; verify `Access-Control-Allow-Headers: sentry-trace, baggage` on the backend |
|
|
621
|
+
| SSR page load not linked to server trace | This is automatic — verify both client and server use the same DSN |
|
|
622
|
+
| API requests missing `sentry-trace` header | Check CORS preflight — backend must allow `sentry-trace` and `baggage` |
|
|
623
|
+
| Transaction names show raw URLs (`/users/42`) | Use `beforeStartSpan` to parameterize: replace `/\d+/g` with `/<id>` |
|
|
624
|
+
| `tracesSampler` not working | When both `tracesSampler` and `tracesSampleRate` are set, `tracesSampler` wins — expected behavior |
|
|
625
|
+
| Spans missing after async gap (browser) | Browser uses flat hierarchy; use `startInactiveSpan` with explicit `parentSpan` across async boundaries |
|
|
626
|
+
| `tracePropagationTargets` port not matching | `"localhost"` won’t match `localhost:3001` — use `"localhost:3001"` or a regex |
|
|
627
|
+
| High transaction volume | Use `tracesSampler` to return `0` for health checks; lower default rate with `inheritOrSampleWith(0.02)` |
|
|
628
|
+
| Server-only spans not appearing | Verify `instrumentation.ts` exports `onRequestError = Sentry.captureRequestError` and loads the server config |
|