@danieljvdm/dev-kit 1.0.1 → 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 +6 -29
- package/skill-sources.lock.json +23 -109
- 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 +11 -115
- package/skills/open-pull-request/agents/openai.yaml +3 -3
- 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,38 @@
|
|
|
1
|
+
# Profiling — What & Why
|
|
2
|
+
|
|
3
|
+
Code-level sampling of production execution.
|
|
4
|
+
Tracing tells you _which operation_ is slow; profiling tells you _which function and
|
|
5
|
+
line_ inside it is burning the time.
|
|
6
|
+
The output is a **flame graph**, also available as **differential** ("what got slower
|
|
7
|
+
between releases") views.
|
|
8
|
+
|
|
9
|
+
## What a flame graph represents
|
|
10
|
+
|
|
11
|
+
A flame graph aggregates many stack samples, and its two shapes have **different
|
|
12
|
+
x-axes**. In a single-profile graph X is time and **width = time spent**, so the
|
|
13
|
+
bottleneck is the deepest wide frame with high **self-time** (time in the function
|
|
14
|
+
itself, excluding children) — a wide frame with little self-time just means the cost is
|
|
15
|
+
in a child. In an **aggregated** graph X is not time; **width = how often a frame
|
|
16
|
+
appears** across samples.
|
|
17
|
+
Frames are colored **application vs.
|
|
18
|
+
system**: you can only act on your own code, so a wide _application_ frame is the
|
|
19
|
+
target, not a wide system frame.
|
|
20
|
+
A profile covers one thread at a time.
|
|
21
|
+
|
|
22
|
+
## Setup essentials
|
|
23
|
+
|
|
24
|
+
- **Modes:** **Continuous profiling** (backend; Python/Node today) and **UI profiling**
|
|
25
|
+
(frontend/mobile) are the current products; legacy transaction-based profiling is
|
|
26
|
+
being replaced.
|
|
27
|
+
- **The dependency to get right:** in the default **`manual` lifecycle** mode, profiling
|
|
28
|
+
runs _independently_ of tracing — you start/stop it explicitly
|
|
29
|
+
(`start_profiler`/`stop_profiler`), and nothing is collected until you do.
|
|
30
|
+
Only the optional **`trace` lifecycle** mode (and legacy transaction-based profiling)
|
|
31
|
+
require tracing on and sample relative to sampled transactions.
|
|
32
|
+
- **Sample, don’t profile everything** — ~1–5% CPU overhead; sampling is session-scoped.
|
|
33
|
+
Mind minimum SDK versions (support varies by platform).
|
|
34
|
+
|
|
35
|
+
## Related
|
|
36
|
+
|
|
37
|
+
- [`tracing.md`](tracing.md) — profiling localizes a bottleneck tracing pointed at.
|
|
38
|
+
- [`reduce-volume.md`](reduce-volume.md) — sampling/overhead tradeoffs.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Volume & Cost — Strategy
|
|
2
|
+
|
|
3
|
+
Sentry bills by the volume of each signal (errors, spans, replays, profiles), and logs
|
|
4
|
+
and metrics are billed by _size_ — so attribute count and message length matter, not
|
|
5
|
+
just event count. Reducing volume is keeping the data that earns its place and dropping
|
|
6
|
+
the rest — for quota _and_ for signal-to-noise.
|
|
7
|
+
|
|
8
|
+
## The core tradeoff, per signal
|
|
9
|
+
|
|
10
|
+
- **Errors:** sample _lightly_ or not at all — usually what you can’t afford to miss.
|
|
11
|
+
The cheapest win is **filtering known noise** (browser-extension errors, bots, a
|
|
12
|
+
specific bogus exception), not blanket down-sampling.
|
|
13
|
+
- **Spans / traces:** sample _aggressively_ — the highest-volume signal and biggest
|
|
14
|
+
lever. A `tracesSampler` that keeps important paths and drops health-check noise beats
|
|
15
|
+
a flat low rate. (Note `tracesSampleRate: 0` doesn’t disable tracing — see
|
|
16
|
+
[`tracing.md`](tracing.md).)
|
|
17
|
+
- **Replays / profiles:** keep the asymmetric/sampled defaults (high on error, low on
|
|
18
|
+
normal).
|
|
19
|
+
- **Logs / metrics:** billed by size — trim attribute count and message length, not just
|
|
20
|
+
event count, on top of emitting fewer, higher-signal events.
|
|
21
|
+
|
|
22
|
+
## Where to sample — head vs. server-side
|
|
23
|
+
|
|
24
|
+
- **Client / head sampling (SDK)** — decide before sending; cheapest, and the decision
|
|
25
|
+
propagates across a trace so you keep whole traces.
|
|
26
|
+
The first lever.
|
|
27
|
+
- **Server-side (Sentry)** — a backstop, and for what the SDK can’t cleanly decide:
|
|
28
|
+
- **Inbound data filters** — browser-extension errors, known crawlers, legacy
|
|
29
|
+
browsers, `localhost`, specific error messages or releases, by IP. (Some are
|
|
30
|
+
Business-plan.)
|
|
31
|
+
- **Per-DSN rate limits** — cap a noisy key.
|
|
32
|
+
**Spike protection** — an automatic guard against a sudden flood.
|
|
33
|
+
**Delete & Discard** — stop ingesting a specific high-volume issue entirely.
|
|
34
|
+
|
|
35
|
+
## A practical workflow
|
|
36
|
+
|
|
37
|
+
1. **Find the top offenders first** (MCP / Explore across errors, spans, and logs) —
|
|
38
|
+
don’t cut blind.
|
|
39
|
+
2. **Filter known noise** — high precision, no fidelity loss on real data.
|
|
40
|
+
3. **Tune span sampling** with a `tracesSampler` — the biggest lever.
|
|
41
|
+
4. **Set rate limits / spike protection** as a safety net.
|
|
42
|
+
5. **Re-measure** to confirm you cut noise, not signal.
|
|
43
|
+
|
|
44
|
+
## Related
|
|
45
|
+
|
|
46
|
+
- [`tracing.md`](tracing.md) — span sampling, the main lever.
|
|
47
|
+
- [`logging.md`](logging.md)
|
|
48
|
+
- [`session-replay.md`](session-replay.md)
|
|
49
|
+
- [`profiling.md`](profiling.md)
|
|
@@ -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).
|