@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,233 @@
|
|
|
1
|
+
# Tracing — Sentry Elixir SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `sentry` v11.0.0+ (beta); v12.0.0+ for distributed tracing and LiveView
|
|
4
|
+
> spans
|
|
5
|
+
|
|
6
|
+
Tracing in the Elixir SDK is implemented via **OpenTelemetry**. Sentry ships three OTel
|
|
7
|
+
components: a `SpanProcessor`, a `Sampler`, and a `Propagator`. These integrate with the
|
|
8
|
+
OpenTelemetry Elixir ecosystem so you can use any OTel-compatible instrumentation
|
|
9
|
+
library (Phoenix, Ecto, Finch, etc.)
|
|
10
|
+
and have all spans forwarded to Sentry.
|
|
11
|
+
|
|
12
|
+
## Configuration
|
|
13
|
+
|
|
14
|
+
### Dependencies
|
|
15
|
+
|
|
16
|
+
```elixir
|
|
17
|
+
# mix.exs
|
|
18
|
+
defp deps do
|
|
19
|
+
[
|
|
20
|
+
{:sentry, "~> 12.0"},
|
|
21
|
+
{:finch, "~> 0.21"},
|
|
22
|
+
# OpenTelemetry core
|
|
23
|
+
{:opentelemetry, "~> 1.5"},
|
|
24
|
+
{:opentelemetry_api, "~> 1.4"},
|
|
25
|
+
{:opentelemetry_exporter, "~> 1.0"},
|
|
26
|
+
{:opentelemetry_semantic_conventions, "~> 1.27"},
|
|
27
|
+
# Optional: Phoenix and Ecto auto-instrumentation
|
|
28
|
+
{:opentelemetry_phoenix, "~> 2.0"},
|
|
29
|
+
{:opentelemetry_ecto, "~> 1.2"}
|
|
30
|
+
]
|
|
31
|
+
end
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Sentry config
|
|
35
|
+
|
|
36
|
+
Any non-nil value for `:traces_sample_rate` enables tracing.
|
|
37
|
+
Start with `1.0` for development, lower for production:
|
|
38
|
+
|
|
39
|
+
```elixir
|
|
40
|
+
# config/config.exs
|
|
41
|
+
config :sentry,
|
|
42
|
+
dsn: System.get_env("SENTRY_DSN"),
|
|
43
|
+
traces_sample_rate: 1.0 # lower to 0.1 in high-traffic production
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### OpenTelemetry config
|
|
47
|
+
|
|
48
|
+
Wire Sentry’s SpanProcessor and Sampler into the OTel pipeline:
|
|
49
|
+
|
|
50
|
+
```elixir
|
|
51
|
+
# config/config.exs
|
|
52
|
+
config :opentelemetry,
|
|
53
|
+
span_processor: {Sentry.OpenTelemetry.SpanProcessor, []},
|
|
54
|
+
sampler: {Sentry.OpenTelemetry.Sampler, []}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Distributed tracing (since v12.0.0)
|
|
58
|
+
|
|
59
|
+
Enable Sentry’s propagator to inject and extract `sentry-trace` and `baggage` headers:
|
|
60
|
+
|
|
61
|
+
```elixir
|
|
62
|
+
# config/config.exs
|
|
63
|
+
config :opentelemetry,
|
|
64
|
+
span_processor: {Sentry.OpenTelemetry.SpanProcessor, []},
|
|
65
|
+
sampler: {Sentry.OpenTelemetry.Sampler, []},
|
|
66
|
+
text_map_propagators: [
|
|
67
|
+
:trace_context,
|
|
68
|
+
:baggage,
|
|
69
|
+
Sentry.OpenTelemetry.Propagator
|
|
70
|
+
]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
> **Note:** Add `Sentry.OpenTelemetry.Propagator` **after** the standard
|
|
74
|
+
> `:trace_context` and `:baggage` propagators.
|
|
75
|
+
> It reads and writes the Sentry-specific `sentry-trace` and `baggage` headers so spans
|
|
76
|
+
> from Elixir connect to browser and backend spans from other Sentry SDKs.
|
|
77
|
+
|
|
78
|
+
## Sampling
|
|
79
|
+
|
|
80
|
+
### Uniform sample rate
|
|
81
|
+
|
|
82
|
+
```elixir
|
|
83
|
+
config :sentry,
|
|
84
|
+
traces_sample_rate: 0.1 # 10% of all root spans
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Custom sampler function
|
|
88
|
+
|
|
89
|
+
Use `:traces_sampler` to apply per-operation logic.
|
|
90
|
+
Overrides `:traces_sample_rate` when set:
|
|
91
|
+
|
|
92
|
+
```elixir
|
|
93
|
+
config :sentry,
|
|
94
|
+
traces_sampler: fn sampling_context ->
|
|
95
|
+
case sampling_context.transaction_context.op do
|
|
96
|
+
"http.server" -> 0.1 # 10% of HTTP requests
|
|
97
|
+
"db.query" -> 0.01 # 1% of DB queries
|
|
98
|
+
_ -> false # drop everything else
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Drop specific transaction names
|
|
104
|
+
|
|
105
|
+
Use the built-in `drop` option of `Sentry.OpenTelemetry.Sampler`:
|
|
106
|
+
|
|
107
|
+
```elixir
|
|
108
|
+
config :opentelemetry,
|
|
109
|
+
sampler: {Sentry.OpenTelemetry.Sampler, [drop: ["health_check", "liveness_check"]]}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Phoenix Auto-Instrumentation
|
|
113
|
+
|
|
114
|
+
`opentelemetry_phoenix` automatically creates spans for each Phoenix request.
|
|
115
|
+
Setup in `Application.start/2`:
|
|
116
|
+
|
|
117
|
+
```elixir
|
|
118
|
+
# lib/my_app/application.ex
|
|
119
|
+
def start(_type, _args) do
|
|
120
|
+
Logger.add_handlers(:my_app)
|
|
121
|
+
OpentelemetryPhoenix.setup() # instruments Phoenix controllers and LiveView (requires opentelemetry_phoenix)
|
|
122
|
+
OpentelemetryEcto.setup([:my_app, :repo]) # instruments Ecto queries (requires opentelemetry_ecto)
|
|
123
|
+
|
|
124
|
+
children = [
|
|
125
|
+
MyApp.Repo,
|
|
126
|
+
MyAppWeb.Endpoint
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
Supervisor.start_link(children, strategy: :one_for_one)
|
|
130
|
+
end
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## How Spans Map to Sentry
|
|
134
|
+
|
|
135
|
+
| OTel span type | Sentry object |
|
|
136
|
+
| --------------------------------------------------------- | -------------------------------------------- |
|
|
137
|
+
| Root span (no local parent) | `Transaction` |
|
|
138
|
+
| Child span (has local parent) | `Span` within that transaction |
|
|
139
|
+
| Distributed span (remote parent, HTTP server or LiveView) | New `Transaction` root (linked via trace ID) |
|
|
140
|
+
|
|
141
|
+
Root spans are created when:
|
|
142
|
+
|
|
143
|
+
- An HTTP request arrives with no `sentry-trace` parent (or sampling says yes)
|
|
144
|
+
- A LiveView mounts (since v12.0.0)
|
|
145
|
+
- You manually start a root-level OTel span
|
|
146
|
+
|
|
147
|
+
## Custom Spans
|
|
148
|
+
|
|
149
|
+
Use the standard OpenTelemetry API for custom instrumentation:
|
|
150
|
+
|
|
151
|
+
```elixir
|
|
152
|
+
require OpenTelemetry.Tracer, as: Tracer
|
|
153
|
+
|
|
154
|
+
def process_order(order_id) do
|
|
155
|
+
Tracer.with_span "process_order", %{attributes: [{"order.id", order_id}]} do
|
|
156
|
+
# All work done inside this block is a child span
|
|
157
|
+
validate_order(order_id)
|
|
158
|
+
charge_payment(order_id)
|
|
159
|
+
send_confirmation(order_id)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def validate_order(order_id) do
|
|
164
|
+
Tracer.with_span "validate_order", %{kind: :internal} do
|
|
165
|
+
# Nested child span
|
|
166
|
+
# ...
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Setting span attributes
|
|
172
|
+
|
|
173
|
+
```elixir
|
|
174
|
+
Tracer.with_span "db.query" do
|
|
175
|
+
Tracer.set_attributes([
|
|
176
|
+
{"db.system", "postgresql"},
|
|
177
|
+
{"db.statement", "SELECT * FROM orders WHERE id = $1"},
|
|
178
|
+
{"db.rows_affected", 1}
|
|
179
|
+
])
|
|
180
|
+
# run query
|
|
181
|
+
end
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Propagating context through async code
|
|
185
|
+
|
|
186
|
+
OTel context must be explicitly propagated when crossing process boundaries:
|
|
187
|
+
|
|
188
|
+
```elixir
|
|
189
|
+
# Capture current context before spawning
|
|
190
|
+
ctx = OpenTelemetry.Ctx.get_current()
|
|
191
|
+
|
|
192
|
+
Task.start(fn ->
|
|
193
|
+
# Attach parent context in the new process
|
|
194
|
+
OpenTelemetry.Ctx.attach(ctx)
|
|
195
|
+
|
|
196
|
+
Tracer.with_span "async.work" do
|
|
197
|
+
perform_work()
|
|
198
|
+
end
|
|
199
|
+
end)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## OpenTelemetry Components Reference
|
|
203
|
+
|
|
204
|
+
| Module | OTel behaviour | Purpose |
|
|
205
|
+
| ------------------------------------ | --------------------------- | ------------------------------------------------------------- |
|
|
206
|
+
| `Sentry.OpenTelemetry.SpanProcessor` | `:otel_span_processor` | Converts finished OTel spans into Sentry transactions/spans |
|
|
207
|
+
| `Sentry.OpenTelemetry.Sampler` | `:otel_sampler` | Applies `traces_sample_rate` / `traces_sampler` to root spans |
|
|
208
|
+
| `Sentry.OpenTelemetry.Propagator` | `:otel_propagator_text_map` | Injects/extracts `sentry-trace` and `baggage` headers |
|
|
209
|
+
|
|
210
|
+
## Best Practices
|
|
211
|
+
|
|
212
|
+
- Set `traces_sample_rate: 1.0` in development and `0.1–0.2` in production; adjust per
|
|
213
|
+
route with `traces_sampler`
|
|
214
|
+
- Use the `drop:` option in `Sentry.OpenTelemetry.Sampler` to exclude health check
|
|
215
|
+
endpoints from tracing
|
|
216
|
+
- Always call `OpentelemetryPhoenix.setup()` and `OpentelemetryEcto.setup/1` in
|
|
217
|
+
`Application.start/2` before the supervision tree starts
|
|
218
|
+
- Propagate OTel context explicitly when spawning tasks or sending messages to other
|
|
219
|
+
processes
|
|
220
|
+
- Add `Sentry.OpenTelemetry.Propagator` for distributed tracing across services —
|
|
221
|
+
without it, backend traces won’t link to browser Sentry events
|
|
222
|
+
|
|
223
|
+
## Troubleshooting
|
|
224
|
+
|
|
225
|
+
| Issue | Solution |
|
|
226
|
+
| ----------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
227
|
+
| No transactions in Sentry | Verify `traces_sample_rate` is set (non-nil); confirm `span_processor` is configured in `:opentelemetry` config |
|
|
228
|
+
| Phoenix spans missing | Call `OpentelemetryPhoenix.setup()` in `Application.start/2` before the supervision tree |
|
|
229
|
+
| Ecto query spans missing | Call `OpentelemetryEcto.setup([:my_app, :repo])` in `Application.start/2` |
|
|
230
|
+
| Distributed trace not linking | Add `Sentry.OpenTelemetry.Propagator` to `text_map_propagators`; requires v12.0.0+ |
|
|
231
|
+
| LiveView spans not appearing | Requires v12.0.0+ and `opentelemetry_phoenix ~> 2.0` |
|
|
232
|
+
| Context lost in async `Task` | Capture `OpenTelemetry.Ctx.get_current()` before spawning; call `OpenTelemetry.Ctx.attach(ctx)` inside the task |
|
|
233
|
+
| Too many DB spans | Use `traces_sampler` to lower sample rate for `"db.query"` operations |
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Ecosystem Integrations — Sentry Flutter SDK
|
|
2
|
+
|
|
3
|
+
Add these packages alongside `sentry_flutter` for deeper instrumentation:
|
|
4
|
+
|
|
5
|
+
### HTTP Clients
|
|
6
|
+
|
|
7
|
+
**Standard `http` package** — built into `sentry_flutter`, no extra install:
|
|
8
|
+
|
|
9
|
+
```dart
|
|
10
|
+
import 'package:sentry/sentry.dart';
|
|
11
|
+
|
|
12
|
+
// Wrap your http client
|
|
13
|
+
final client = SentryHttpClient(
|
|
14
|
+
captureFailedRequests: true,
|
|
15
|
+
failedRequestStatusCodes: [SentryStatusCode.range(400, 599)],
|
|
16
|
+
);
|
|
17
|
+
try {
|
|
18
|
+
final response = await client.get(Uri.parse('https://api.example.com/users'));
|
|
19
|
+
} finally {
|
|
20
|
+
client.close();
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Dio** — install `sentry_dio`:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
flutter pub add sentry_dio
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```dart
|
|
31
|
+
import 'package:dio/dio.dart';
|
|
32
|
+
import 'package:sentry_dio/sentry_dio.dart';
|
|
33
|
+
|
|
34
|
+
final dio = Dio();
|
|
35
|
+
// Add your interceptors first, THEN addSentry() last
|
|
36
|
+
dio.addSentry(
|
|
37
|
+
captureFailedRequests: true,
|
|
38
|
+
failedRequestStatusCodes: [SentryStatusCode.range(400, 599)],
|
|
39
|
+
);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Databases
|
|
43
|
+
|
|
44
|
+
| Package | Install | Setup |
|
|
45
|
+
| ---------------- | -------------------------------- | ------------------------------------------------------------ |
|
|
46
|
+
| `sentry_sqflite` | `flutter pub add sentry_sqflite` | `databaseFactory = SentrySqfliteDatabaseFactory();` |
|
|
47
|
+
| `sentry_drift` | `flutter pub add sentry_drift` | `.interceptWith(SentryQueryInterceptor(databaseName: 'db'))` |
|
|
48
|
+
| `sentry_hive` | `flutter pub add sentry_hive` | Use `SentryHive` instead of `Hive` |
|
|
49
|
+
| `sentry_isar` | `flutter pub add sentry_isar` | Use `SentryIsar.open()` instead of `Isar.open()` |
|
|
50
|
+
|
|
51
|
+
### Other
|
|
52
|
+
|
|
53
|
+
| Package | Install | Purpose |
|
|
54
|
+
| ------------------------------- | ----------------------------------------------- | -------------------------------------------------- |
|
|
55
|
+
| `sentry_logging` | `flutter pub add sentry_logging` | Dart `logging` package → Sentry breadcrumbs/events |
|
|
56
|
+
| `sentry_link` | `flutter pub add sentry_link` | GraphQL (gql, graphql_flutter, ferry) tracing |
|
|
57
|
+
| `sentry_supabase` | `flutter pub add sentry_supabase` | Supabase query tracing (SDK ≥9.9.0) |
|
|
58
|
+
| `sentry_firebase_remote_config` | `flutter pub add sentry_firebase_remote_config` | Feature flag tracking |
|
|
59
|
+
| `sentry_file` | `flutter pub add sentry_file` | File I/O tracing via `.sentryTrace()` extension |
|
|
60
|
+
|
|
61
|
+
### State Management Patterns
|
|
62
|
+
|
|
63
|
+
No official packages — wire Sentry via observer APIs:
|
|
64
|
+
|
|
65
|
+
| Framework | Hook point | Pattern |
|
|
66
|
+
| --------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
67
|
+
| **BLoC/Cubit** | `BlocObserver.onError` | `Sentry.captureException(error, stackTrace: stackTrace)` inside `onError`; set `Bloc.observer = SentryBlocObserver()` before init |
|
|
68
|
+
| **Riverpod** | `ProviderObserver.providerDidFail` | Fires for `FutureProvider`/`StreamProvider` failures; wrap app with `ProviderScope(observers: [SentryProviderObserver()])` |
|
|
69
|
+
| **Provider/ChangeNotifier** | `try/catch` in `notifyListeners` callers | Manually call `Sentry.captureException(e, stackTrace: stack)` in catch blocks |
|
|
70
|
+
| **GetX** | `GetMaterialApp.onError` | `GetMaterialApp(onError: (details) => Sentry.captureException(...))` |
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# Error Monitoring — Flutter SDK Reference
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK version:** `sentry_flutter` ≥ 7.0.0 (all features), ≥ 9.14.0 (tombstone,
|
|
4
|
+
> trace sync) **Platforms:** All (Android, iOS, macOS, Linux, Windows, Web —
|
|
5
|
+
> platform-specific caveats noted)
|
|
6
|
+
|
|
7
|
+
## What’s Auto-Captured
|
|
8
|
+
|
|
9
|
+
When `SentryFlutter.init()` runs, the SDK installs these handlers automatically:
|
|
10
|
+
|
|
11
|
+
| Handler | Captures | Platforms |
|
|
12
|
+
| ------------------------------------- | ---------------------------------------------------------------- | ----------------------------------- |
|
|
13
|
+
| `FlutterError.onError` | Widget build errors, rendering errors, gesture errors | All |
|
|
14
|
+
| `PlatformDispatcher.instance.onError` | Uncaught Dart async errors (root zone) | All (Flutter ≥ 3.3) |
|
|
15
|
+
| Android SDK (bundled) | Java/Kotlin JVM exceptions, NDK native crashes | Android |
|
|
16
|
+
| iOS/macOS SDK (bundled) | ObjC `NSException`, Swift errors, POSIX signals, Mach exceptions | iOS, macOS |
|
|
17
|
+
| `WidgetsBindingObserver` | App lifecycle breadcrumbs | Linux, Windows, Web (no native SDK) |
|
|
18
|
+
|
|
19
|
+
Silent framework errors (`FlutterErrorDetails.silent == true`) are excluded unless you
|
|
20
|
+
opt in:
|
|
21
|
+
|
|
22
|
+
```dart
|
|
23
|
+
options.reportSilentFlutterErrors = true;
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Manual Capture APIs
|
|
29
|
+
|
|
30
|
+
### Capture Exception
|
|
31
|
+
|
|
32
|
+
Always pass `stackTrace` — without it Sentry can’t show the correct call stack:
|
|
33
|
+
|
|
34
|
+
```dart
|
|
35
|
+
import 'package:sentry/sentry.dart';
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
await riskyOperation();
|
|
39
|
+
} catch (e, stackTrace) {
|
|
40
|
+
await Sentry.captureException(e, stackTrace: stackTrace);
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
With a one-off local scope (doesn’t affect subsequent events):
|
|
45
|
+
|
|
46
|
+
```dart
|
|
47
|
+
await Sentry.captureException(
|
|
48
|
+
e,
|
|
49
|
+
stackTrace: stackTrace,
|
|
50
|
+
withScope: (scope) {
|
|
51
|
+
scope.setTag('feature', 'checkout');
|
|
52
|
+
scope.setTag('step', 'payment');
|
|
53
|
+
scope.level = SentryLevel.fatal;
|
|
54
|
+
scope.setExtra('orderId', orderId);
|
|
55
|
+
},
|
|
56
|
+
);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Capture Message
|
|
60
|
+
|
|
61
|
+
```dart
|
|
62
|
+
await Sentry.captureMessage(
|
|
63
|
+
'Rate limit threshold exceeded',
|
|
64
|
+
level: SentryLevel.warning,
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
// Available levels:
|
|
68
|
+
// SentryLevel.debug | info | warning | error | fatal
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Capture User Feedback
|
|
72
|
+
|
|
73
|
+
```dart
|
|
74
|
+
final eventId = await Sentry.captureException(e, stackTrace: st);
|
|
75
|
+
|
|
76
|
+
await Sentry.captureFeedback(
|
|
77
|
+
SentryFeedback(
|
|
78
|
+
message: 'App froze after uploading the photo.',
|
|
79
|
+
contactEmail: 'user@example.com',
|
|
80
|
+
name: 'Jane Doe',
|
|
81
|
+
associatedEventId: eventId,
|
|
82
|
+
),
|
|
83
|
+
);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Scope — Enrich All Events
|
|
89
|
+
|
|
90
|
+
### Global Scope (persists across events)
|
|
91
|
+
|
|
92
|
+
```dart
|
|
93
|
+
import 'package:sentry/sentry.dart';
|
|
94
|
+
|
|
95
|
+
// Set user on login
|
|
96
|
+
Sentry.configureScope((scope) => scope.setUser(SentryUser(
|
|
97
|
+
id: 'user-123',
|
|
98
|
+
username: 'jdoe',
|
|
99
|
+
email: 'jane@example.com',
|
|
100
|
+
name: 'Jane Doe',
|
|
101
|
+
data: {'subscription_tier': 'pro'},
|
|
102
|
+
)));
|
|
103
|
+
|
|
104
|
+
// Clear user on logout
|
|
105
|
+
Sentry.configureScope((scope) => scope.setUser(null));
|
|
106
|
+
|
|
107
|
+
// Tags — indexed, searchable (key max 32 chars, value max 200 chars)
|
|
108
|
+
Sentry.configureScope((scope) {
|
|
109
|
+
scope.setTag('app.flavor', 'enterprise');
|
|
110
|
+
scope.setTag('locale', 'pt-BR');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Contexts — non-searchable structured data (visible in Sentry UI)
|
|
114
|
+
Sentry.configureScope((scope) => scope.setContexts('cart', {
|
|
115
|
+
'items_count': 3,
|
|
116
|
+
'total_usd': 149.99,
|
|
117
|
+
}));
|
|
118
|
+
|
|
119
|
+
// Attributes (SDK ≥9.9.0) — apply to logs, metrics, and spans too
|
|
120
|
+
Sentry.setAttributes({'user_tier': SentryAttribute.string('premium')});
|
|
121
|
+
Sentry.removeAttribute('user_tier');
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Scope Sync to Native (Android/iOS)
|
|
125
|
+
|
|
126
|
+
When `options.enableScopeSync = true` (default), these methods sync to the native SDK
|
|
127
|
+
layer so native crash reports include your Dart context:
|
|
128
|
+
|
|
129
|
+
- `scope.setUser()` / `scope.setContexts()` / `scope.setTag()` / `scope.setExtra()`
|
|
130
|
+
- `scope.addBreadcrumb()` / `scope.clearBreadcrumbs()`
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Breadcrumbs
|
|
135
|
+
|
|
136
|
+
Manual breadcrumbs build an audit trail leading to each error:
|
|
137
|
+
|
|
138
|
+
```dart
|
|
139
|
+
Sentry.addBreadcrumb(Breadcrumb(
|
|
140
|
+
message: 'User tapped checkout button',
|
|
141
|
+
category: 'ui.action',
|
|
142
|
+
type: 'user',
|
|
143
|
+
level: SentryLevel.info,
|
|
144
|
+
data: {'screen': 'CartScreen', 'cart_total': 149.99},
|
|
145
|
+
));
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Filter or modify breadcrumbs before storage:
|
|
149
|
+
|
|
150
|
+
```dart
|
|
151
|
+
options.beforeBreadcrumb = (breadcrumb, hint) {
|
|
152
|
+
// Drop noisy analytics calls
|
|
153
|
+
if (breadcrumb.data?['url']?.contains('analytics') == true) {
|
|
154
|
+
return null; // null = drop
|
|
155
|
+
}
|
|
156
|
+
// Strip auth headers from HTTP breadcrumbs
|
|
157
|
+
if (breadcrumb.type == 'http') {
|
|
158
|
+
final data = Map<String, dynamic>.from(breadcrumb.data ?? {})
|
|
159
|
+
..remove('Authorization');
|
|
160
|
+
return breadcrumb.copyWith(data: data);
|
|
161
|
+
}
|
|
162
|
+
return breadcrumb;
|
|
163
|
+
};
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Increase capacity if needed (default: 100):
|
|
167
|
+
|
|
168
|
+
```dart
|
|
169
|
+
options.maxBreadcrumbs = 150;
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Event Filtering
|
|
175
|
+
|
|
176
|
+
Drop or modify events before they’re sent:
|
|
177
|
+
|
|
178
|
+
```dart
|
|
179
|
+
options.beforeSend = (event, hint) async {
|
|
180
|
+
// Drop database connection errors (too noisy)
|
|
181
|
+
if (event.throwable is DatabaseConnectionException) return null;
|
|
182
|
+
|
|
183
|
+
// Group similar payment failures
|
|
184
|
+
if (event.throwable is PaymentException) {
|
|
185
|
+
event.fingerprint = ['payment-failure'];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Strip server name for privacy
|
|
189
|
+
event.serverName = '';
|
|
190
|
+
return event;
|
|
191
|
+
};
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
> ⚠️ `beforeSend` intercepts **Dart-layer events only**. Native crashes from Android NDK
|
|
195
|
+
> or iOS bypass it.
|
|
196
|
+
|
|
197
|
+
Error sampling (drop a fraction of errors — not recommended unless volume is very high):
|
|
198
|
+
|
|
199
|
+
```dart
|
|
200
|
+
options.sampleRate = 0.5; // send only 50% of errors
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Isolate Error Capture
|
|
206
|
+
|
|
207
|
+
Errors in non-root Dart isolates aren’t automatically captured.
|
|
208
|
+
Forward them explicitly:
|
|
209
|
+
|
|
210
|
+
```dart
|
|
211
|
+
import 'dart:isolate';
|
|
212
|
+
import 'package:sentry/sentry.dart';
|
|
213
|
+
|
|
214
|
+
final isolate = await Isolate.spawn(myIsolateEntry, someData);
|
|
215
|
+
isolate.addSentryErrorListener(); // forwards uncaught errors to Sentry
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
> ⚠️ Isolate errors are NOT captured on Web (no Isolate API in browser).
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Attachments
|
|
223
|
+
|
|
224
|
+
Automatically attach screenshots and widget hierarchy to error events:
|
|
225
|
+
|
|
226
|
+
```dart
|
|
227
|
+
options.attachScreenshot = true; // screenshot at time of error
|
|
228
|
+
options.screenshotQuality = ScreenshotQuality.high; // full/high/medium/low
|
|
229
|
+
options.attachViewHierarchy = true; // JSON widget tree snapshot
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Requires `SentryWidget(child: MyApp())` as the app root.
|
|
233
|
+
Not available on Web.
|
|
234
|
+
|
|
235
|
+
Attach files manually via scope:
|
|
236
|
+
|
|
237
|
+
```dart
|
|
238
|
+
import 'package:sentry/sentry_io.dart';
|
|
239
|
+
|
|
240
|
+
final attachment = IoSentryAttachment.fromPath('/path/to/debug.log');
|
|
241
|
+
Sentry.configureScope((scope) => scope.addAttachment(attachment));
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Android Native Crash Options
|
|
247
|
+
|
|
248
|
+
```dart
|
|
249
|
+
// Android 12+ tombstone crash info via ApplicationExitInfo (SDK ≥9.14.0, opt-in)
|
|
250
|
+
options.enableTombstone = true;
|
|
251
|
+
|
|
252
|
+
// Sync Java/Kotlin scope to NDK
|
|
253
|
+
options.enableNdkScopeSync = true; // default: true
|
|
254
|
+
|
|
255
|
+
// Attach all threads to crash report
|
|
256
|
+
options.attachThreads = true; // default: false
|
|
257
|
+
|
|
258
|
+
// ANR detection
|
|
259
|
+
options.anrEnabled = true; // default: true
|
|
260
|
+
options.anrTimeoutInterval = 5000; // ms; increase if too many false positives
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## iOS/macOS Native Crash Options
|
|
266
|
+
|
|
267
|
+
```dart
|
|
268
|
+
// Watchdog termination (OOM kill) tracking
|
|
269
|
+
options.enableWatchdogTerminationTracking = true; // default: true
|
|
270
|
+
|
|
271
|
+
// Native HTTP failures independent of Dart client (SDK ≥9.11.0)
|
|
272
|
+
options.captureNativeFailedRequests = true;
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Release Health
|
|
278
|
+
|
|
279
|
+
Session tracking is on by default — gives you crash-free user and session metrics in the
|
|
280
|
+
Sentry dashboard:
|
|
281
|
+
|
|
282
|
+
```dart
|
|
283
|
+
// Disable if not needed
|
|
284
|
+
options.enableAutoSessionTracking = false;
|
|
285
|
+
|
|
286
|
+
// Tune session expiry (how long in background before a new session starts)
|
|
287
|
+
options.autoSessionTrackingInterval = const Duration(seconds: 60); // default: 30s
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Release is auto-set on iOS/Android as `"packageName@versionName+versionCode"`. Override
|
|
291
|
+
if needed:
|
|
292
|
+
|
|
293
|
+
```dart
|
|
294
|
+
options.release = 'my-app@2.1.0+105';
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Troubleshooting
|
|
300
|
+
|
|
301
|
+
| Issue | Solution |
|
|
302
|
+
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
|
|
303
|
+
| Events not appearing in Sentry | Set `options.debug = true`, check Flutter console for SDK errors; verify DSN |
|
|
304
|
+
| Stack traces unreadable | Build with `--obfuscate --split-debug-info` and upload with `sentry_dart_plugin` |
|
|
305
|
+
| Native crashes not captured | Confirm `enableNativeCrashHandling: true`; test in release mode (not debug) |
|
|
306
|
+
| `beforeSend` not firing for native crashes | Expected — `beforeSend` only intercepts Dart-layer events |
|
|
307
|
+
| Silent Flutter errors missed | Set `options.reportSilentFlutterErrors = true` |
|
|
308
|
+
| Isolate errors not captured | Call `isolate.addSentryErrorListener()` on each spawned isolate |
|
|
309
|
+
| Attachments missing from events | Confirm `SentryWidget(child: MyApp())` is the root widget |
|
|
310
|
+
| ANR false positives on slow devices | Increase `anrTimeoutInterval` above 5000ms |
|
|
311
|
+
| Events missing user/tag context | Set context before error occurs via `Sentry.configureScope()`; native crashes read scope at crash time |
|
|
312
|
+
| Too many events in dashboard | Lower `sampleRate` (last resort) or use `beforeSend` to drop low-value errors |
|