@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,800 @@
|
|
|
1
|
+
# Error Monitoring & Crash Reporting — Sentry Android SDK
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK:** `io.sentry:sentry-android` ≥ 7.0.0 (≥ 8.0.0 recommended) **NDK
|
|
4
|
+
> support:** `io.sentry:sentry-android-ndk` (included in `sentry-android` BOM)
|
|
5
|
+
> **Languages:** Kotlin and Java — all examples in Kotlin with Java equivalents where
|
|
6
|
+
> they differ
|
|
7
|
+
|
|
8
|
+
Android error monitoring covers three crash layers: **Java/Kotlin exceptions** (JVM),
|
|
9
|
+
**ANR (Application Not Responding)** events, and **native C/C++ crashes** via NDK. All
|
|
10
|
+
three are handled automatically after initialization.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Table of Contents
|
|
15
|
+
|
|
16
|
+
1. [Core Capture APIs](#1-core-capture-apis)
|
|
17
|
+
2. [Automatic Crash Handling](#2-automatic-crash-handling)
|
|
18
|
+
3. [ANR Detection](#3-anr-detection)
|
|
19
|
+
4. [NDK / Native Crash Capture](#4-ndk--native-crash-capture)
|
|
20
|
+
5. [Scope Management](#5-scope-management)
|
|
21
|
+
6. [Context Enrichment — Tags, User, Breadcrumbs](#6-context-enrichment--tags-user-breadcrumbs)
|
|
22
|
+
7. [Event Filtering — beforeSend, beforeBreadcrumb](#7-event-filtering--beforesend-beforebreadcrumb)
|
|
23
|
+
8. [Fingerprinting & Grouping](#8-fingerprinting--grouping)
|
|
24
|
+
9. [Attachments — Screenshots & View Hierarchy](#9-attachments--screenshots--view-hierarchy)
|
|
25
|
+
10. [Release Health & Sessions](#10-release-health--sessions)
|
|
26
|
+
11. [Configuration Reference](#11-configuration-reference)
|
|
27
|
+
12. [Troubleshooting](#12-troubleshooting)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 1. Core Capture APIs
|
|
32
|
+
|
|
33
|
+
All methods are static on `io.sentry.Sentry`. Returns a `SentryId` that can be
|
|
34
|
+
referenced for user feedback.
|
|
35
|
+
|
|
36
|
+
### `Sentry.captureException()`
|
|
37
|
+
|
|
38
|
+
```kotlin
|
|
39
|
+
import io.sentry.Sentry
|
|
40
|
+
import io.sentry.SentryLevel
|
|
41
|
+
|
|
42
|
+
// Basic capture
|
|
43
|
+
try {
|
|
44
|
+
aMethodThatMightFail()
|
|
45
|
+
} catch (e: Exception) {
|
|
46
|
+
Sentry.captureException(e)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// With local scope (applies only to this event)
|
|
50
|
+
try {
|
|
51
|
+
processPayment(order)
|
|
52
|
+
} catch (e: Exception) {
|
|
53
|
+
Sentry.captureException(e) { scope ->
|
|
54
|
+
scope.setTag("component", "payment")
|
|
55
|
+
scope.setLevel(SentryLevel.FATAL)
|
|
56
|
+
scope.setTransaction("CheckoutFlow")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Java equivalent:
|
|
62
|
+
|
|
63
|
+
```java
|
|
64
|
+
Sentry.captureException(e, scope -> {
|
|
65
|
+
scope.setTag("component", "payment");
|
|
66
|
+
scope.setLevel(SentryLevel.FATAL);
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### `Sentry.captureMessage()`
|
|
71
|
+
|
|
72
|
+
```kotlin
|
|
73
|
+
// Default level is INFO
|
|
74
|
+
Sentry.captureMessage("User completed onboarding")
|
|
75
|
+
|
|
76
|
+
// Explicit level: DEBUG | INFO | WARNING | ERROR | FATAL
|
|
77
|
+
Sentry.captureMessage("Payment provider unreachable", SentryLevel.WARNING)
|
|
78
|
+
Sentry.captureMessage("Database connection pool exhausted", SentryLevel.FATAL)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### `Sentry.captureEvent()`
|
|
82
|
+
|
|
83
|
+
For fully constructed `SentryEvent` objects — advanced use cases:
|
|
84
|
+
|
|
85
|
+
```kotlin
|
|
86
|
+
import io.sentry.SentryEvent
|
|
87
|
+
import io.sentry.protocol.Message
|
|
88
|
+
|
|
89
|
+
val event = SentryEvent()
|
|
90
|
+
event.level = SentryLevel.WARNING
|
|
91
|
+
val msg = Message()
|
|
92
|
+
msg.message = "Custom structured event"
|
|
93
|
+
event.message = msg
|
|
94
|
+
event.setTag("build_type", BuildConfig.BUILD_TYPE)
|
|
95
|
+
Sentry.captureEvent(event)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### `Sentry.captureUserFeedback()`
|
|
99
|
+
|
|
100
|
+
```kotlin
|
|
101
|
+
import io.sentry.UserFeedback
|
|
102
|
+
|
|
103
|
+
val feedback = UserFeedback(Sentry.lastEventId)
|
|
104
|
+
feedback.name = "Jane Smith"
|
|
105
|
+
feedback.email = "jane@example.com"
|
|
106
|
+
feedback.comments = "The app froze when I tapped the submit button."
|
|
107
|
+
Sentry.captureUserFeedback(feedback)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Error Levels
|
|
111
|
+
|
|
112
|
+
| Level | Android use case |
|
|
113
|
+
| --------- | ------------------------------------ |
|
|
114
|
+
| `FATAL` | App crash, unrecoverable state |
|
|
115
|
+
| `ERROR` | Feature broken, user action failed |
|
|
116
|
+
| `WARNING` | Degraded state, non-critical failure |
|
|
117
|
+
| `INFO` | Informational, notable events |
|
|
118
|
+
| `DEBUG` | Development diagnostics |
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 2. Automatic Crash Handling
|
|
123
|
+
|
|
124
|
+
The SDK installs `UncaughtExceptionHandlerIntegration` at init time, which wraps
|
|
125
|
+
`Thread.defaultUncaughtExceptionHandler`.
|
|
126
|
+
|
|
127
|
+
### How it works
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Unhandled exception thrown
|
|
131
|
+
│
|
|
132
|
+
▼
|
|
133
|
+
UncaughtExceptionHandlerIntegration.uncaughtException()
|
|
134
|
+
├── wraps throwable in ExceptionMechanismException (mechanism: "AppExitReason")
|
|
135
|
+
├── creates SentryEvent at FATAL level
|
|
136
|
+
├── captures event and BLOCKS until flushed to disk
|
|
137
|
+
└── calls original defaultUncaughtExceptionHandler (re-throws to Android runtime)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Crashes are persisted to disk immediately and transmitted on the **next app launch**.
|
|
141
|
+
This ensures crash data is never lost even when the process dies.
|
|
142
|
+
|
|
143
|
+
### Startup crash handling
|
|
144
|
+
|
|
145
|
+
If the app crashes within ~2 seconds of SDK init, `SentryAndroid.init()` blocks for up
|
|
146
|
+
to 5 seconds to flush the crash before the process exits:
|
|
147
|
+
|
|
148
|
+
```kotlin
|
|
149
|
+
SentryAndroid.init(this) { options ->
|
|
150
|
+
options.startupCrashFlushTimeoutMillis = 5_000L // default: 5 s
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Disable uncaught exception handler
|
|
155
|
+
|
|
156
|
+
```kotlin
|
|
157
|
+
options.isEnableUncaughtExceptionHandler = false
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 3. ANR Detection
|
|
163
|
+
|
|
164
|
+
ANR (Application Not Responding) events fire when the main thread is blocked for more
|
|
165
|
+
than 5 seconds.
|
|
166
|
+
|
|
167
|
+
### How it works
|
|
168
|
+
|
|
169
|
+
`AnrIntegration` runs a watchdog thread (`ANRWatchDog`) that posts a `Runnable` to the
|
|
170
|
+
main `Looper` every 500 ms.
|
|
171
|
+
If the main thread hasn’t processed the runnable within `anrTimeoutIntervalMillis`, an
|
|
172
|
+
ANR event is reported.
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
ANRWatchDog (background thread)
|
|
176
|
+
├── Posts Runnable to MainLooper every 500 ms
|
|
177
|
+
└── If (now - lastResponseTime) > anrTimeoutIntervalMillis
|
|
178
|
+
→ Captures ANR event with mechanism type "ANR"
|
|
179
|
+
→ Background ANRs use mechanism "anr_background"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Configuration
|
|
183
|
+
|
|
184
|
+
```kotlin
|
|
185
|
+
SentryAndroid.init(this) { options ->
|
|
186
|
+
options.isAnrEnabled = true // default: true
|
|
187
|
+
options.anrTimeoutIntervalMillis = 5_000L // default: 5000 ms
|
|
188
|
+
options.isAnrReportInDebug = false // default: false (suppress during development)
|
|
189
|
+
options.isAttachAnrThreadDump = true // attach thread dump as text attachment
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Via `AndroidManifest.xml`:
|
|
194
|
+
|
|
195
|
+
```xml
|
|
196
|
+
<meta-data android:name="io.sentry.anr.enable" android:value="true" />
|
|
197
|
+
<meta-data android:name="io.sentry.anr.timeout-interval-millis" android:value="5000" />
|
|
198
|
+
<meta-data android:name="io.sentry.anr.report-debug" android:value="false" />
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### ANR v2 — ApplicationExitInfo (Android 11+)
|
|
202
|
+
|
|
203
|
+
On API 30+, the SDK reads `ActivityManager.getHistoricalProcessExitReasons()` to report
|
|
204
|
+
ANRs from the previous app run that the watchdog couldn’t capture in real-time:
|
|
205
|
+
|
|
206
|
+
```kotlin
|
|
207
|
+
options.isReportHistoricalAnrs = true // default: false — report previous-run ANRs
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 4. NDK / Native Crash Capture
|
|
213
|
+
|
|
214
|
+
Native crashes (SIGSEGV, SIGABRT, C++ exceptions) are captured by `sentry-android-ndk`,
|
|
215
|
+
which wraps the `sentry-native` C SDK.
|
|
216
|
+
|
|
217
|
+
### Dependency
|
|
218
|
+
|
|
219
|
+
```kotlin
|
|
220
|
+
// build.gradle.kts — included automatically with the BOM
|
|
221
|
+
dependencies {
|
|
222
|
+
implementation(platform("io.sentry:sentry-bom:8.33.0"))
|
|
223
|
+
implementation("io.sentry:sentry-android") // includes ndk
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### How it works
|
|
228
|
+
|
|
229
|
+
1. `SentryNdk.init()` loads native libs on a background thread (2 s timeout)
|
|
230
|
+
2. Registers native signal handlers via `sentry-native`
|
|
231
|
+
3. On crash: writes crash report to disk
|
|
232
|
+
4. On next app launch: `sentry-android-core` reads and transmits the report
|
|
233
|
+
|
|
234
|
+
### NDK Scope Sync
|
|
235
|
+
|
|
236
|
+
Java scope changes (user, tags, breadcrumbs) are propagated to the native layer so NDK
|
|
237
|
+
crashes include the same context as Java events:
|
|
238
|
+
|
|
239
|
+
```kotlin
|
|
240
|
+
options.isEnableScopeSync = true // default: true
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Native tombstones (Android 11+)
|
|
244
|
+
|
|
245
|
+
```kotlin
|
|
246
|
+
options.isTombstoneEnabled = true // report native tombstones via ApplicationExitInfo
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Via manifest:
|
|
250
|
+
|
|
251
|
+
```xml
|
|
252
|
+
<meta-data android:name="io.sentry.tombstone.enable" android:value="true" />
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Disable NDK
|
|
256
|
+
|
|
257
|
+
```kotlin
|
|
258
|
+
options.isEnableNdk = false
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 5. Scope Management
|
|
264
|
+
|
|
265
|
+
Sentry uses a three-layer scope hierarchy.
|
|
266
|
+
Data merges in order: **Global → Isolation → Current** (current takes precedence for
|
|
267
|
+
single-value fields).
|
|
268
|
+
|
|
269
|
+
| Scope | Lifespan | How to access |
|
|
270
|
+
| ------------- | ------------------- | --------------------------------------------- |
|
|
271
|
+
| **Global** | Entire app lifetime | `Sentry.configureScope(ScopeType.GLOBAL) { }` |
|
|
272
|
+
| **Isolation** | Per-request/session | `Sentry.configureScope { }` (default) |
|
|
273
|
+
| **Current** | Block-level | `Sentry.withScope { }` |
|
|
274
|
+
|
|
275
|
+
### `Sentry.configureScope()` — persist across events
|
|
276
|
+
|
|
277
|
+
```kotlin
|
|
278
|
+
import io.sentry.Sentry
|
|
279
|
+
import io.sentry.protocol.User
|
|
280
|
+
|
|
281
|
+
// Set data for all subsequent events in this session
|
|
282
|
+
Sentry.configureScope { scope ->
|
|
283
|
+
scope.setTag("app.variant", BuildConfig.FLAVOR)
|
|
284
|
+
|
|
285
|
+
val user = User().apply {
|
|
286
|
+
id = "42"
|
|
287
|
+
email = "jane@example.com"
|
|
288
|
+
username = "jane_doe"
|
|
289
|
+
}
|
|
290
|
+
scope.setUser(user)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Clear user on logout
|
|
294
|
+
Sentry.configureScope { scope ->
|
|
295
|
+
scope.setUser(null)
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### `Sentry.withScope()` — temporary, discarded after block
|
|
300
|
+
|
|
301
|
+
```kotlin
|
|
302
|
+
// Tags/context here do NOT affect events outside this block
|
|
303
|
+
Sentry.withScope { scope ->
|
|
304
|
+
scope.setTag("transaction_id", orderId)
|
|
305
|
+
scope.setLevel(SentryLevel.WARNING)
|
|
306
|
+
Sentry.captureMessage("Order processing failed")
|
|
307
|
+
}
|
|
308
|
+
// scope is discarded — subsequent events are unaffected
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### `Sentry.pushScope()` — try-with-resources (Java)
|
|
312
|
+
|
|
313
|
+
```java
|
|
314
|
+
try (ISentryLifecycleToken ignored = Sentry.pushScope()) {
|
|
315
|
+
Sentry.configureScope(scope -> scope.setTag("local", "value"));
|
|
316
|
+
Sentry.captureMessage("Event with local tag");
|
|
317
|
+
} // scope is automatically popped
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Shorthand static methods
|
|
321
|
+
|
|
322
|
+
```kotlin
|
|
323
|
+
Sentry.setUser(user) // → configureScope { scope.setUser(user) }
|
|
324
|
+
Sentry.setTag("key", "value") // → configureScope { scope.setTag(...) }
|
|
325
|
+
Sentry.removeTag("key")
|
|
326
|
+
Sentry.setExtra("key", "value") // deprecated — use setContexts
|
|
327
|
+
Sentry.setFingerprint(listOf("my-key"))
|
|
328
|
+
Sentry.setTransaction("CheckoutFlow")
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 6. Context Enrichment — Tags, User, Breadcrumbs
|
|
334
|
+
|
|
335
|
+
### Tags — indexed and searchable
|
|
336
|
+
|
|
337
|
+
Tags are key/value string pairs indexed in Sentry, enabling full-text search and
|
|
338
|
+
filtering.
|
|
339
|
+
|
|
340
|
+
**Constraints:** key ≤ 32 chars; value ≤ 200 chars; no newlines in values.
|
|
341
|
+
|
|
342
|
+
```kotlin
|
|
343
|
+
Sentry.configureScope { scope ->
|
|
344
|
+
scope.setTag("app.variant", "google-play")
|
|
345
|
+
scope.setTag("feature.flag", "checkout_v2")
|
|
346
|
+
scope.setTag("subscription.tier", "premium")
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Or static shorthand
|
|
350
|
+
Sentry.setTag("server.region", "eu-west-1")
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### User identity
|
|
354
|
+
|
|
355
|
+
```kotlin
|
|
356
|
+
import io.sentry.protocol.User
|
|
357
|
+
|
|
358
|
+
val user = User().apply {
|
|
359
|
+
id = "12345"
|
|
360
|
+
username = "jane_doe"
|
|
361
|
+
email = "jane@example.com"
|
|
362
|
+
ipAddress = "{{auto}}" // Sentry resolves from request
|
|
363
|
+
data = mapOf(
|
|
364
|
+
"subscription" to "premium",
|
|
365
|
+
"region" to "eu"
|
|
366
|
+
)
|
|
367
|
+
}
|
|
368
|
+
Sentry.setUser(user)
|
|
369
|
+
|
|
370
|
+
// Clear on logout
|
|
371
|
+
Sentry.setUser(null)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Custom contexts (structured, non-searchable)
|
|
375
|
+
|
|
376
|
+
```kotlin
|
|
377
|
+
// Use for rich structured data; use tags for searchable data
|
|
378
|
+
Sentry.configureScope { scope ->
|
|
379
|
+
scope.setContexts("order", mapOf(
|
|
380
|
+
"id" to "ORD-9821",
|
|
381
|
+
"total" to 129.99,
|
|
382
|
+
"item_count" to 3
|
|
383
|
+
))
|
|
384
|
+
scope.setContexts("device_capability", mapOf(
|
|
385
|
+
"has_nfc" to true,
|
|
386
|
+
"ram_gb" to 4
|
|
387
|
+
))
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
> **Note:** The key `"type"` is reserved — don’t use it as a context key.
|
|
392
|
+
|
|
393
|
+
### Breadcrumbs — event trail
|
|
394
|
+
|
|
395
|
+
Breadcrumbs buffer until the next event is captured.
|
|
396
|
+
They do not create Sentry issues on their own.
|
|
397
|
+
|
|
398
|
+
```kotlin
|
|
399
|
+
import io.sentry.Breadcrumb
|
|
400
|
+
import io.sentry.SentryLevel
|
|
401
|
+
|
|
402
|
+
// Manual breadcrumb
|
|
403
|
+
val breadcrumb = Breadcrumb().apply {
|
|
404
|
+
category = "auth"
|
|
405
|
+
message = "User authenticated: ${user.email}"
|
|
406
|
+
level = SentryLevel.INFO
|
|
407
|
+
type = "user"
|
|
408
|
+
setData("method", "biometric")
|
|
409
|
+
}
|
|
410
|
+
Sentry.addBreadcrumb(breadcrumb)
|
|
411
|
+
|
|
412
|
+
// Simple string
|
|
413
|
+
Sentry.addBreadcrumb("Tapped checkout button")
|
|
414
|
+
|
|
415
|
+
// String with category
|
|
416
|
+
Sentry.addBreadcrumb("Database query completed", "db")
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Breadcrumb fields:**
|
|
420
|
+
|
|
421
|
+
| Field | Type | Description |
|
|
422
|
+
| ---------- | ------------------ | ------------------------------------------------------- |
|
|
423
|
+
| `message` | `String` | Human-readable description |
|
|
424
|
+
| `category` | `String` | Dot-separated origin (e.g., `ui.click`, `http`, `auth`) |
|
|
425
|
+
| `level` | `SentryLevel` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `FATAL` |
|
|
426
|
+
| `type` | `String` | `default`, `http`, `navigation`, `user`, `error` |
|
|
427
|
+
| `data` | `Map<String, Any>` | Arbitrary additional metadata |
|
|
428
|
+
|
|
429
|
+
### Automatic breadcrumbs (Android-specific)
|
|
430
|
+
|
|
431
|
+
The SDK automatically collects these breadcrumbs — all enabled by default:
|
|
432
|
+
|
|
433
|
+
| Source | Category | What it records |
|
|
434
|
+
| ------------------------- | --------------- | --------------------------------------------------------- |
|
|
435
|
+
| Activity lifecycle | `ui.lifecycle` | Created, started, resumed, paused, stopped, destroyed |
|
|
436
|
+
| App foreground/background | `app.lifecycle` | Foreground, background transitions |
|
|
437
|
+
| System events | `device.*` | Battery, screen on/off, network, locale, timezone changes |
|
|
438
|
+
| Network connectivity | `network.event` | Connected, disconnected, type changes |
|
|
439
|
+
| User interactions | `ui.click` | Touch events on views (if enabled) |
|
|
440
|
+
| OkHttp requests | `http` | URL, method, status code (with `SentryOkHttpInterceptor`) |
|
|
441
|
+
|
|
442
|
+
Disable individual sources:
|
|
443
|
+
|
|
444
|
+
```kotlin
|
|
445
|
+
options.isEnableActivityLifecycleBreadcrumbs = false
|
|
446
|
+
options.isEnableAppLifecycleBreadcrumbs = false
|
|
447
|
+
options.isEnableSystemEventBreadcrumbs = false
|
|
448
|
+
options.isEnableNetworkEventBreadcrumbs = false
|
|
449
|
+
options.enableAllAutoBreadcrumbs(false) // disable all at once
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
Via manifest:
|
|
453
|
+
|
|
454
|
+
```xml
|
|
455
|
+
<meta-data android:name="io.sentry.breadcrumbs.activity-lifecycle" android:value="false" />
|
|
456
|
+
<meta-data android:name="io.sentry.breadcrumbs.app-lifecycle" android:value="false" />
|
|
457
|
+
<meta-data android:name="io.sentry.breadcrumbs.system-events" android:value="false" />
|
|
458
|
+
<meta-data android:name="io.sentry.breadcrumbs.network-events" android:value="false" />
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
**Max breadcrumbs** (default: 100):
|
|
462
|
+
|
|
463
|
+
```kotlin
|
|
464
|
+
options.maxBreadcrumbs = 50
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## 7. Event Filtering — `beforeSend`, `beforeBreadcrumb`
|
|
470
|
+
|
|
471
|
+
### `beforeSend` — filter/mutate error events
|
|
472
|
+
|
|
473
|
+
Called immediately before an error event is transmitted.
|
|
474
|
+
Return `null` to drop.
|
|
475
|
+
|
|
476
|
+
> **Important:** `beforeSend` only applies to Java/Kotlin events.
|
|
477
|
+
> Native NDK crashes bypass this hook entirely.
|
|
478
|
+
|
|
479
|
+
```kotlin
|
|
480
|
+
SentryAndroid.init(this) { options ->
|
|
481
|
+
options.beforeSend = SentryOptions.BeforeSendCallback { event, hint ->
|
|
482
|
+
// Drop events from test/CI environments
|
|
483
|
+
if (event.environment == "test") return@BeforeSendCallback null
|
|
484
|
+
|
|
485
|
+
// Fingerprint based on throwable type
|
|
486
|
+
if (event.throwable is SQLiteException) {
|
|
487
|
+
event.fingerprints = listOf("database-error")
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// Scrub PII before sending
|
|
491
|
+
event.user?.email = null
|
|
492
|
+
|
|
493
|
+
// Attach build metadata
|
|
494
|
+
event.setTag("build_number", BuildConfig.VERSION_CODE.toString())
|
|
495
|
+
|
|
496
|
+
event
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
Java equivalent:
|
|
502
|
+
|
|
503
|
+
```java
|
|
504
|
+
options.setBeforeSend((event, hint) -> {
|
|
505
|
+
if ("test".equals(event.getEnvironment())) return null;
|
|
506
|
+
return event;
|
|
507
|
+
});
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### `beforeSendTransaction` — filter performance transactions
|
|
511
|
+
|
|
512
|
+
```kotlin
|
|
513
|
+
options.beforeSendTransaction = SentryOptions.BeforeSendTransactionCallback { tx, hint ->
|
|
514
|
+
// Drop health check transactions
|
|
515
|
+
if (tx.transaction == "/health") return@BeforeSendTransactionCallback null
|
|
516
|
+
tx
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### `beforeBreadcrumb` — filter/mutate breadcrumbs
|
|
521
|
+
|
|
522
|
+
```kotlin
|
|
523
|
+
options.beforeBreadcrumb = SentryOptions.BeforeBreadcrumbCallback { breadcrumb, hint ->
|
|
524
|
+
// Drop noisy logger breadcrumbs
|
|
525
|
+
if (breadcrumb.category == "com.third_party.SpammyLib") return@BeforeBreadcrumbCallback null
|
|
526
|
+
|
|
527
|
+
// Scrub sensitive URLs
|
|
528
|
+
breadcrumb.data?.let { data ->
|
|
529
|
+
(data["url"] as? String)?.let { url ->
|
|
530
|
+
data["url"] = url.replace(Regex("token=[^&]*"), "token=REDACTED")
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
breadcrumb
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### `ignoreErrors` (ignored exception types)
|
|
539
|
+
|
|
540
|
+
```kotlin
|
|
541
|
+
options.addIgnoredError("android.os.NetworkOnMainThreadException")
|
|
542
|
+
options.addIgnoredError("java.net.UnknownHostException")
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
## 8. Fingerprinting & Grouping
|
|
548
|
+
|
|
549
|
+
Fingerprinting controls how Sentry groups events into issues.
|
|
550
|
+
Default grouping is by stack trace.
|
|
551
|
+
|
|
552
|
+
### SDK-level fingerprinting
|
|
553
|
+
|
|
554
|
+
```kotlin
|
|
555
|
+
// Static fingerprint via scope (all matching events → one issue)
|
|
556
|
+
Sentry.configureScope { scope ->
|
|
557
|
+
scope.setFingerprint(listOf("database-connection-error"))
|
|
558
|
+
}
|
|
559
|
+
Sentry.setFingerprint(listOf("database-connection-error"))
|
|
560
|
+
|
|
561
|
+
// Dynamic fingerprinting in beforeSend
|
|
562
|
+
options.beforeSend = SentryOptions.BeforeSendCallback { event, hint ->
|
|
563
|
+
when (event.throwable) {
|
|
564
|
+
is SQLiteException -> event.fingerprints = listOf("db-error", "sqlite")
|
|
565
|
+
is IOException -> event.fingerprints = listOf("io-error", "{{ default }}")
|
|
566
|
+
}
|
|
567
|
+
event
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// Per-capture fingerprint
|
|
571
|
+
Sentry.captureException(e) { scope ->
|
|
572
|
+
scope.setFingerprint(listOf("payment-gateway-error", "stripe"))
|
|
573
|
+
}
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### Fingerprint variables
|
|
577
|
+
|
|
578
|
+
| Variable | Resolves to |
|
|
579
|
+
| ------------------- | --------------------------------- |
|
|
580
|
+
| `{{ default }}` | Sentry’s default stack-trace hash |
|
|
581
|
+
| `{{ error.type }}` | Exception class name |
|
|
582
|
+
| `{{ error.value }}` | Exception message |
|
|
583
|
+
| `{{ transaction }}` | Current transaction name |
|
|
584
|
+
| `{{ level }}` | Event severity |
|
|
585
|
+
|
|
586
|
+
### Server-side rules (Sentry project settings)
|
|
587
|
+
|
|
588
|
+
```
|
|
589
|
+
# Group all DB errors together
|
|
590
|
+
error.type:SQLiteException -> database-error
|
|
591
|
+
error.type:IOException -> io-error, {{ transaction }}
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## 9. Attachments — Screenshots & View Hierarchy
|
|
597
|
+
|
|
598
|
+
### Screenshots
|
|
599
|
+
|
|
600
|
+
Captures a PNG of the current UI when an error occurs.
|
|
601
|
+
**Disabled by default** (may contain PII).
|
|
602
|
+
|
|
603
|
+
```kotlin
|
|
604
|
+
options.isAttachScreenshot = true
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
Via manifest:
|
|
608
|
+
|
|
609
|
+
```xml
|
|
610
|
+
<meta-data android:name="io.sentry.attach-screenshot" android:value="true" />
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
Fine-grained control (SDK ≥ 6.24.0):
|
|
614
|
+
|
|
615
|
+
```kotlin
|
|
616
|
+
options.setBeforeScreenshotCaptureCallback { event, hint, debounce ->
|
|
617
|
+
// Always capture for crashes; respect debounce for other events
|
|
618
|
+
if (event.isCrashed) return@setBeforeScreenshotCaptureCallback true
|
|
619
|
+
if (debounce) return@setBeforeScreenshotCaptureCallback false
|
|
620
|
+
event.level == SentryLevel.FATAL
|
|
621
|
+
}
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
### View hierarchy
|
|
625
|
+
|
|
626
|
+
Captures a JSON representation of the Android view tree when an error occurs.
|
|
627
|
+
|
|
628
|
+
```kotlin
|
|
629
|
+
options.isAttachViewHierarchy = true
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
Via manifest:
|
|
633
|
+
|
|
634
|
+
```xml
|
|
635
|
+
<meta-data android:name="io.sentry.attach-view-hierarchy" android:value="true" />
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
Fine-grained control:
|
|
639
|
+
|
|
640
|
+
```kotlin
|
|
641
|
+
options.setBeforeViewHierarchyCaptureCallback { event, hint, debounce ->
|
|
642
|
+
if (event.isCrashed) true
|
|
643
|
+
else if (debounce) false
|
|
644
|
+
else event.level == SentryLevel.FATAL
|
|
645
|
+
}
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
> **Debounce:** View hierarchy is captured at most once every 2 seconds (max 3 times per
|
|
649
|
+
> window) to prevent overhead during rapid error cascades.
|
|
650
|
+
|
|
651
|
+
### Jetpack Compose node names
|
|
652
|
+
|
|
653
|
+
Add the Sentry Kotlin Compiler Plugin to include composable function names in view
|
|
654
|
+
hierarchy JSON:
|
|
655
|
+
|
|
656
|
+
```kotlin
|
|
657
|
+
// build.gradle.kts
|
|
658
|
+
plugins {
|
|
659
|
+
id("io.sentry.kotlin.compiler.gradle") version "6.1.0"
|
|
660
|
+
}
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
### Manual file attachments
|
|
664
|
+
|
|
665
|
+
```kotlin
|
|
666
|
+
Sentry.captureException(e) { scope ->
|
|
667
|
+
scope.addAttachment(Attachment(
|
|
668
|
+
logContents.toByteArray(),
|
|
669
|
+
"debug.log",
|
|
670
|
+
"text/plain"
|
|
671
|
+
))
|
|
672
|
+
scope.addAttachment(Attachment(
|
|
673
|
+
File(context.filesDir, "config.json")
|
|
674
|
+
))
|
|
675
|
+
}
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
---
|
|
679
|
+
|
|
680
|
+
## 10. Release Health & Sessions
|
|
681
|
+
|
|
682
|
+
Session tracking enables crash-free rate metrics per release version.
|
|
683
|
+
|
|
684
|
+
```kotlin
|
|
685
|
+
SentryAndroid.init(this) { options ->
|
|
686
|
+
options.release = "${BuildConfig.APPLICATION_ID}@${BuildConfig.VERSION_NAME}+${BuildConfig.VERSION_CODE}"
|
|
687
|
+
options.isEnableAutoSessionTracking = true // default: true
|
|
688
|
+
options.sessionTrackingIntervalMillis = 30_000L // default: 30 s background threshold
|
|
689
|
+
}
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
Sessions are sent automatically.
|
|
693
|
+
No additional API calls required.
|
|
694
|
+
|
|
695
|
+
A session ends when the app goes to the background for longer than
|
|
696
|
+
`sessionTrackingIntervalMillis`. Each session maps to a release, so Sentry can compute:
|
|
697
|
+
|
|
698
|
+
- **Crash-free session rate** — % of sessions without a fatal crash
|
|
699
|
+
- **Crash-free user rate** — % of users without a crash per release
|
|
700
|
+
|
|
701
|
+
---
|
|
702
|
+
|
|
703
|
+
## 11. Configuration Reference
|
|
704
|
+
|
|
705
|
+
### `SentryAndroid.init()` — common options
|
|
706
|
+
|
|
707
|
+
```kotlin
|
|
708
|
+
SentryAndroid.init(this) { options ->
|
|
709
|
+
// ── Core ──────────────────────────────────────────────────────────────
|
|
710
|
+
options.dsn = "https://publicKey@o0.ingest.sentry.io/0"
|
|
711
|
+
options.environment = "production"
|
|
712
|
+
options.release = "com.myapp@1.2.3+456"
|
|
713
|
+
options.dist = "456" // build number
|
|
714
|
+
options.isDebug = false
|
|
715
|
+
|
|
716
|
+
// ── Sampling ─────────────────────────────────────────────────────────
|
|
717
|
+
options.sampleRate = 1.0 // error event sample rate (0.0–1.0)
|
|
718
|
+
|
|
719
|
+
// ── Crash handling ────────────────────────────────────────────────────
|
|
720
|
+
options.isEnableUncaughtExceptionHandler = true // default
|
|
721
|
+
options.startupCrashFlushTimeoutMillis = 5_000L
|
|
722
|
+
|
|
723
|
+
// ── ANR ──────────────────────────────────────────────────────────────
|
|
724
|
+
options.isAnrEnabled = true
|
|
725
|
+
options.anrTimeoutIntervalMillis = 5_000L
|
|
726
|
+
options.isAnrReportInDebug = false
|
|
727
|
+
options.isAttachAnrThreadDump = false
|
|
728
|
+
options.isReportHistoricalAnrs = false // Android 11+
|
|
729
|
+
|
|
730
|
+
// ── NDK ──────────────────────────────────────────────────────────────
|
|
731
|
+
options.isEnableNdk = true
|
|
732
|
+
options.isEnableScopeSync = true
|
|
733
|
+
options.isTombstoneEnabled = false // Android 11+
|
|
734
|
+
|
|
735
|
+
// ── Enrichment ────────────────────────────────────────────────────────
|
|
736
|
+
options.isAttachScreenshot = false // PII risk — disabled by default
|
|
737
|
+
options.isAttachViewHierarchy = false
|
|
738
|
+
options.isAttachThreads = false // all thread dumps on every event
|
|
739
|
+
options.isAttachStacktrace = true // stack traces on captureMessage
|
|
740
|
+
|
|
741
|
+
// ── Breadcrumbs ───────────────────────────────────────────────────────
|
|
742
|
+
options.maxBreadcrumbs = 100
|
|
743
|
+
options.isEnableActivityLifecycleBreadcrumbs = true
|
|
744
|
+
options.isEnableAppLifecycleBreadcrumbs = true
|
|
745
|
+
options.isEnableSystemEventBreadcrumbs = true
|
|
746
|
+
options.isEnableNetworkEventBreadcrumbs = true
|
|
747
|
+
|
|
748
|
+
// ── Filtering ────────────────────────────────────────────────────────
|
|
749
|
+
options.beforeSend = SentryOptions.BeforeSendCallback { event, _ -> event }
|
|
750
|
+
options.beforeBreadcrumb = SentryOptions.BeforeBreadcrumbCallback { crumb, _ -> crumb }
|
|
751
|
+
|
|
752
|
+
// ── Sessions ─────────────────────────────────────────────────────────
|
|
753
|
+
options.isEnableAutoSessionTracking = true
|
|
754
|
+
options.sessionTrackingIntervalMillis = 30_000L
|
|
755
|
+
}
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
### `AndroidManifest.xml` — key meta-data entries
|
|
759
|
+
|
|
760
|
+
| Key | Type | Default | Description |
|
|
761
|
+
| ------------------------------------------ | ------- | ------- | ----------------------------- |
|
|
762
|
+
| `io.sentry.dsn` | String | — | DSN (required for auto-init) |
|
|
763
|
+
| `io.sentry.environment` | String | — | Environment name |
|
|
764
|
+
| `io.sentry.release` | String | — | Release version string |
|
|
765
|
+
| `io.sentry.debug` | Boolean | `false` | Enable SDK debug logging |
|
|
766
|
+
| `io.sentry.sample-rate` | Float | — | Error event sample rate |
|
|
767
|
+
| `io.sentry.enabled` | Boolean | `true` | Master on/off switch |
|
|
768
|
+
| `io.sentry.auto-init` | Boolean | `true` | Auto-init via ContentProvider |
|
|
769
|
+
| `io.sentry.anr.enable` | Boolean | `true` | ANR watchdog |
|
|
770
|
+
| `io.sentry.anr.timeout-interval-millis` | Integer | `5000` | ANR threshold |
|
|
771
|
+
| `io.sentry.anr.report-debug` | Boolean | `false` | Report ANR during debug |
|
|
772
|
+
| `io.sentry.ndk.enable` | Boolean | `true` | NDK crash capture |
|
|
773
|
+
| `io.sentry.ndk.scope-sync.enable` | Boolean | `true` | NDK scope sync |
|
|
774
|
+
| `io.sentry.attach-screenshot` | Boolean | `false` | Screenshot on error |
|
|
775
|
+
| `io.sentry.attach-view-hierarchy` | Boolean | `false` | View hierarchy on error |
|
|
776
|
+
| `io.sentry.breadcrumbs.activity-lifecycle` | Boolean | `true` | Activity breadcrumbs |
|
|
777
|
+
| `io.sentry.breadcrumbs.app-lifecycle` | Boolean | `true` | App lifecycle breadcrumbs |
|
|
778
|
+
| `io.sentry.breadcrumbs.system-events` | Boolean | `true` | System event breadcrumbs |
|
|
779
|
+
| `io.sentry.breadcrumbs.network-events` | Boolean | `true` | Network breadcrumbs |
|
|
780
|
+
|
|
781
|
+
---
|
|
782
|
+
|
|
783
|
+
## 12. Troubleshooting
|
|
784
|
+
|
|
785
|
+
| Issue | Cause | Solution |
|
|
786
|
+
| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
787
|
+
| Events not appearing in Sentry | DSN incorrect or SDK not initialized | Verify DSN; set `options.isDebug = true`; check Logcat for `[Sentry]` output |
|
|
788
|
+
| Crash events missing | UncaughtExceptionHandler disabled | Ensure `isEnableUncaughtExceptionHandler = true`; check for competing crash handlers (Firebase, Crashlytics) |
|
|
789
|
+
| NDK crashes not reported | NDK module not included or `isEnableNdk = false` | Add `sentry-android-ndk` dependency; confirm `isEnableNdk = true` |
|
|
790
|
+
| ANR events missing in release builds | On Android 11+ the SDK uses ANR v2 (`ApplicationExitInfo`), which reports ANRs on the **next app launch** rather than in real time, and by default reports only the most recent ANR | Verify `isAnrEnabled = true`, relaunch the app so the SDK can read `ApplicationExitInfo`, and set `isReportHistoricalAnrs = true` to also report older ANRs from the exit-reasons history |
|
|
791
|
+
| `beforeSend` not filtering native crashes | `beforeSend` only applies to JVM events | NDK crashes bypass `beforeSend`; to suppress NDK entirely: `isEnableNdk = false` |
|
|
792
|
+
| Screenshots are blank or black | Activity window not attached at crash time | Best-effort capture; ensure crash occurs with an active `Activity` |
|
|
793
|
+
| View hierarchy missing composable names | Sentry Kotlin Compiler Plugin not added | Add `io.sentry.kotlin.compiler.gradle` plugin to `build.gradle.kts` |
|
|
794
|
+
| Duplicate events | Multiple `SentryAndroid.init()` calls | Call `init()` once in `Application.onCreate()` only |
|
|
795
|
+
| ANR not firing in debug session | Debugger pauses the main thread, which blocks the watchdog | `isAnrReportInDebug` defaults to `false`; this is expected behavior |
|
|
796
|
+
| Session tracking not working | `release` not set | `isEnableAutoSessionTracking` requires a non-null `release` to be meaningful |
|
|
797
|
+
| `captureException` returns zero-ID | SDK not initialized or `enabled = false` | Verify `SentryAndroid.init()` was called in `Application.onCreate()` before the crash |
|
|
798
|
+
| Historical ANRs not reported | Feature not enabled | Set `isReportHistoricalAnrs = true`; requires Android 11+ (API 30) |
|
|
799
|
+
| Tags or user missing from NDK crashes | Scope sync disabled | Ensure `isEnableScopeSync = true` (default) |
|
|
800
|
+
| Events rejected with HTTP 413 | Payload too large | Reduce attachment sizes; avoid large context objects; limit `maxBreadcrumbs` |
|