@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,214 @@
|
|
|
1
|
+
# Profiling — Sentry Flutter SDK
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK:** `sentry_flutter` ≥ **7.12.0**\
|
|
4
|
+
> **Status:** ⚠️ **Alpha** — API may change without a major version bump\
|
|
5
|
+
> **Platforms:** **iOS and macOS only** — Android, Web, Linux, Windows not supported
|
|
6
|
+
|
|
7
|
+
Profiling samples the Dart and native call stack at regular intervals to surface hot
|
|
8
|
+
code paths and slow functions.
|
|
9
|
+
It requires tracing to be enabled — only transactions that are sampled can be profiled.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Table of Contents
|
|
14
|
+
|
|
15
|
+
1. [How Profiling Works](#1-how-profiling-works)
|
|
16
|
+
2. [Basic Setup](#2-basic-setup)
|
|
17
|
+
3. [What Data Is Captured](#3-what-data-is-captured)
|
|
18
|
+
4. [Performance Overhead](#4-performance-overhead)
|
|
19
|
+
5. [Configuration Reference](#5-configuration-reference)
|
|
20
|
+
6. [Known Limitations](#6-known-limitations)
|
|
21
|
+
7. [Troubleshooting](#7-troubleshooting)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 1. How Profiling Works
|
|
26
|
+
|
|
27
|
+
When a transaction is sampled for profiling, the SDK starts sampling the call stack at a
|
|
28
|
+
fixed interval for the duration of that transaction.
|
|
29
|
+
The profile is attached to the transaction and uploaded to Sentry alongside it.
|
|
30
|
+
|
|
31
|
+
### Sampling relationship
|
|
32
|
+
|
|
33
|
+
`profilesSampleRate` is **relative to `tracesSampleRate`**, not to all transactions:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
All transactions
|
|
37
|
+
└── × tracesSampleRate → Traced transactions
|
|
38
|
+
└── × profilesSampleRate → Profiled transactions
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Example: `tracesSampleRate: 0.2` + `profilesSampleRate: 0.5` → 10% of all transactions
|
|
42
|
+
are profiled.
|
|
43
|
+
|
|
44
|
+
### Platform constraint
|
|
45
|
+
|
|
46
|
+
The Flutter profiler hooks into the native iOS/macOS profiling infrastructure
|
|
47
|
+
(equivalent to Instruments-style profiling).
|
|
48
|
+
Android, Web, Linux, and Windows do **not** support profiling at the
|
|
49
|
+
`profilesSampleRate` level — setting the option on those platforms has no effect.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 2. Basic Setup
|
|
54
|
+
|
|
55
|
+
### Minimum configuration
|
|
56
|
+
|
|
57
|
+
```dart
|
|
58
|
+
import 'package:flutter/widgets.dart';
|
|
59
|
+
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
60
|
+
|
|
61
|
+
Future<void> main() async {
|
|
62
|
+
await SentryFlutter.init(
|
|
63
|
+
(options) {
|
|
64
|
+
options.dsn = 'YOUR_DSN';
|
|
65
|
+
|
|
66
|
+
// Tracing must be enabled — profiling only applies to traced transactions
|
|
67
|
+
options.tracesSampleRate = 1.0;
|
|
68
|
+
|
|
69
|
+
// profilesSampleRate is relative to tracesSampleRate
|
|
70
|
+
// 1.0 = profile every traced transaction (development / testing only)
|
|
71
|
+
options.profilesSampleRate = 1.0;
|
|
72
|
+
},
|
|
73
|
+
appRunner: () => runApp(MyApp()),
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Recommended production configuration
|
|
79
|
+
|
|
80
|
+
```dart
|
|
81
|
+
await SentryFlutter.init(
|
|
82
|
+
(options) {
|
|
83
|
+
options.dsn = 'YOUR_DSN';
|
|
84
|
+
|
|
85
|
+
// Trace 20% of transactions
|
|
86
|
+
options.tracesSampleRate = 0.2;
|
|
87
|
+
|
|
88
|
+
// Profile 50% of those → 10% of all transactions profiled
|
|
89
|
+
options.profilesSampleRate = 0.5;
|
|
90
|
+
},
|
|
91
|
+
appRunner: () => runApp(MyApp()),
|
|
92
|
+
);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
> **Production guidance:** Profiling adds overhead.
|
|
96
|
+
> Keep `profilesSampleRate` low in production.
|
|
97
|
+
> Values above 0.1 are not recommended without explicit performance validation on your
|
|
98
|
+
> minimum supported device.
|
|
99
|
+
|
|
100
|
+
### Verifying profiles appear in Sentry
|
|
101
|
+
|
|
102
|
+
1. Build and run on a **real iOS device** (not Simulator — see
|
|
103
|
+
[Known Limitations](#6-known-limitations))
|
|
104
|
+
2. Trigger a user interaction that creates a transaction (e.g., navigate between screens
|
|
105
|
+
with `SentryNavigatorObserver`)
|
|
106
|
+
3. Open Sentry → Performance → find the transaction → look for the **Profiling** tab in
|
|
107
|
+
the transaction detail
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 3. What Data Is Captured
|
|
112
|
+
|
|
113
|
+
### In a profile
|
|
114
|
+
|
|
115
|
+
| Data | Description |
|
|
116
|
+
| ---------------------- | ---------------------------------------------------------- |
|
|
117
|
+
| **Call stack samples** | Sampled Dart + native stack frames at regular intervals |
|
|
118
|
+
| **Flame graph** | Aggregated view of time spent in each function |
|
|
119
|
+
| **Timeline** | Stack samples over time, correlated with transaction spans |
|
|
120
|
+
| **Thread info** | Main isolate thread, background threads, native threads |
|
|
121
|
+
| **Function names** | From Dart debug info + native debug symbols |
|
|
122
|
+
|
|
123
|
+
### What profiles are linked to
|
|
124
|
+
|
|
125
|
+
Each profile is attached to the transaction that triggered it.
|
|
126
|
+
In the Sentry UI you can:
|
|
127
|
+
|
|
128
|
+
- View the flame graph alongside the transaction’s span waterfall
|
|
129
|
+
- Identify which functions were executing during slow spans
|
|
130
|
+
|
|
131
|
+
### What is NOT captured
|
|
132
|
+
|
|
133
|
+
- Memory allocations (use Xcode Instruments for that)
|
|
134
|
+
- Network traffic details (captured separately via tracing spans)
|
|
135
|
+
- UI rendering frames (slow/frozen frames are a separate tracing metric via
|
|
136
|
+
`SentryNavigatorObserver`)
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 4. Performance Overhead
|
|
141
|
+
|
|
142
|
+
Profiling adds CPU overhead during sampled transactions.
|
|
143
|
+
The sampler uses a fixed-interval approach (not full instrumentation), which limits
|
|
144
|
+
overhead but does not eliminate it.
|
|
145
|
+
|
|
146
|
+
| Factor | Impact |
|
|
147
|
+
| ---------------------------------- | ----------------------------------------------------------------- |
|
|
148
|
+
| `profilesSampleRate: 1.0` | Higher — every traced transaction is profiled |
|
|
149
|
+
| `profilesSampleRate: 0.1` | Low — only 10% of traced transactions profiled |
|
|
150
|
+
| Real device (iPhone 12+) | Minimal visible impact |
|
|
151
|
+
| Older devices (iPhone 8 and below) | Measurable impact — validate before enabling |
|
|
152
|
+
| iOS Simulator | Works but results differ from device — don’t use for benchmarking |
|
|
153
|
+
|
|
154
|
+
**Recommendations:**
|
|
155
|
+
|
|
156
|
+
- Use `profilesSampleRate: 1.0` only in development/testing
|
|
157
|
+
- In production, start at `profilesSampleRate: 0.05` and increase if needed
|
|
158
|
+
- Always validate on your minimum supported iOS device before shipping
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 5. Configuration Reference
|
|
163
|
+
|
|
164
|
+
### `SentryFlutter.init` options
|
|
165
|
+
|
|
166
|
+
| Option | Type | Default | Description |
|
|
167
|
+
| -------------------- | -------------- | ------- | -------------------------------------------------------------------------------------------------- |
|
|
168
|
+
| `profilesSampleRate` | `double` (0–1) | `null` | Fraction of _traced_ transactions to also profile. Relative to `tracesSampleRate`. iOS/macOS only. |
|
|
169
|
+
| `tracesSampleRate` | `double` (0–1) | `null` | Required for profiling. Fraction of transactions to trace. |
|
|
170
|
+
| `tracesSampler` | `function` | `null` | Dynamic trace sampling. Takes precedence over `tracesSampleRate` when set. |
|
|
171
|
+
|
|
172
|
+
### Minimum version table
|
|
173
|
+
|
|
174
|
+
| Feature | Min SDK | Platforms |
|
|
175
|
+
| -------------------- | -------- | ---------- |
|
|
176
|
+
| `profilesSampleRate` | `7.12.0` | iOS, macOS |
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## 6. Known Limitations
|
|
181
|
+
|
|
182
|
+
- **iOS and macOS only.** Android, Web, Linux, and Windows are **not supported**. The
|
|
183
|
+
option is silently ignored on unsupported platforms.
|
|
184
|
+
- **Alpha status.** The profiling API and behavior may change in future minor versions.
|
|
185
|
+
Pin your SDK version if stability matters for a critical workflow.
|
|
186
|
+
- **Simulator accuracy.** iOS Simulator profiling does not reflect real device
|
|
187
|
+
characteristics. Always validate performance conclusions on real hardware.
|
|
188
|
+
- **Tracing required.** Setting `profilesSampleRate` without a non-zero
|
|
189
|
+
`tracesSampleRate` has no effect — no transactions are sampled, so no profiles can be
|
|
190
|
+
generated.
|
|
191
|
+
- **Obfuscation.** Dart obfuscated builds (common in release builds) will show
|
|
192
|
+
obfuscated Dart frame names unless you upload Dart symbol files via
|
|
193
|
+
`sentry_dart_plugin`. Configure the plugin to upload `.symbols` files on each release
|
|
194
|
+
build.
|
|
195
|
+
- **No manual profiling API.** You cannot start/stop a profile programmatically —
|
|
196
|
+
profiling is transaction-scoped only and controlled entirely by `profilesSampleRate`.
|
|
197
|
+
- **Background transactions.** If a transaction completes while the app is backgrounded,
|
|
198
|
+
the profile may be truncated or absent.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 7. Troubleshooting
|
|
203
|
+
|
|
204
|
+
| Issue | Likely Cause | Solution |
|
|
205
|
+
| ---------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
206
|
+
| No profiles appearing in Sentry | `profilesSampleRate` not set, or `tracesSampleRate` is `0` or `null` | Set both to `> 0`. Verify DSN is correct and events appear in Sentry at all. |
|
|
207
|
+
| Option is set but no profiles on Android | Android is not supported | Expected — profiling is iOS/macOS only in the Flutter SDK. |
|
|
208
|
+
| Dart frames show obfuscated names (e.g., `_f`, `_g`) | Release build without symbol upload | Configure `sentry_dart_plugin` to upload Dart symbol files (`--obfuscate` + `--split-debug-info`) |
|
|
209
|
+
| Native frames show as hex addresses | dSYM not uploaded | Configure the Sentry Xcode build phase to upload dSYMs, or use `sentry_dart_plugin` |
|
|
210
|
+
| Profiles appear only for some transactions | Expected behavior | `profilesSampleRate` controls the fraction. Increase if you want broader coverage. |
|
|
211
|
+
| Profile flame graph shows “unknown” functions | Missing both Dart symbols and dSYMs | Upload both via `sentry_dart_plugin` and the Xcode build phase |
|
|
212
|
+
| Profiling not working on iOS Simulator | Known limitation — Simulator profiling may not match device behavior | Validate on a real device. Simulator results are indicative only. |
|
|
213
|
+
| App performance degraded after enabling profiling | `profilesSampleRate` too high | Reduce `profilesSampleRate`; test on your minimum supported device |
|
|
214
|
+
| SDK crashes on startup with profiling enabled | SDK version < 7.12.0 | Upgrade `sentry_flutter` to ≥ 7.12.0 |
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# Session Replay — Sentry Flutter SDK
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK:** `sentry_flutter` ≥ **9.0.0**\
|
|
4
|
+
> **Platforms:** **iOS and Android only** — Web, macOS, Linux, Windows not supported\
|
|
5
|
+
> **Frame rate:** ~**1 frame per second** (screenshot-based capture, not DOM recording)
|
|
6
|
+
|
|
7
|
+
Flutter Session Replay captures a visual record of user sessions as a compressed
|
|
8
|
+
sequence of screenshots, combined with breadcrumbs, traces, and error context.
|
|
9
|
+
It works differently from web replay — understanding this prevents surprises.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Table of Contents
|
|
14
|
+
|
|
15
|
+
1. [How Flutter Replay Differs from Web Replay](#1-how-flutter-replay-differs-from-web-replay)
|
|
16
|
+
2. [Basic Setup](#2-basic-setup)
|
|
17
|
+
3. [Sample Rates](#3-sample-rates)
|
|
18
|
+
4. [Privacy and Masking](#4-privacy-and-masking)
|
|
19
|
+
5. [What the Replay UI Shows](#5-what-the-replay-ui-shows)
|
|
20
|
+
6. [Session Lifecycle](#6-session-lifecycle)
|
|
21
|
+
7. [Performance Overhead](#7-performance-overhead)
|
|
22
|
+
8. [Configuration Reference](#8-configuration-reference)
|
|
23
|
+
9. [Known Limitations](#9-known-limitations)
|
|
24
|
+
10. [Troubleshooting](#10-troubleshooting)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 1. How Flutter Replay Differs from Web Replay
|
|
29
|
+
|
|
30
|
+
| Dimension | Web Session Replay | Flutter Session Replay |
|
|
31
|
+
| --------------------- | -------------------------------------- | -------------------------------------------- |
|
|
32
|
+
| **Recording method** | DOM serialization (HTML/CSS snapshots) | **Screenshot-based** (widget tree snapshots) |
|
|
33
|
+
| **Frame rate** | Variable (mutation-driven) | **~1 frame per second** |
|
|
34
|
+
| **Text in replay** | ✅ Selectable, searchable | ❌ Pixel-only — text is in screenshots |
|
|
35
|
+
| **CSS inspection** | ✅ Available | ❌ Not available |
|
|
36
|
+
| **Privacy mechanism** | CSS-based DOM masking | **Widget-level pixel masking** |
|
|
37
|
+
| **Rage clicks** | ✅ Detected | ❌ Not supported |
|
|
38
|
+
| **Touch recording** | Full pointer events | Tap breadcrumbs only |
|
|
39
|
+
| **Scroll positions** | ✅ Precise | ⚠️ Approximate (from screenshots) |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2. Basic Setup
|
|
44
|
+
|
|
45
|
+
Flutter Session Replay is built into `sentry_flutter` — no separate package is needed.
|
|
46
|
+
Wrap your root widget with `SentryWidget` (required for widget-tree privacy masking):
|
|
47
|
+
|
|
48
|
+
```dart
|
|
49
|
+
import 'package:flutter/widgets.dart';
|
|
50
|
+
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
51
|
+
|
|
52
|
+
Future<void> main() async {
|
|
53
|
+
await SentryFlutter.init(
|
|
54
|
+
(options) {
|
|
55
|
+
options.dsn = 'YOUR_DSN';
|
|
56
|
+
|
|
57
|
+
// Session replay sampling
|
|
58
|
+
options.replay.sessionSampleRate = 0.1; // 10% of all sessions recorded
|
|
59
|
+
options.replay.onErrorSampleRate = 1.0; // 100% when an error occurs
|
|
60
|
+
},
|
|
61
|
+
appRunner: () => runApp(
|
|
62
|
+
SentryWidget( // required — wraps the app for screenshot capture
|
|
63
|
+
child: MyApp(),
|
|
64
|
+
),
|
|
65
|
+
),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
> **During development:** Use `options.replay.sessionSampleRate = 1.0` so every session
|
|
71
|
+
> is recorded. Lower it before shipping to production.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 3. Sample Rates
|
|
76
|
+
|
|
77
|
+
### `replay.sessionSampleRate`
|
|
78
|
+
|
|
79
|
+
Records the **entire user session** from SDK initialization / app foreground entry.
|
|
80
|
+
|
|
81
|
+
- Range: `0.0` – `1.0`
|
|
82
|
+
- Captures everything from session start
|
|
83
|
+
|
|
84
|
+
### `replay.onErrorSampleRate`
|
|
85
|
+
|
|
86
|
+
Only activates when an **error occurs**. The SDK maintains a rolling pre-error buffer
|
|
87
|
+
and captures that buffer plus everything after the error.
|
|
88
|
+
|
|
89
|
+
- Range: `0.0` – `1.0`
|
|
90
|
+
- Gives you context for what led up to the error
|
|
91
|
+
|
|
92
|
+
### Recommended production values
|
|
93
|
+
|
|
94
|
+
| Strategy | `sessionSampleRate` | `onErrorSampleRate` |
|
|
95
|
+
| ------------------------------ | ------------------- | ------------------- |
|
|
96
|
+
| Errors-only (minimal overhead) | `0` | `1.0` |
|
|
97
|
+
| Balanced | `0.05` | `1.0` |
|
|
98
|
+
| High visibility | `0.1` | `1.0` |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 4. Privacy and Masking
|
|
103
|
+
|
|
104
|
+
> ⚠️ **Production warning:** Always verify your masking config before enabling in
|
|
105
|
+
> production. The SDK masks aggressively by default, but any customizations require
|
|
106
|
+
> thorough testing with your actual app UI. If you discover unmasked PII, disable
|
|
107
|
+
> Session Replay until resolved.
|
|
108
|
+
|
|
109
|
+
### Default behavior
|
|
110
|
+
|
|
111
|
+
The SDK **aggressively masks all text, images, and user input by default**:
|
|
112
|
+
|
|
113
|
+
| Widget type | Default behavior |
|
|
114
|
+
| ---------------------------------- | -------------------- |
|
|
115
|
+
| `Text`, `RichText`, `EditableText` | ✅ Masked by default |
|
|
116
|
+
| `Image` (including asset images) | ✅ Masked by default |
|
|
117
|
+
| `TextFormField`, `TextField` | ✅ Masked by default |
|
|
118
|
+
|
|
119
|
+
Masked areas are replaced with a filled block using a neutral color.
|
|
120
|
+
|
|
121
|
+
### Privacy configuration options
|
|
122
|
+
|
|
123
|
+
Configure masking in `SentryFlutter.init`:
|
|
124
|
+
|
|
125
|
+
```dart
|
|
126
|
+
await SentryFlutter.init(
|
|
127
|
+
(options) {
|
|
128
|
+
options.dsn = 'YOUR_DSN';
|
|
129
|
+
options.replay.sessionSampleRate = 0.1;
|
|
130
|
+
options.replay.onErrorSampleRate = 1.0;
|
|
131
|
+
|
|
132
|
+
// Masking options — all true by default
|
|
133
|
+
options.privacy.maskAllText = true; // mask Text, RichText, EditableText
|
|
134
|
+
options.privacy.maskAllImages = true; // mask Image widgets
|
|
135
|
+
options.privacy.maskAssetImages = true; // mask asset bundle images
|
|
136
|
+
},
|
|
137
|
+
appRunner: () => runApp(SentryWidget(child: MyApp())),
|
|
138
|
+
);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Mask specific widget types
|
|
142
|
+
|
|
143
|
+
```dart
|
|
144
|
+
// Mask all IconButton widgets (masked by the widget type)
|
|
145
|
+
options.privacy.mask<IconButton>();
|
|
146
|
+
|
|
147
|
+
// Unmask Image widgets (show images in replay)
|
|
148
|
+
options.privacy.unmask<Image>();
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Custom masking logic per widget instance
|
|
152
|
+
|
|
153
|
+
```dart
|
|
154
|
+
options.privacy.maskCallback<Text>(
|
|
155
|
+
(Element element, Text widget) {
|
|
156
|
+
// Mask only text containing 'secret'
|
|
157
|
+
if (widget.data?.contains('secret') ?? false) {
|
|
158
|
+
return SentryMaskingDecision.mask;
|
|
159
|
+
}
|
|
160
|
+
return SentryMaskingDecision.continueProcessing;
|
|
161
|
+
},
|
|
162
|
+
);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Disable all masking
|
|
166
|
+
|
|
167
|
+
Only do this if your app contains absolutely no sensitive data:
|
|
168
|
+
|
|
169
|
+
```dart
|
|
170
|
+
options.privacy.maskAllText = false;
|
|
171
|
+
options.privacy.maskAllImages = false;
|
|
172
|
+
options.privacy.maskAssetImages = false;
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Third-party widget masking
|
|
176
|
+
|
|
177
|
+
The SDK cannot automatically detect or mask third-party widgets.
|
|
178
|
+
You must register them explicitly:
|
|
179
|
+
|
|
180
|
+
```dart
|
|
181
|
+
// Example: mask a map widget from a third-party package
|
|
182
|
+
options.privacy.mask<FlutterMap>();
|
|
183
|
+
|
|
184
|
+
// Example: mask a video player widget
|
|
185
|
+
options.privacy.mask<VideoPlayer>();
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 5. What the Replay UI Shows
|
|
191
|
+
|
|
192
|
+
| Panel | Content |
|
|
193
|
+
| --------------- | --------------------------------------------------------- |
|
|
194
|
+
| **Video** | Compressed screenshot sequence at ~1 fps |
|
|
195
|
+
| **Breadcrumbs** | User taps, navigation events, app lifecycle transitions |
|
|
196
|
+
| **Timeline** | Scrubbable view with event markers |
|
|
197
|
+
| **Network** | HTTP requests made during the session |
|
|
198
|
+
| **Errors** | All errors in the session linked to Sentry issues |
|
|
199
|
+
| **Tags** | OS version, device specs, release, user info, custom tags |
|
|
200
|
+
| **Trace** | All distributed traces during the replay session |
|
|
201
|
+
|
|
202
|
+
### Touch / gesture recording
|
|
203
|
+
|
|
204
|
+
Touch interactions are recorded as **breadcrumb events** (discrete tap events), not raw
|
|
205
|
+
gesture streams:
|
|
206
|
+
|
|
207
|
+
- ✅ Captured: Tap position, tapped widget, timestamp
|
|
208
|
+
- ❌ Not captured: Swipe paths, gesture velocity, multi-touch sequences
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 6. Session Lifecycle
|
|
213
|
+
|
|
214
|
+
| Event | Effect |
|
|
215
|
+
| ----------------------------------------------- | ----------------------------- |
|
|
216
|
+
| SDK initializes / app enters foreground | New session starts |
|
|
217
|
+
| App goes to background | Session pauses |
|
|
218
|
+
| App returns to foreground within **30 seconds** | Same session continues |
|
|
219
|
+
| App returns to foreground after **30+ seconds** | New session starts |
|
|
220
|
+
| Session reaches **60 minutes** | Session terminates |
|
|
221
|
+
| App crashes / closes in background | Session terminates abnormally |
|
|
222
|
+
|
|
223
|
+
The `onErrorSampleRate` mode keeps a pre-error buffer in memory.
|
|
224
|
+
When an error occurs, this buffer plus the subsequent recording is captured and sent.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 7. Performance Overhead
|
|
229
|
+
|
|
230
|
+
Session Replay adds CPU and memory overhead from periodic screenshot capture and
|
|
231
|
+
compression.
|
|
232
|
+
|
|
233
|
+
| Metric | With Replay | Notes |
|
|
234
|
+
| ----------------- | ------------ | ------------------------------ |
|
|
235
|
+
| CPU | +5–10% | During active recording |
|
|
236
|
+
| Memory | +15–25 MB | Screenshot buffer |
|
|
237
|
+
| FPS impact | -1 to -2 fps | Minimal on modern devices |
|
|
238
|
+
| Network bandwidth | ~7–10 KB/s | Compressed screenshot segments |
|
|
239
|
+
|
|
240
|
+
### Reducing performance impact
|
|
241
|
+
|
|
242
|
+
```dart
|
|
243
|
+
options.replay.sessionSampleRate = 0.05; // lower session recording rate
|
|
244
|
+
options.replay.onErrorSampleRate = 1.0; // keep error capture at 100%
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Consider using `onErrorSampleRate` only (set `sessionSampleRate` to `0`) for the lowest
|
|
248
|
+
overhead while retaining the most valuable replay data.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 8. Configuration Reference
|
|
253
|
+
|
|
254
|
+
### `options.replay` settings
|
|
255
|
+
|
|
256
|
+
| Option | Type | Default | Description |
|
|
257
|
+
| -------------------------- | -------------- | ------- | ------------------------------------------------------------ |
|
|
258
|
+
| `replay.sessionSampleRate` | `double` (0–1) | `0` | Fraction of all sessions to record from start |
|
|
259
|
+
| `replay.onErrorSampleRate` | `double` (0–1) | `0` | Fraction of error sessions to record (with pre-error buffer) |
|
|
260
|
+
|
|
261
|
+
### `options.privacy` settings
|
|
262
|
+
|
|
263
|
+
| Option | Type | Default | Description |
|
|
264
|
+
| --------------------------- | ------ | ------- | ------------------------------------------- |
|
|
265
|
+
| `privacy.maskAllText` | `bool` | `true` | Mask Text, RichText, EditableText widgets |
|
|
266
|
+
| `privacy.maskAllImages` | `bool` | `true` | Mask Image widgets |
|
|
267
|
+
| `privacy.maskAssetImages` | `bool` | `true` | Mask asset bundle images |
|
|
268
|
+
| `privacy.mask<T>()` | method | — | Mask all instances of widget type T |
|
|
269
|
+
| `privacy.unmask<T>()` | method | — | Unmask all instances of widget type T |
|
|
270
|
+
| `privacy.maskCallback<T>()` | method | — | Custom masking decision per widget instance |
|
|
271
|
+
|
|
272
|
+
### Version requirements
|
|
273
|
+
|
|
274
|
+
| Feature | Min SDK |
|
|
275
|
+
| -------------------------------- | ------- |
|
|
276
|
+
| Session Replay (iOS + Android) | `9.0.0` |
|
|
277
|
+
| `options.replay.*` configuration | `9.0.0` |
|
|
278
|
+
| `options.privacy.*` masking | `9.0.0` |
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 9. Known Limitations
|
|
283
|
+
|
|
284
|
+
| Limitation | Details |
|
|
285
|
+
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
286
|
+
| iOS and Android only | Web, macOS, Linux, and Windows are **not supported**. Replay configuration is silently ignored on unsupported platforms. |
|
|
287
|
+
| ~1 fps frame rate | Not suitable for high-frequency UI debugging. Best for understanding flow and identifying the screen state during errors. |
|
|
288
|
+
| Text is not selectable | Screenshots capture pixels only — you cannot copy text from a replay. |
|
|
289
|
+
| No swipe/gesture paths | Only discrete tap events are recorded as breadcrumbs. Gesture trajectories are not captured. |
|
|
290
|
+
| Third-party widget masking | Must be registered manually via `options.privacy.mask<WidgetType>()` — the SDK cannot auto-detect foreign widget types. |
|
|
291
|
+
| Pre-error buffer is in-memory | Low-memory devices may have a shorter effective pre-error buffer. |
|
|
292
|
+
| No DOM inspection | Unlike web replay, you cannot inspect the widget tree state at a given frame — only the screenshot is available. |
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## 10. Troubleshooting
|
|
297
|
+
|
|
298
|
+
| Issue | Solution |
|
|
299
|
+
| -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
300
|
+
| Replay not recording at all | Verify `options.replay.sessionSampleRate` or `options.replay.onErrorSampleRate` is `> 0`. Confirm `SentryWidget` wraps your root widget. |
|
|
301
|
+
| Platform not supported | Expected — Flutter Session Replay is iOS and Android only. Check you’re building for a supported platform. |
|
|
302
|
+
| All content masked after disabling masking | Verify you’ve set `options.privacy.maskAllText = false` and `options.privacy.maskAllImages = false` before `appRunner` runs. |
|
|
303
|
+
| Third-party widget content visible despite masking | Register the widget type: `options.privacy.mask<ThirdPartyWidget>()` |
|
|
304
|
+
| High memory usage with replay enabled | Lower `sessionSampleRate`; consider using `onErrorSampleRate` only (set `sessionSampleRate` to `0`) |
|
|
305
|
+
| Replay works in debug but not in production | Verify sample rates are non-zero in your production `SentryFlutter.init()` call; check DSN is correct for the environment |
|
|
306
|
+
| Pre-error buffer empty | Low memory device may have dropped the buffer. No workaround currently. |
|
|
307
|
+
| Replay sessions not linked to errors | Ensure both `onErrorSampleRate > 0` and the SDK is initialized before the error occurs |
|
|
308
|
+
| Tap events missing in replay | Confirm `SentryWidget` is wrapping the widget tree — it intercepts gesture events to record taps |
|