@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,43 @@
|
|
|
1
|
+
# Releases — What & Why
|
|
2
|
+
|
|
3
|
+
A **release** is a version of your code deployed to an environment.
|
|
4
|
+
Tying every event to its exact version unlocks:
|
|
5
|
+
|
|
6
|
+
- **Regression detection** — when an issue first appeared and whether it came back in a
|
|
7
|
+
later release.
|
|
8
|
+
- **Crash-free rates / release health** — error-free sessions and users per release
|
|
9
|
+
(session tracking is on by default in most modern SDKs).
|
|
10
|
+
- **Suspect commits** — the specific commit(s) likely responsible for an issue, surfaced
|
|
11
|
+
on the issue with a suggested assignee.
|
|
12
|
+
- **Resolve-in-next-release** and **`Fixes SENTRY-XXX`** — resolve an issue and let
|
|
13
|
+
Sentry track whether it stays fixed in the version that ships the fix.
|
|
14
|
+
|
|
15
|
+
## While debugging
|
|
16
|
+
|
|
17
|
+
Releases let you pin the exact code that was running when an issue was produced — diff
|
|
18
|
+
against that revision rather than assuming `main` matches — and **suspect commits** on
|
|
19
|
+
the issue are the fastest “what changed.”
|
|
20
|
+
Suspect commits need the source-control integration below; without it you still get
|
|
21
|
+
release-scoped regression and health, just not the culprit commit.
|
|
22
|
+
|
|
23
|
+
## Setup essentials — two ingredients
|
|
24
|
+
|
|
25
|
+
1. **The `release` (and `environment`) tag on events** — set in the SDK `init` (or
|
|
26
|
+
`SENTRY_RELEASE`). Without it every event is “unknown release” and regression/health
|
|
27
|
+
features can’t work.
|
|
28
|
+
2. **The release object + commits + deploy, created in CI** — via `sentry-cli` or the
|
|
29
|
+
GitHub Action. **Associating commits is what powers suspect commits**, and that
|
|
30
|
+
association needs a **source-control integration** (GitHub/GitLab) connected in
|
|
31
|
+
Sentry’s UI (an OAuth step the agent can’t do).
|
|
32
|
+
The **release name must match** between the SDK tag and the CI-created release, or
|
|
33
|
+
events won’t attribute.
|
|
34
|
+
|
|
35
|
+
Use a meaningful, unique version (a commit SHA or semver), set `environment` so staging
|
|
36
|
+
noise doesn’t pollute prod health, and finalize the release + record the deploy at
|
|
37
|
+
deploy time.
|
|
38
|
+
|
|
39
|
+
## Related
|
|
40
|
+
|
|
41
|
+
- [`monitors.md`](monitors.md) — release-health / crash-rate monitors build on this.
|
|
42
|
+
- [`search-query-language.md`](../search-query-language.md) — `release`, `firstRelease`,
|
|
43
|
+
`release.stage`.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Session Replay — What & Why
|
|
2
|
+
|
|
3
|
+
A reconstruction of a user session around an error or UX problem.
|
|
4
|
+
On **web** it’s rebuilt from DOM snapshots and events (rrweb — _not_ a screen
|
|
5
|
+
recording), so it’s lightweight; on **mobile** it’s a view-hierarchy reconstruction plus
|
|
6
|
+
periodic screenshots, with more aggressive default redaction.
|
|
7
|
+
Replays link to the errors, traces, and rage/dead clicks in the same session.
|
|
8
|
+
It’s a **frontend/mobile** signal — there’s nothing to replay on a backend.
|
|
9
|
+
|
|
10
|
+
## What a replay adds over a stack trace
|
|
11
|
+
|
|
12
|
+
A replay is the _user’s path_, timestamp-synced to everything else in the session — the
|
|
13
|
+
clicks, navigations, network calls, and console output that led to the error, not just
|
|
14
|
+
the frame where it threw.
|
|
15
|
+
Two UX signals live here that never surface as exceptions: a **dead click** (a click
|
|
16
|
+
that produces no response within ~7s) and a **rage click** (the repeated-click subset) —
|
|
17
|
+
and these are promoted to their own **issues**, so a real UX problem can exist with no
|
|
18
|
+
exception behind it.
|
|
19
|
+
|
|
20
|
+
## Setup essentials
|
|
21
|
+
|
|
22
|
+
- **Two sample rates, asymmetric:** keep `replaysOnErrorSampleRate` **high** (often
|
|
23
|
+
`1.0` — you want a replay for any session that errored) and `replaysSessionSampleRate`
|
|
24
|
+
**low** (a few percent — capturing every healthy session is expensive).
|
|
25
|
+
- **Privacy.** Defaults **mask all text and block media** — start there; use mask/block
|
|
26
|
+
selectors to redact sensitive fields before unmasking anything globally, and treat
|
|
27
|
+
network request/response **body capture as opt-in**. Mobile redacts more aggressively
|
|
28
|
+
by default; still review sensitive screens.
|
|
29
|
+
|
|
30
|
+
## Related
|
|
31
|
+
|
|
32
|
+
- [`data-scrubbing.md`](data-scrubbing.md)
|
|
33
|
+
- [`reduce-volume.md`](reduce-volume.md)
|
|
34
|
+
- [`search-query-language.md`](../search-query-language.md) — replay properties
|
|
35
|
+
(`count_rage_clicks`, `click.*`, `count_errors`, …).
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Tracing & Performance — What & Why
|
|
2
|
+
|
|
3
|
+
## What it is
|
|
4
|
+
|
|
5
|
+
Distributed tracing reconstructs one request as it flows across frontend, backend, and
|
|
6
|
+
downstream services.
|
|
7
|
+
A trace is a tree of **spans** — each a timed operation (an HTTP request, a DB query, a
|
|
8
|
+
function call) with a name, duration, parent, and attributes.
|
|
9
|
+
The root span is the **transaction**. Tracing answers _why_ something is slow, and it’s
|
|
10
|
+
the substrate Sentry uses to **automatically detect performance issues** — N+1 queries,
|
|
11
|
+
slow DB calls, render-blocking assets, consecutive HTTP calls (detection requires
|
|
12
|
+
tracing on).
|
|
13
|
+
|
|
14
|
+
## What a trace shows
|
|
15
|
+
|
|
16
|
+
A trace is a waterfall of spans nested by ancestry, and the shape _is_ the diagnosis:
|
|
17
|
+
the widest span — or a gap between spans — is where the time went (a slow query, a
|
|
18
|
+
blocking upstream call), which the stack trace alone can’t tell you.
|
|
19
|
+
A trace is also a cross-issue view: an error inside it links to its issue, and the real
|
|
20
|
+
root cause can be a _different_ issue in the same request — a frontend exception, say,
|
|
21
|
+
driven by a failing span in the backend service upstream.
|
|
22
|
+
Two shapes to read correctly — a dashed/orphan span means a transaction is **missing**
|
|
23
|
+
(unsent, sampled out, rate-limited), usually from a low sample rate rather than a real
|
|
24
|
+
gap; multiple roots usually means a custom-instrumentation trace-ID bug.
|
|
25
|
+
A span also carries its profile, the bridge down to the function level.
|
|
26
|
+
|
|
27
|
+
## Setup essentials
|
|
28
|
+
|
|
29
|
+
- **Sampling is the main cost/signal lever** (trace volume dwarfs errors).
|
|
30
|
+
`tracesSampleRate` is a flat fraction (start 5–20% in prod); `tracesSampler` is a
|
|
31
|
+
function returning a per-transaction rate — use it to sample _down_ noise (health
|
|
32
|
+
checks) and _up_ the paths you care about.
|
|
33
|
+
**`tracesSampleRate: 0` does not disable tracing** — it keeps tracing enabled but
|
|
34
|
+
samples nothing; omit the sampling config entirely to truly disable.
|
|
35
|
+
The head-of-trace sampling decision propagates downstream, so you capture whole
|
|
36
|
+
traces, not fragments.
|
|
37
|
+
- **Cross-service:** add your API domains to `tracePropagationTargets` so the SDK
|
|
38
|
+
attaches trace headers (`sentry-trace`, `baggage`, and the newer `traceparent`) on
|
|
39
|
+
outbound requests, and allow those headers via CORS — or propagation silently fails
|
|
40
|
+
and you get two disconnected traces.
|
|
41
|
+
- **Instrument boundaries first** (incoming/outbound HTTP, DB / cache / queue — mostly
|
|
42
|
+
auto-instrumented), add custom spans for meaningful business operations, and keep span
|
|
43
|
+
names **low-cardinality and templated** (`GET /users/:id`, not `/users/12345`) with
|
|
44
|
+
searchable attributes rather than baking values into the name.
|
|
45
|
+
Follow Sentry’s semantic conventions for span and attribute names.
|
|
46
|
+
The instrument skill lists the domain references under Semantic conventions; open only
|
|
47
|
+
the one you need (for example `references/semantics/http.md`).
|
|
48
|
+
|
|
49
|
+
## Related
|
|
50
|
+
|
|
51
|
+
- [`profiling.md`](profiling.md)
|
|
52
|
+
- [`reduce-volume.md`](reduce-volume.md) — sampling is the main lever.
|
|
53
|
+
- [`search-query-language.md`](../search-query-language.md) — span properties for
|
|
54
|
+
querying traces.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# User Feedback — What & Why
|
|
2
|
+
|
|
3
|
+
Qualitative reports from real users, linked to Sentry context — the surrounding error,
|
|
4
|
+
replay, trace, release, and user.
|
|
5
|
+
The one signal that captures _what the human thinks went wrong_, which the machine
|
|
6
|
+
signals can’t tell you.
|
|
7
|
+
|
|
8
|
+
## What a feedback entry is worth
|
|
9
|
+
|
|
10
|
+
Its value is the **linked context**, not the prose.
|
|
11
|
+
A feedback entry carries a pivot to the moment it’s about: a widget submission attaches
|
|
12
|
+
the user’s replay (roughly the minute before they hit submit) and the page URL; a
|
|
13
|
+
crash-report submission links straight to the **issue**. So feedback is a way _into_ the
|
|
14
|
+
machine signals from the human side — and it surfaces as its own issue category
|
|
15
|
+
(`Feedback`) rather than living in a separate silo.
|
|
16
|
+
|
|
17
|
+
## Setup essentials — three mechanisms
|
|
18
|
+
|
|
19
|
+
- **Feedback widget** (browser only) — an embeddable, auto-injectable button/form with
|
|
20
|
+
an optional screenshot.
|
|
21
|
+
The default for web.
|
|
22
|
+
- **`captureFeedback` API** — programmatic; the cross-platform path
|
|
23
|
+
(mobile/desktop/backend) and when you want control over your own UI.
|
|
24
|
+
- **Crash-report modal** — prompts for detail right after an error fires; the practical
|
|
25
|
+
option where there’s no persistent UI to host a widget.
|
|
26
|
+
|
|
27
|
+
Decide required fields and screenshots up front (more fields = fewer but richer
|
|
28
|
+
submissions), **route feedback somewhere actionable** (Slack / Jira / an alert) so it
|
|
29
|
+
isn’t a black hole, and apply replay-grade masking to screenshots — they capture
|
|
30
|
+
whatever is on screen.
|
|
31
|
+
|
|
32
|
+
## Related
|
|
33
|
+
|
|
34
|
+
- [`session-replay.md`](session-replay.md)
|
|
35
|
+
- [`data-scrubbing.md`](data-scrubbing.md)
|
|
36
|
+
- [`search-query-language.md`](../search-query-language.md) — user-feedback properties.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Debug files — Android (ProGuard/R8, NDK)
|
|
2
|
+
|
|
3
|
+
Two independent artifact families, and a release build usually needs both:
|
|
4
|
+
|
|
5
|
+
- **ProGuard/R8 mapping** — undoes name obfuscation in Kotlin/Java frames (`a.b.c()` →
|
|
6
|
+
real names).
|
|
7
|
+
- **Native symbols (`.so`)** — symbolicates NDK/C++ frames.
|
|
8
|
+
Only relevant if the app ships native code.
|
|
9
|
+
|
|
10
|
+
## Path A — the Sentry Gradle plugin (preferred)
|
|
11
|
+
|
|
12
|
+
The plugin uploads on release builds, so it can’t be forgotten at release time.
|
|
13
|
+
The plugin id and the dependency wiring live in `sdks/android/index.md`; the
|
|
14
|
+
upload-related options in the `sentry {}` block are:
|
|
15
|
+
|
|
16
|
+
```groovy
|
|
17
|
+
sentry {
|
|
18
|
+
org = "YOUR_ORG_SLUG"
|
|
19
|
+
projectName = "YOUR_PROJECT_SLUG"
|
|
20
|
+
authToken = System.getenv("SENTRY_AUTH_TOKEN")
|
|
21
|
+
|
|
22
|
+
// Kotlin/Java deobfuscation
|
|
23
|
+
autoUploadProguardMapping = true
|
|
24
|
+
|
|
25
|
+
// Code context next to frames
|
|
26
|
+
includeSourceContext = true
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
For an app with native code, also enable native symbol upload (`uploadNativeSymbols`,
|
|
31
|
+
plus the matching include-sources option for native).
|
|
32
|
+
Check the plugin’s own documentation for the current option names before adding them —
|
|
33
|
+
the native options have changed across plugin majors, and a wrong name is silently
|
|
34
|
+
ignored rather than failing the build.
|
|
35
|
+
|
|
36
|
+
`authToken` from `System.getenv` keeps the secret out of the build file.
|
|
37
|
+
A gitignored `sentry.properties` also works.
|
|
38
|
+
|
|
39
|
+
## Path B — the wizard
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
npx @sentry/wizard@latest -i android
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Interactive, so the **user** runs it.
|
|
46
|
+
It handles login, org/project selection, the Gradle plugin, the DSN, and ProGuard/R8
|
|
47
|
+
mapping upload.
|
|
48
|
+
|
|
49
|
+
## Path C — manual `sentry-cli`
|
|
50
|
+
|
|
51
|
+
For builds the plugin can’t be added to.
|
|
52
|
+
The mapping file is produced by R8 at `app/build/outputs/mapping/<variant>/mapping.txt`,
|
|
53
|
+
and it must be uploaded with the **UUID that the app reports**, so the plugin path is
|
|
54
|
+
strongly preferred — doing this by hand means managing that UUID in
|
|
55
|
+
`AndroidManifest.xml` yourself and keeping it in sync with each upload.
|
|
56
|
+
Reach for it only when Gradle-plugin adoption is genuinely blocked, and read the current
|
|
57
|
+
sentry-cli docs for the exact `debug-files upload` invocation for mappings.
|
|
58
|
+
|
|
59
|
+
## Traps
|
|
60
|
+
|
|
61
|
+
| Symptom | Cause | Fix |
|
|
62
|
+
| --------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
|
|
63
|
+
| Frames still obfuscated after a release build | `autoUploadProguardMapping` not enabled, or minification runs in a variant the plugin doesn’t cover | Enable it; confirm the release variant is the one shipped |
|
|
64
|
+
| Debug builds look fine, release doesn’t | Expected — obfuscation only runs for release | Always test symbolication on a release build |
|
|
65
|
+
| Kotlin frames readable, native frames not | Only the mapping was uploaded | Enable native symbol upload |
|
|
66
|
+
| Nothing uploads, build green | Token unset — see `../auth-token.md` | Add `SENTRY_AUTH_TOKEN` to the build environment |
|
|
67
|
+
| Worked, then stopped after a version bump | Plugin option renamed across a major, now silently ignored | Re-check option names against the plugin docs for your version |
|
|
68
|
+
| Frames readable, no code context | `includeSourceContext` off | Enable it and re-check a new event |
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Debug files — Apple (iOS, macOS, tvOS, watchOS, visionOS)
|
|
2
|
+
|
|
3
|
+
Native crashes arrive as addresses.
|
|
4
|
+
Symbolication needs the **dSYM** bundle produced by the build that shipped — a different
|
|
5
|
+
dSYM won’t do, because the UUID must match.
|
|
6
|
+
|
|
7
|
+
## Prerequisite: the build must produce dSYMs
|
|
8
|
+
|
|
9
|
+
Xcode only emits them when the build setting is right:
|
|
10
|
+
|
|
11
|
+
- **`DEBUG_INFORMATION_FORMAT`** = `DWARF with dSYM File`. This is the default for
|
|
12
|
+
**Release** only — a Debug-configuration build produces no dSYM, so a crash from it
|
|
13
|
+
can’t be symbolicated this way.
|
|
14
|
+
- **`ENABLE_USER_SCRIPT_SANDBOXING`** = `NO`, or an upload build phase can’t read the
|
|
15
|
+
dSYM directory.
|
|
16
|
+
|
|
17
|
+
## Path A — the wizard (preferred)
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
brew install getsentry/tools/sentry-wizard && sentry-wizard -i ios
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Interactive (browser login), so the **user** runs it.
|
|
24
|
+
It sets up the auth token, the SDK, and the dSYM upload build phase — which is the part
|
|
25
|
+
that’s easy to get wrong by hand.
|
|
26
|
+
|
|
27
|
+
## Path B — an Xcode Run Script build phase
|
|
28
|
+
|
|
29
|
+
Add a Run Script phase after the compile/archive steps:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
sentry-cli debug-files upload --include-sources "$DWARF_DSYM_FOLDER_PATH"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `$DWARF_DSYM_FOLDER_PATH` is provided by Xcode and points at the dSYMs for this build.
|
|
36
|
+
- `--include-sources` bundles source snippets so Sentry can show code context next to
|
|
37
|
+
native frames. Omit it if your source can’t leave the build machine.
|
|
38
|
+
- Supply `SENTRY_ORG`, `SENTRY_PROJECT`, and `SENTRY_AUTH_TOKEN` to the phase’s
|
|
39
|
+
environment (or a gitignored `sentry.properties`).
|
|
40
|
+
- Add `--force-foreground` while debugging the phase — the upload otherwise backgrounds
|
|
41
|
+
itself and its output can be lost from the build log.
|
|
42
|
+
|
|
43
|
+
For the phase’s input file list, the per-executable dSYM path is:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${EXECUTABLE_NAME}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Path C — Fastlane
|
|
50
|
+
|
|
51
|
+
If the project already uses Fastlane, upload there instead of in Xcode:
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
sentry_debug_files_upload(
|
|
55
|
+
auth_token: ENV["SENTRY_AUTH_TOKEN"],
|
|
56
|
+
org_slug: "your-org",
|
|
57
|
+
project_slug: "your-project",
|
|
58
|
+
include_sources: true
|
|
59
|
+
)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Self-hosted Sentry: export `SENTRY_URL`, or pass `url:` to the Fastlane action.
|
|
63
|
+
|
|
64
|
+
## Path D — after the fact, from App Store Connect
|
|
65
|
+
|
|
66
|
+
When Apple processes the build (or the shipped dSYMs were never uploaded), fetch them
|
|
67
|
+
and upload separately.
|
|
68
|
+
Fastlane’s `download_dsyms` handles the fetch; then run the same
|
|
69
|
+
`sentry-cli debug-files upload` against the downloaded path.
|
|
70
|
+
|
|
71
|
+
Uploading alone does not change the crash you’re already looking at — symbolication runs
|
|
72
|
+
at ingest, so the stored event keeps the frames it was processed with.
|
|
73
|
+
Unlike source maps, though, native events can be **reprocessed**: trigger it from the
|
|
74
|
+
issue and Sentry re-runs symbolication against the debug files it now has.
|
|
75
|
+
Three things to know before you do — wait at least an hour after the upload (the
|
|
76
|
+
internal caches must expire first), reprocessed events count against quota a second
|
|
77
|
+
time, and issue alerts don’t fire for them.
|
|
78
|
+
See [Reprocessing](https://docs.sentry.io/product/issues/reprocessing/).
|
|
79
|
+
|
|
80
|
+
## Verifying the artifact side
|
|
81
|
+
|
|
82
|
+
`sentry-cli debug-files` can confirm what Sentry has before you re-run the app.
|
|
83
|
+
Sentry’s issue view also lists the debug images an event needed and whether each was
|
|
84
|
+
found — that list, not the build log, is the authority on whether the right UUID
|
|
85
|
+
arrived.
|
|
86
|
+
|
|
87
|
+
## Traps
|
|
88
|
+
|
|
89
|
+
| Symptom | Cause | Fix |
|
|
90
|
+
| ---------------------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------- |
|
|
91
|
+
| No dSYM anywhere in the build output | Debug configuration, or `DEBUG_INFORMATION_FORMAT` set to DWARF-only | Set `DWARF with dSYM File`; symbolicate release builds |
|
|
92
|
+
| Build phase fails reading the dSYM dir | User script sandboxing on | `ENABLE_USER_SCRIPT_SANDBOXING = NO` |
|
|
93
|
+
| Uploads succeed, crash still unsymbolicated | UUID mismatch — a rebuild produced a new binary after the upload | Upload from the archive that shipped; don’t rebuild between |
|
|
94
|
+
| Frames symbolicated, no source lines | `--include-sources` not used | Add it, re-upload, check a new event |
|
|
95
|
+
| Works locally, not on CI/Xcode Cloud | Token or org/project env missing in the CI build environment | Add them as CI secrets |
|
|
96
|
+
| Only your code is unsymbolicated; system frames fine | Sentry symbolicates OS frames itself; yours need your dSYM | Nothing about system symbols to fix — chase your own upload |
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Debug files — .NET (Portable PDB)
|
|
2
|
+
|
|
3
|
+
.NET fails differently from JavaScript and native, and the difference matters for
|
|
4
|
+
triage: method names survive.
|
|
5
|
+
What goes missing is the **file name and line number**. A frame that reads
|
|
6
|
+
`MyApp.Services.Checkout.Charge()` with no `Checkout.cs:118` after it is this problem —
|
|
7
|
+
the trace isn’t unreadable, it’s unlocatable.
|
|
8
|
+
Don’t go looking for a minification story that doesn’t exist.
|
|
9
|
+
|
|
10
|
+
The artifact is the **PDB** the build already produces — Portable PDB on modern .NET,
|
|
11
|
+
supported by Sentry since 22.11.0 (sentry-cli 2.8.0).
|
|
12
|
+
|
|
13
|
+
## Path A — MSBuild (preferred)
|
|
14
|
+
|
|
15
|
+
The Sentry NuGet package bundles sentry-cli and can upload during the build.
|
|
16
|
+
Both upload properties default to **`false`**, so a project that installed the SDK and
|
|
17
|
+
did nothing else uploads nothing — this is the normal starting state, not a broken
|
|
18
|
+
config.
|
|
19
|
+
|
|
20
|
+
```xml
|
|
21
|
+
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
|
22
|
+
<SentryOrg>YOUR_ORG_SLUG</SentryOrg>
|
|
23
|
+
<SentryProject>YOUR_PROJECT_SLUG</SentryProject>
|
|
24
|
+
<SentryUploadSymbols>true</SentryUploadSymbols>
|
|
25
|
+
<SentryUploadSources>true</SentryUploadSources>
|
|
26
|
+
</PropertyGroup>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- `SentryUploadSources` is the source-context switch — file/line without it, surrounding
|
|
30
|
+
code with it. Omit it if your source can’t leave the build machine.
|
|
31
|
+
- Condition on `Release`. An unconditional block uploads on every local Debug build.
|
|
32
|
+
- `UseSentryCLI` (default `true`) disables the bundled CLI outright; if something in the
|
|
33
|
+
build sets it to `false`, nothing uploads regardless of the properties above.
|
|
34
|
+
|
|
35
|
+
The wider property block — release creation and commit association — lives in
|
|
36
|
+
`sdks/dotnet/index.md` as ordinary SDK config.
|
|
37
|
+
This file covers the upload itself.
|
|
38
|
+
|
|
39
|
+
## Path B — sentry-cli directly
|
|
40
|
+
|
|
41
|
+
For a publish pipeline that doesn’t run the Sentry MSBuild targets:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
sentry-cli debug-files upload --include-sources <path-to-build-output>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Same command as every other native platform — to sentry-cli a PDB is just another
|
|
48
|
+
debug-file format.
|
|
49
|
+
|
|
50
|
+
## Auth
|
|
51
|
+
|
|
52
|
+
Don’t inline the token in the project file.
|
|
53
|
+
`SentryAuthToken` exists as an MSBuild property but is discouraged for exactly that
|
|
54
|
+
reason.
|
|
55
|
+
|
|
56
|
+
- **Workstation:** `sentry-cli login` stores credentials in `~/.sentryclirc`.
|
|
57
|
+
- **CI:** set `SENTRY_AUTH_TOKEN` from the platform’s secret store.
|
|
58
|
+
- **Docker:** BuildKit’s `--secret`, so the token never persists into an image layer.
|
|
59
|
+
|
|
60
|
+
Details in [`../auth-token.md`](../auth-token.md).
|
|
61
|
+
|
|
62
|
+
## Traps
|
|
63
|
+
|
|
64
|
+
| Symptom | Cause | Fix |
|
|
65
|
+
| --------------------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
66
|
+
| Method names present, no file/line | Symbols never uploaded — both properties default to `false` | Set `SentryUploadSymbols`; this is the default state, not a misconfiguration |
|
|
67
|
+
| File/line present, no surrounding code | `SentryUploadSources` off | Turn it on, then check a **new** event |
|
|
68
|
+
| Build log shows no upload and no error | `SentryOrg`/`SentryProject` unset, or `UseSentryCLI=false` | Supply both slugs — the upload is silent when it has nowhere to send |
|
|
69
|
+
| No `.pdb` in the build output to upload | `DebugType` is `none`, or `embedded` (which emits no separate file) | Confirm what the build actually produces before debugging the upload |
|
|
70
|
+
| Works locally, not on CI | `SENTRY_AUTH_TOKEN` missing from the CI environment | Add it as a CI secret |
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Debug files — Flutter / Dart
|
|
2
|
+
|
|
3
|
+
Unreadable Dart frames come from **obfuscation**, and the fix is to keep the artifacts
|
|
4
|
+
that undo it — the split debug info and the obfuscation map — then upload them with
|
|
5
|
+
`sentry_dart_plugin`. A Flutter app that also ships native code needs the platform debug
|
|
6
|
+
files too.
|
|
7
|
+
|
|
8
|
+
## Step 1 — Build so the artifacts exist
|
|
9
|
+
|
|
10
|
+
Obfuscation and debug info are opt-in build flags, and the plugin can only upload what
|
|
11
|
+
the build wrote:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Android
|
|
15
|
+
flutter build apk \
|
|
16
|
+
--release \
|
|
17
|
+
--obfuscate \
|
|
18
|
+
--split-debug-info=build/debug-info \
|
|
19
|
+
--extra-gen-snapshot-options=--save-obfuscation-map=build/app/obfuscation.map.json
|
|
20
|
+
dart run sentry_dart_plugin
|
|
21
|
+
|
|
22
|
+
# iOS
|
|
23
|
+
flutter build ipa \
|
|
24
|
+
--release \
|
|
25
|
+
--obfuscate \
|
|
26
|
+
--split-debug-info=build/debug-info \
|
|
27
|
+
--extra-gen-snapshot-options=--save-obfuscation-map=build/app/obfuscation.map.json
|
|
28
|
+
dart run sentry_dart_plugin
|
|
29
|
+
|
|
30
|
+
# Web
|
|
31
|
+
flutter build web --release --source-maps
|
|
32
|
+
dart run sentry_dart_plugin
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
If you are **not** obfuscating, Dart frames are generally readable already and this
|
|
36
|
+
whole path is unnecessary — confirm that before adding flags.
|
|
37
|
+
|
|
38
|
+
## Step 2 — Configure and run `sentry_dart_plugin`
|
|
39
|
+
|
|
40
|
+
The plugin is configured from `pubspec.yaml` (a `sentry:` section carrying org, project,
|
|
41
|
+
and the upload toggles) and reads `SENTRY_AUTH_TOKEN` from the environment.
|
|
42
|
+
Consult the plugin’s own docs for the current key names before writing that block — they
|
|
43
|
+
differ across plugin majors, and a misspelled key is ignored rather than reported.
|
|
44
|
+
|
|
45
|
+
Run it **after** each build, as shown above.
|
|
46
|
+
That ordering is the whole contract: the build writes `build/debug-info` and the
|
|
47
|
+
obfuscation map, the plugin uploads them.
|
|
48
|
+
|
|
49
|
+
## Native layers
|
|
50
|
+
|
|
51
|
+
Flutter apps with native code inherit the platform pipelines: `apple.md` for dSYM,
|
|
52
|
+
`android.md` for ProGuard/R8 and NDK symbols.
|
|
53
|
+
The Dart obfuscation map does not symbolicate a native crash, and native debug files do
|
|
54
|
+
not de-obfuscate Dart frames.
|
|
55
|
+
|
|
56
|
+
## Traps
|
|
57
|
+
|
|
58
|
+
| Symptom | Cause | Fix |
|
|
59
|
+
| --------------------------------------------------- | --------------------------------------------------------------------------- | -------------------------------------------------- |
|
|
60
|
+
| Dart frames unreadable on release, fine in debug | Release build obfuscates | Build with the flags above and run the plugin |
|
|
61
|
+
| Plugin runs, uploads nothing | Build didn’t emit debug info — missing `--split-debug-info` / `--obfuscate` | Add the flags; re-run the plugin after the build |
|
|
62
|
+
| Uploads happen, frames unchanged | Plugin ran against a different build than the one shipped | Build and upload in the same CI job, in that order |
|
|
63
|
+
| Dart frames fixed, native crash still raw addresses | Native debug files not uploaded | Follow `apple.md` / `android.md` |
|
|
64
|
+
| Web frames minified | Built without `--source-maps` | Rebuild with it, re-run the plugin |
|
|
65
|
+
| Config edits have no effect | Key name wrong for the installed plugin version | Check the plugin docs for your version |
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Debug artifacts — making stack traces readable
|
|
2
|
+
|
|
3
|
+
Frames that read `chunk-4f2a.js:1:28471` or `0x00000001045a2f10` cost you the thing
|
|
4
|
+
Sentry is for.
|
|
5
|
+
Fixing them means uploading the artifact that maps compiled output back to
|
|
6
|
+
source. Two families:
|
|
7
|
+
|
|
8
|
+
- **Source maps** — JavaScript/TypeScript, minified or bundled by a build step.
|
|
9
|
+
- **Debug files** — native and mobile: dSYM (Apple), ProGuard/R8 mappings (Android),
|
|
10
|
+
`.so` symbols (NDK), Dart obfuscation maps (Flutter).
|
|
11
|
+
|
|
12
|
+
This group is read from three directions: while setting Sentry up for the first time (so
|
|
13
|
+
real-user traces are readable, not just the local test error), while adding
|
|
14
|
+
instrumentation, and when someone arrives with an unreadable trace already in hand.
|
|
15
|
+
Start here, route to the platform file.
|
|
16
|
+
|
|
17
|
+
## First: which failure is it?
|
|
18
|
+
|
|
19
|
+
Three different problems look identical in a stack trace and have different fixes.
|
|
20
|
+
If an event already exists, read it before touching build config.
|
|
21
|
+
|
|
22
|
+
| What you see | What it means | Go to |
|
|
23
|
+
| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | --------------------------------------- |
|
|
24
|
+
| Minified/obfuscated frames, hex addresses, nothing uploaded for this build | No artifacts exist | the platform file below |
|
|
25
|
+
| Sentry found artifacts but frames stay unreadable; missing Debug ID or mismatched release/dist | Artifacts don’t match the event | [`matching.md`](matching.md) |
|
|
26
|
+
| Some frames readable, others not — often native frames inside an otherwise fine trace | A second artifact family is missing | the platform file for _that_ family |
|
|
27
|
+
| Readable file/line but no surrounding code shown | Source context wasn’t uploaded (separate from symbolication) | the platform file’s source-context note |
|
|
28
|
+
| Method names read fine, but no file names or line numbers | .NET without PDBs — a different failure from minification | [`dotnet.md`](dotnet.md) |
|
|
29
|
+
|
|
30
|
+
Two facts that change the answer, worth establishing early:
|
|
31
|
+
|
|
32
|
+
- **Was the event from a release build?** Dev builds are usually readable already —
|
|
33
|
+
don’t send someone after source maps for a local `next dev` trace.
|
|
34
|
+
- **Did the upload happen before the event?** Artifacts uploaded afterward do not
|
|
35
|
+
retroactively fix a stored event on their own — confirm any fix on a **new** event.
|
|
36
|
+
The one exception is native/Apple events, which can be
|
|
37
|
+
[reprocessed](https://docs.sentry.io/product/issues/reprocessing/) to apply debug
|
|
38
|
+
files after the fact.
|
|
39
|
+
Source maps have no equivalent.
|
|
40
|
+
|
|
41
|
+
## Platform routing
|
|
42
|
+
|
|
43
|
+
| Platform | Family | Read |
|
|
44
|
+
| ------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------ |
|
|
45
|
+
| Browser, Node, Next.js, React, Svelte, Nest, Cloudflare, TanStack Start, React Router | Source maps | [`javascript.md`](javascript.md) |
|
|
46
|
+
| Apple — iOS, macOS, tvOS, watchOS, visionOS | dSYM | [`apple.md`](apple.md) |
|
|
47
|
+
| Android — Kotlin/Java, NDK | ProGuard/R8 mapping, `.so` symbols | [`android.md`](android.md) |
|
|
48
|
+
| React Native / Expo | **Both** — JS source maps _and_ native debug files | [`react-native.md`](react-native.md) |
|
|
49
|
+
| Flutter / Dart | Obfuscation map + native debug files (+ web source maps) | [`flutter.md`](flutter.md) |
|
|
50
|
+
| .NET — ASP.NET Core, MAUI, WPF, WinForms, Azure Functions | Portable PDB | [`dotnet.md`](dotnet.md) |
|
|
51
|
+
| Python, Ruby, PHP, Go, Elixir | Usually none — frames come from readable source | see below |
|
|
52
|
+
|
|
53
|
+
Every path needs an auth token: [`../auth-token.md`](../auth-token.md).
|
|
54
|
+
It is the single most common reason a correct-looking setup uploads nothing.
|
|
55
|
+
|
|
56
|
+
For the last row, unreadable frames are rarely an artifact problem.
|
|
57
|
+
Check that the deployed code matches what you’re reading, that the app isn’t running
|
|
58
|
+
from a stripped or packed build (PyInstaller, Go built with `-ldflags "-s -w"`), and
|
|
59
|
+
that source context is enabled.
|
|
60
|
+
Don’t invent a source-map step for a language that doesn’t have one.
|
|
61
|
+
|
|
62
|
+
## Where the build-tool config lives
|
|
63
|
+
|
|
64
|
+
The bundler-plugin options, the Gradle `sentry {}` block, and the wizard invocations are
|
|
65
|
+
documented per platform in that platform’s `sdks/<slug>/index.md`, as ordinary SDK
|
|
66
|
+
configuration. Use it for the config; use this group for what it doesn’t cover — the
|
|
67
|
+
token, artifact matching, native upload mechanics, and CI placement.
|
|
68
|
+
|
|
69
|
+
## Confirming a fix
|
|
70
|
+
|
|
71
|
+
Symbolication is proven only by a **new** event from a build that had upload wired in:
|
|
72
|
+
build and deploy, trigger a fresh error, then check the frames.
|
|
73
|
+
Re-reading the old event will show it still minified, which is correct and not a failure
|
|
74
|
+
of the fix — reprocessing, where it’s available, is a separate step you have to ask for.
|
|
75
|
+
The loop is in [`setup-verification.md`](../setup-verification.md).
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Source maps — JavaScript / TypeScript
|
|
2
|
+
|
|
3
|
+
Applies to browser, Node, and every JS framework SDK. The per-framework plugin config
|
|
4
|
+
lives in that platform’s `sdks/<slug>/index.md`; this file covers what the build has to
|
|
5
|
+
produce, the CI-friendly fallback, and the traps.
|
|
6
|
+
|
|
7
|
+
## Two things must both be true
|
|
8
|
+
|
|
9
|
+
1. **The build emits source maps.** No maps, nothing to upload.
|
|
10
|
+
Bundlers disable them in production by default.
|
|
11
|
+
2. **The maps reach Sentry, tied to the built files.** Modern SDKs do this with **Debug
|
|
12
|
+
IDs** — a unique id injected into both the minified file and its map, so matching
|
|
13
|
+
doesn’t depend on release names, paths, or URLs.
|
|
14
|
+
|
|
15
|
+
Emitting maps is a per-bundler setting (`build.sourcemap` in Vite, `devtool` in webpack,
|
|
16
|
+
`productionBrowserSourceMaps` / framework plugin defaults in Next.js).
|
|
17
|
+
Prefer **hidden** maps for browser builds — generated and uploaded, but without the
|
|
18
|
+
`//# sourceMappingURL` comment that points browsers at them:
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// vite.config.ts
|
|
22
|
+
export default defineConfig({
|
|
23
|
+
build: { sourcemap: "hidden" },
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Path A — the bundler plugin (preferred)
|
|
28
|
+
|
|
29
|
+
`@sentry/vite-plugin`, `@sentry/webpack-plugin`, `@sentry/rollup-plugin`,
|
|
30
|
+
`@sentry/esbuild-plugin`, or the framework wrapper that embeds one (`withSentryConfig`
|
|
31
|
+
for Next.js, the SvelteKit and Nuxt plugins).
|
|
32
|
+
The plugin injects Debug IDs, uploads on production builds, and can delete the maps
|
|
33
|
+
afterward so they don’t ship to users.
|
|
34
|
+
Read the platform’s `index.md` for the exact snippet; all of them take the same three
|
|
35
|
+
values from the environment — `SENTRY_ORG`, `SENTRY_PROJECT`, `SENTRY_AUTH_TOKEN`.
|
|
36
|
+
|
|
37
|
+
Two options worth setting deliberately:
|
|
38
|
+
|
|
39
|
+
- **Delete maps after upload** — keeps `.map` files out of the deployed bundle while
|
|
40
|
+
still uploading them.
|
|
41
|
+
Do this for public web apps.
|
|
42
|
+
- **Widen the upload** (Next.js `widenClientFileUpload: true`) — uploads more client
|
|
43
|
+
files, which fixes frames that otherwise land in framework-internal chunks.
|
|
44
|
+
|
|
45
|
+
## Path B — `sentry-cli` (CI, custom builds, plain Node)
|
|
46
|
+
|
|
47
|
+
When there’s no supported bundler or the build is bespoke.
|
|
48
|
+
Two steps, in order — inject first, then upload:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
sentry-cli sourcemaps inject ./dist
|
|
52
|
+
sentry-cli sourcemaps upload ./dist
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`inject` writes the Debug IDs; `upload` sends the files.
|
|
56
|
+
Running `upload` alone still works but falls back to legacy release/path matching, which
|
|
57
|
+
is far more fragile.
|
|
58
|
+
Wire both into the build script so they can’t drift apart:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsc && sentry-cli sourcemaps inject ./dist && sentry-cli sourcemaps upload ./dist"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Path C — the wizard
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
npx @sentry/wizard@latest -i sourcemaps
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Detects the bundler, installs the right plugin, and sets up the token.
|
|
75
|
+
It is interactive (browser login), so the **user** runs it, not the agent.
|
|
76
|
+
Note it configures upload only — it does not initialize the SDK.
|
|
77
|
+
|
|
78
|
+
## Node specifics
|
|
79
|
+
|
|
80
|
+
Server-side frames need the maps for the _compiled output that runs_ (`./dist`,
|
|
81
|
+
`.next/server`), not the TypeScript sources.
|
|
82
|
+
If you run TypeScript directly (`tsx`, `ts-node`, Bun), frames are usually already
|
|
83
|
+
readable and no upload is needed — confirm that before adding a build step nobody needs.
|
|
84
|
+
|
|
85
|
+
## Traps
|
|
86
|
+
|
|
87
|
+
| Symptom | Cause | Fix |
|
|
88
|
+
| ----------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ |
|
|
89
|
+
| Nothing uploaded, build green | Maps not emitted, or token unset | Enable `sourcemap` in the bundler; see `../auth-token.md` |
|
|
90
|
+
| Uploaded, frames still minified | Upload ran without `inject`, so no Debug IDs | Add `sourcemaps inject` before `upload` |
|
|
91
|
+
| Only _some_ frames readable | Partial upload — a chunk or the framework’s own bundle wasn’t included | Widen the upload path / `widenClientFileUpload` |
|
|
92
|
+
| Was fine, broke after a deploy | Upload happens after deploy, or a build cache reused stale maps | Move upload into the build, before deploy |
|
|
93
|
+
| `.map` files served to users | Maps emitted with `sourceMappingURL` and not deleted | Use `hidden` maps + delete-after-upload |
|
|
94
|
+
| Frames readable but no code context | Only maps uploaded; source content missing from them | Ensure the bundler embeds `sourcesContent` (usually default) |
|