@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,502 @@
|
|
|
1
|
+
# Tracing & Performance — Flutter SDK Reference
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK version:** `sentry_flutter` ≥ 9.1.0 (routing TTID/TTFD), ≥ 6.17.0 (user
|
|
4
|
+
> interaction tracing) **Platforms:** Most features — all platforms.
|
|
5
|
+
> Platform-specific caveats noted per feature.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
Enable tracing by setting `tracesSampleRate` in `SentryFlutter.init()`:
|
|
10
|
+
|
|
11
|
+
```dart
|
|
12
|
+
await SentryFlutter.init(
|
|
13
|
+
(options) {
|
|
14
|
+
options.dsn = 'YOUR_SENTRY_DSN';
|
|
15
|
+
|
|
16
|
+
// Option A: Uniform sample rate (use 1.0 during development)
|
|
17
|
+
options.tracesSampleRate = 1.0;
|
|
18
|
+
|
|
19
|
+
// Option B: Dynamic sampler (takes precedence over tracesSampleRate)
|
|
20
|
+
options.tracesSampler = (samplingContext) {
|
|
21
|
+
final name = samplingContext.transactionContext?.name ?? '';
|
|
22
|
+
if (name.contains('checkout')) return 1.0; // always trace checkout
|
|
23
|
+
if (name.contains('health')) return 0.0; // never trace health checks
|
|
24
|
+
return 0.1; // 10% of everything else
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
appRunner: () => runApp(SentryWidget(child: MyApp())),
|
|
28
|
+
);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Sampling precedence** (highest to lowest):
|
|
32
|
+
|
|
33
|
+
1. Explicit `sampled: true/false` on the transaction
|
|
34
|
+
2. `tracesSampler` return value
|
|
35
|
+
3. Parent transaction sampling decision (distributed tracing)
|
|
36
|
+
4. `tracesSampleRate` static value
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Navigation Instrumentation
|
|
41
|
+
|
|
42
|
+
Add `SentryNavigatorObserver` to automatically create a transaction per screen with Time
|
|
43
|
+
to Initial Display (TTID) spans:
|
|
44
|
+
|
|
45
|
+
### Standard MaterialApp / CupertinoApp
|
|
46
|
+
|
|
47
|
+
```dart
|
|
48
|
+
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
49
|
+
|
|
50
|
+
MaterialApp(
|
|
51
|
+
navigatorObservers: [
|
|
52
|
+
SentryNavigatorObserver(
|
|
53
|
+
// Auto-finish idle transactions after this duration (default: 3s)
|
|
54
|
+
autoFinishAfter: const Duration(seconds: 3),
|
|
55
|
+
// Routes to exclude from tracking (default: [])
|
|
56
|
+
ignoreRoutes: ['/splash', '/loading'],
|
|
57
|
+
// Use route name as the Sentry transaction name (default: false)
|
|
58
|
+
setRouteNameAsTransaction: false,
|
|
59
|
+
// Generate a fresh trace on each push/pop/replace (default: false).
|
|
60
|
+
// Changed from true → false in sentry_flutter 9.19.0.
|
|
61
|
+
// Set to true to restore the previous opt-out behavior.
|
|
62
|
+
enableNewTraceOnNavigation: false,
|
|
63
|
+
),
|
|
64
|
+
],
|
|
65
|
+
routes: {
|
|
66
|
+
'/': (context) => HomeScreen(),
|
|
67
|
+
'/profile': (context) => ProfileScreen(),
|
|
68
|
+
},
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
// For anonymous routes — always provide a name:
|
|
72
|
+
Navigator.push(
|
|
73
|
+
context,
|
|
74
|
+
MaterialPageRoute(
|
|
75
|
+
settings: const RouteSettings(name: 'ProductDetail'), // REQUIRED
|
|
76
|
+
builder: (context) => ProductDetailScreen(),
|
|
77
|
+
),
|
|
78
|
+
);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> ⚠️ Routes **must have names** for TTID/TTFD spans and navigation breadcrumbs to be
|
|
82
|
+
> created. Unnamed routes show as `null` in Sentry.
|
|
83
|
+
|
|
84
|
+
### GoRouter
|
|
85
|
+
|
|
86
|
+
```dart
|
|
87
|
+
import 'package:go_router/go_router.dart';
|
|
88
|
+
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
89
|
+
|
|
90
|
+
final GoRouter router = GoRouter(
|
|
91
|
+
observers: [SentryNavigatorObserver()],
|
|
92
|
+
routes: [
|
|
93
|
+
GoRoute(
|
|
94
|
+
path: '/',
|
|
95
|
+
name: 'home', // name is REQUIRED
|
|
96
|
+
builder: (context, state) => const HomeScreen(),
|
|
97
|
+
routes: [
|
|
98
|
+
GoRoute(
|
|
99
|
+
path: 'profile/:id',
|
|
100
|
+
name: 'profile', // name is REQUIRED
|
|
101
|
+
builder: (context, state) => ProfileScreen(
|
|
102
|
+
id: state.pathParameters['id']!,
|
|
103
|
+
),
|
|
104
|
+
),
|
|
105
|
+
],
|
|
106
|
+
),
|
|
107
|
+
],
|
|
108
|
+
);
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
> **Known limitation:** GoRouter does not propagate navigator observers across
|
|
112
|
+
> same-level tab transitions.
|
|
113
|
+
> Bottom-tab navigation events may not be tracked.
|
|
114
|
+
|
|
115
|
+
### Auto Route (Community Pattern)
|
|
116
|
+
|
|
117
|
+
```dart
|
|
118
|
+
import 'package:auto_route/auto_route.dart';
|
|
119
|
+
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
120
|
+
|
|
121
|
+
MaterialApp.router(
|
|
122
|
+
routerConfig: _router.config(
|
|
123
|
+
navigatorObservers: () => [SentryNavigatorObserver()],
|
|
124
|
+
),
|
|
125
|
+
)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
> **Known limitation:** Tab-based nested navigation is not captured (tracked issue
|
|
129
|
+
> getsentry/sentry-dart#2123).
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Time to Full Display (TTFD)
|
|
134
|
+
|
|
135
|
+
TTID (Time to Initial Display) is **always enabled** — measures to the first rendered
|
|
136
|
+
frame. TTFD measures to when your screen is fully ready (data loaded, async work done).
|
|
137
|
+
TTFD is **opt-in**:
|
|
138
|
+
|
|
139
|
+
```dart
|
|
140
|
+
// Enable in options
|
|
141
|
+
options.enableTimeToFullDisplayTracing = true;
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Then report when the screen is fully ready:
|
|
145
|
+
|
|
146
|
+
```dart
|
|
147
|
+
// Option 1: Widget wrapper (marks TTFD when child's build() completes)
|
|
148
|
+
// For StatelessWidget — TTFD is auto-reported when build() returns.
|
|
149
|
+
// For StatefulWidget — call reportFullyDisplayed() manually in a wrapper:
|
|
150
|
+
Navigator.push(
|
|
151
|
+
context,
|
|
152
|
+
MaterialPageRoute(
|
|
153
|
+
settings: const RouteSettings(name: 'ProductScreen'),
|
|
154
|
+
builder: (context) => SentryDisplayWidget(child: ProductScreen()),
|
|
155
|
+
),
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// Inside ProductScreen (StatefulWidget):
|
|
159
|
+
@override
|
|
160
|
+
void initState() {
|
|
161
|
+
super.initState();
|
|
162
|
+
_loadData().then((_) {
|
|
163
|
+
if (mounted) {
|
|
164
|
+
SentryDisplayWidget.of(context).reportFullyDisplayed();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Option 2: Direct API call (from anywhere in the widget)
|
|
170
|
+
await _loadData();
|
|
171
|
+
SentryFlutter.currentDisplay()?.reportFullyDisplayed();
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
TTFD auto-expires at **30 seconds** with `SpanStatus.DEADLINE_EXCEEDED` if
|
|
175
|
+
`reportFullyDisplayed()` is never called.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## User Interaction Tracing
|
|
180
|
+
|
|
181
|
+
Automatically creates transactions for taps, clicks, and long presses.
|
|
182
|
+
Requires `SentryWidget` at the root:
|
|
183
|
+
|
|
184
|
+
```dart
|
|
185
|
+
appRunner: () => runApp(SentryWidget(child: MyApp()))
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Widgets **must have a `Key`** to be tracked:
|
|
189
|
+
|
|
190
|
+
```dart
|
|
191
|
+
ElevatedButton(
|
|
192
|
+
key: const Key('submit_payment_button'), // REQUIRED for tracking
|
|
193
|
+
onPressed: _submitPayment,
|
|
194
|
+
child: const Text('Pay Now'),
|
|
195
|
+
)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Transactions are named `ButtonWidget key[submit_payment_button]` with operation
|
|
199
|
+
`ui.action.click`. Empty transactions (no child spans within `idleTimeout`) are silently
|
|
200
|
+
dropped.
|
|
201
|
+
|
|
202
|
+
Configuration:
|
|
203
|
+
|
|
204
|
+
```dart
|
|
205
|
+
options.enableUserInteractionTracing = true; // default: true
|
|
206
|
+
options.enableUserInteractionBreadcrumbs = true; // default: true
|
|
207
|
+
options.sendDefaultPii = false; // set true to include widget text as labels
|
|
208
|
+
options.idleTimeout = const Duration(milliseconds: 3000); // default
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## HTTP Tracing
|
|
214
|
+
|
|
215
|
+
### Standard `http` package (built into `sentry_flutter`)
|
|
216
|
+
|
|
217
|
+
```dart
|
|
218
|
+
import 'package:sentry/sentry.dart';
|
|
219
|
+
|
|
220
|
+
// Wrap any active transaction with an HTTP client for automatic spans
|
|
221
|
+
final transaction = Sentry.startTransaction('api-call', 'request', bindToScope: true);
|
|
222
|
+
|
|
223
|
+
final client = SentryHttpClient(
|
|
224
|
+
captureFailedRequests: true,
|
|
225
|
+
failedRequestStatusCodes: [SentryStatusCode.range(400, 599)],
|
|
226
|
+
failedRequestTargets: ['api.example.com'],
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
try {
|
|
230
|
+
final response = await client.get(Uri.parse('https://api.example.com/users'));
|
|
231
|
+
} finally {
|
|
232
|
+
client.close();
|
|
233
|
+
await transaction.finish(status: SpanStatus.ok());
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Dio (`sentry_dio`)
|
|
238
|
+
|
|
239
|
+
`dio.addSentry()` **must be the last step** in Dio setup:
|
|
240
|
+
|
|
241
|
+
```dart
|
|
242
|
+
import 'package:sentry_dio/sentry_dio.dart';
|
|
243
|
+
|
|
244
|
+
final dio = Dio();
|
|
245
|
+
dio.interceptors.add(MyAuthInterceptor()); // your interceptors first
|
|
246
|
+
dio.addSentry( // addSentry() always last
|
|
247
|
+
captureFailedRequests: true,
|
|
248
|
+
failedRequestStatusCodes: [SentryStatusCode.range(400, 599)],
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
// Spans only appear if a transaction is on scope
|
|
252
|
+
final transaction = Sentry.startTransaction('api-work', 'request', bindToScope: true);
|
|
253
|
+
await dio.get('https://api.example.com/products');
|
|
254
|
+
await transaction.finish(status: SpanStatus.ok());
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Distributed Tracing
|
|
258
|
+
|
|
259
|
+
Propagate trace context to your backend (links mobile spans to server spans in the
|
|
260
|
+
waterfall view):
|
|
261
|
+
|
|
262
|
+
```dart
|
|
263
|
+
options.tracePropagationTargets = ['api.myapp.com', 'localhost'];
|
|
264
|
+
options.propagateTraceparent = true; // also send W3C traceparent header (SDK ≥9.7.0)
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## App Start Instrumentation
|
|
270
|
+
|
|
271
|
+
**Platforms: iOS and Android only.** Automatically enabled — no config needed.
|
|
272
|
+
|
|
273
|
+
Measures from earliest native process init to first Flutter frame.
|
|
274
|
+
Creates:
|
|
275
|
+
|
|
276
|
+
- `ui.load` transaction
|
|
277
|
+
- `app.start.cold` or `app.start.warm` span
|
|
278
|
+
|
|
279
|
+
> ⚠️ Does not work accurately in Flutter add-to-app scenarios.
|
|
280
|
+
|
|
281
|
+
Disable if needed:
|
|
282
|
+
|
|
283
|
+
```dart
|
|
284
|
+
import 'package:sentry_flutter/src/integrations/native_app_start_integration.dart';
|
|
285
|
+
|
|
286
|
+
options.integrations.removeWhere((i) => i is NativeAppStartIntegration);
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Slow and Frozen Frames
|
|
292
|
+
|
|
293
|
+
**Platforms: iOS, Android, macOS.** Auto-enabled when Sentry initializes before
|
|
294
|
+
`WidgetsFlutterBinding`.
|
|
295
|
+
|
|
296
|
+
Thresholds:
|
|
297
|
+
|
|
298
|
+
- **Slow frame:** > 16ms render time (misses 60 FPS target)
|
|
299
|
+
- **Frozen frame:** > 700ms render time
|
|
300
|
+
|
|
301
|
+
If you need to call `WidgetsFlutterBinding.ensureInitialized()` before Sentry (e.g., for
|
|
302
|
+
plugin setup), use:
|
|
303
|
+
|
|
304
|
+
```dart
|
|
305
|
+
// Replace WidgetsFlutterBinding.ensureInitialized() with:
|
|
306
|
+
SentryWidgetsFlutterBinding.ensureInitialized();
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Disable:
|
|
310
|
+
|
|
311
|
+
```dart
|
|
312
|
+
options.enableFramesTracking = false;
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Custom Instrumentation
|
|
318
|
+
|
|
319
|
+
### Manual Transaction
|
|
320
|
+
|
|
321
|
+
```dart
|
|
322
|
+
final transaction = Sentry.startTransaction(
|
|
323
|
+
'processOrderBatch()', // name
|
|
324
|
+
'task', // operation
|
|
325
|
+
bindToScope: true, // links auto-captured errors to this transaction
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
try {
|
|
329
|
+
await processOrderBatch();
|
|
330
|
+
transaction.status = const SpanStatus.ok();
|
|
331
|
+
} catch (exception, stackTrace) {
|
|
332
|
+
transaction.throwable = exception;
|
|
333
|
+
transaction.status = const SpanStatus.internalError();
|
|
334
|
+
await Sentry.captureException(exception, stackTrace: stackTrace);
|
|
335
|
+
} finally {
|
|
336
|
+
await transaction.finish();
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Nested Spans
|
|
341
|
+
|
|
342
|
+
```dart
|
|
343
|
+
final span = Sentry.getSpan()?.startChild(
|
|
344
|
+
'db.query',
|
|
345
|
+
description: 'SELECT * FROM orders WHERE user_id = ?',
|
|
346
|
+
) ?? Sentry.startTransaction('fallback', 'task', bindToScope: true);
|
|
347
|
+
|
|
348
|
+
try {
|
|
349
|
+
final orders = await db.getOrdersForUser(userId);
|
|
350
|
+
span.status = const SpanStatus.ok();
|
|
351
|
+
return orders;
|
|
352
|
+
} catch (e, st) {
|
|
353
|
+
span.throwable = e;
|
|
354
|
+
span.status = const SpanStatus.notFound();
|
|
355
|
+
rethrow;
|
|
356
|
+
} finally {
|
|
357
|
+
await span.finish();
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Attach Data to Spans
|
|
362
|
+
|
|
363
|
+
```dart
|
|
364
|
+
transaction.setData('user_id', userId);
|
|
365
|
+
transaction.setData('items_count', 42);
|
|
366
|
+
transaction.setData('currency', 'USD');
|
|
367
|
+
// Supported types: String, int, double, bool, List
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Dynamic Sampling with Context
|
|
371
|
+
|
|
372
|
+
```dart
|
|
373
|
+
final transaction = Sentry.startTransaction(
|
|
374
|
+
'processPayment()',
|
|
375
|
+
'task',
|
|
376
|
+
customSamplingContext: {
|
|
377
|
+
'payment.amount': amount,
|
|
378
|
+
'payment.currency': currency,
|
|
379
|
+
'user.tier': userTier,
|
|
380
|
+
},
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
// In tracesSampler:
|
|
384
|
+
options.tracesSampler = (ctx) {
|
|
385
|
+
final tier = ctx.customSamplingContext?['user.tier'];
|
|
386
|
+
if (tier == 'enterprise') return 1.0; // always trace enterprise
|
|
387
|
+
return 0.1;
|
|
388
|
+
};
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Database Tracing
|
|
394
|
+
|
|
395
|
+
All DB integrations require an **active transaction on scope** to generate spans.
|
|
396
|
+
|
|
397
|
+
### sqflite (`sentry_sqflite`) — Android, iOS, macOS only
|
|
398
|
+
|
|
399
|
+
```dart
|
|
400
|
+
import 'package:sentry_sqflite/sentry_sqflite.dart';
|
|
401
|
+
|
|
402
|
+
// Global: instruments ALL databases
|
|
403
|
+
databaseFactory = SentrySqfliteDatabaseFactory();
|
|
404
|
+
|
|
405
|
+
// Per-database (recommended)
|
|
406
|
+
final db = await openDatabaseWithSentry('my.db');
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Drift (`sentry_drift`) — All platforms
|
|
410
|
+
|
|
411
|
+
```dart
|
|
412
|
+
import 'package:sentry_drift/sentry_drift.dart';
|
|
413
|
+
|
|
414
|
+
final executor = driftDatabase(name: 'app').interceptWith(
|
|
415
|
+
SentryQueryInterceptor(databaseName: 'app'),
|
|
416
|
+
);
|
|
417
|
+
final db = AppDatabase(executor);
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### Hive (`sentry_hive`) — All platforms
|
|
421
|
+
|
|
422
|
+
```dart
|
|
423
|
+
import 'package:sentry_hive/sentry_hive.dart';
|
|
424
|
+
|
|
425
|
+
// Use SentryHive instead of Hive
|
|
426
|
+
SentryHive.init(appDir.path);
|
|
427
|
+
final box = await SentryHive.openBox<Person>('people');
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### Isar (`sentry_isar`) — Android, iOS, macOS, Linux, Windows (no Web)
|
|
431
|
+
|
|
432
|
+
```dart
|
|
433
|
+
import 'package:sentry_isar/sentry_isar.dart';
|
|
434
|
+
|
|
435
|
+
// Use SentryIsar.open() instead of Isar.open()
|
|
436
|
+
final isar = await SentryIsar.open([UserSchema], directory: dir.path);
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Asset Bundle Instrumentation
|
|
442
|
+
|
|
443
|
+
Traces asset loading in your app (built into `sentry_flutter`):
|
|
444
|
+
|
|
445
|
+
```dart
|
|
446
|
+
runApp(
|
|
447
|
+
DefaultAssetBundle(
|
|
448
|
+
bundle: SentryAssetBundle(enableStructuredDataTracing: true),
|
|
449
|
+
child: MyApp(),
|
|
450
|
+
),
|
|
451
|
+
)
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## Production Configuration
|
|
457
|
+
|
|
458
|
+
```dart
|
|
459
|
+
final isProduction = const bool.fromEnvironment('dart.vm.product');
|
|
460
|
+
|
|
461
|
+
await SentryFlutter.init(
|
|
462
|
+
(options) {
|
|
463
|
+
options.dsn = const String.fromEnvironment('SENTRY_DSN');
|
|
464
|
+
|
|
465
|
+
// 10% sampling in production, 100% in dev
|
|
466
|
+
options.tracesSampleRate = isProduction ? 0.1 : 1.0;
|
|
467
|
+
|
|
468
|
+
// Trace all checkout flows, drop health checks
|
|
469
|
+
options.tracesSampler = (ctx) {
|
|
470
|
+
final name = ctx.transactionContext?.name ?? '';
|
|
471
|
+
if (name.contains('checkout') || name.contains('payment')) return 1.0;
|
|
472
|
+
if (name.contains('health') || name.contains('ping')) return 0.0;
|
|
473
|
+
return isProduction ? 0.1 : 1.0;
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
// Connect traces to backend
|
|
477
|
+
options.tracePropagationTargets = ['api.myapp.com'];
|
|
478
|
+
},
|
|
479
|
+
appRunner: () => runApp(SentryWidget(child: MyApp())),
|
|
480
|
+
);
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## Troubleshooting
|
|
486
|
+
|
|
487
|
+
| Issue | Solution |
|
|
488
|
+
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
489
|
+
| No transactions in Sentry | Confirm `tracesSampleRate > 0`; set to `1.0` to see all during debugging |
|
|
490
|
+
| Navigation not tracked | Add `SentryNavigatorObserver()` to `navigatorObservers`; name all routes |
|
|
491
|
+
| Traces not being connected across navigations | `enableNewTraceOnNavigation` defaults to `false` since 9.19.0 — set it to `true` to generate a fresh trace on each navigation event |
|
|
492
|
+
| TTID/TTFD spans missing | SDK ≥ 9.1.0 required; routes must have names |
|
|
493
|
+
| TTFD never reports | Call `SentryFlutter.currentDisplay()?.reportFullyDisplayed()` or use `SentryDisplayWidget` |
|
|
494
|
+
| GoRouter tabs not tracked | Known Flutter limitation — tab transitions don’t trigger standard navigator callbacks |
|
|
495
|
+
| User interaction transactions empty | Widget must have a `Key`; spans need child work before `idleTimeout` |
|
|
496
|
+
| Dio spans not appearing | Confirm `bindToScope: true` on the parent transaction; `dio.addSentry()` must be last |
|
|
497
|
+
| HTTP spans not appearing | Wrap requests with a scope-bound transaction; `SentryHttpClient` only creates spans in a transaction context |
|
|
498
|
+
| App start metrics missing | iOS/Android only; not available in add-to-app; disable with `NativeAppStartIntegration` removal |
|
|
499
|
+
| Slow/frozen frames not tracked | Sentry must init before `WidgetsFlutterBinding`; use `SentryWidgetsFlutterBinding.ensureInitialized()` |
|
|
500
|
+
| `tracesSampler` not being called | Only called once per transaction creation — check that transactions are being started |
|
|
501
|
+
| gRPC requests slow on Windows | Known issue (getsentry/sentry-dart#2760) — `startTransaction` overhead; avoid or use async span creation |
|
|
502
|
+
| Too many transactions in dashboard | Lower `tracesSampleRate` or use `tracesSampler` to drop noisy endpoints |
|