@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,626 @@
|
|
|
1
|
+
# Error Monitoring — Sentry PHP SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `sentry/sentry` ^4.0 · `sentry/sentry-laravel` ^4.0 ·
|
|
4
|
+
> `sentry/sentry-symfony` ^5.0
|
|
5
|
+
|
|
6
|
+
## Configuration
|
|
7
|
+
|
|
8
|
+
Key `\Sentry\init()` options for error monitoring:
|
|
9
|
+
|
|
10
|
+
| Option | Type | Default | Purpose |
|
|
11
|
+
| ------------------------- | ----------- | ------------------- | ----------------------------------------------------------- |
|
|
12
|
+
| `dsn` | `string` | env `SENTRY_DSN` | Data Source Name; SDK disabled if empty |
|
|
13
|
+
| `environment` | `string` | `"production"` | Deployment environment tag |
|
|
14
|
+
| `release` | `string` | `null` | App version string |
|
|
15
|
+
| `sample_rate` | `float` | `1.0` | Fraction of error events to send (0.0–1.0) |
|
|
16
|
+
| `send_default_pii` | `bool` | `false` | Include IPs, cookies, request body |
|
|
17
|
+
| `attach_stacktrace` | `bool` | `false` | Add stack traces to `captureMessage()` |
|
|
18
|
+
| `max_breadcrumbs` | `int` | `100` | Max breadcrumbs per event |
|
|
19
|
+
| `context_lines` | `int` | `5` | Source code lines around each stack frame |
|
|
20
|
+
| `ignore_exceptions` | `array` | `[]` | Exception classes (matched by `instanceof`) to never report |
|
|
21
|
+
| `error_types` | `int\|null` | `error_reporting()` | PHP error bitmask — errors to capture |
|
|
22
|
+
| `capture_silenced_errors` | `bool` | `false` | Capture errors suppressed with `@` operator |
|
|
23
|
+
| `before_send` | `callable` | no-op | Mutate or drop error events before sending |
|
|
24
|
+
| `before_breadcrumb` | `callable` | no-op | Mutate or drop breadcrumbs |
|
|
25
|
+
| `in_app_include` | `array` | `[]` | Paths to mark as in-app in stack traces |
|
|
26
|
+
| `in_app_exclude` | `array` | `[]` | Paths to exclude from in-app (e.g., vendor) |
|
|
27
|
+
| `max_request_body_size` | `string` | `"medium"` | `"none"` / `"small"` / `"medium"` / `"always"` |
|
|
28
|
+
| `default_integrations` | `bool` | `true` | Auto-install PHP error/exception/fatal handlers |
|
|
29
|
+
|
|
30
|
+
## Code Examples
|
|
31
|
+
|
|
32
|
+
### Basic setup
|
|
33
|
+
|
|
34
|
+
```php
|
|
35
|
+
// Plain PHP
|
|
36
|
+
\Sentry\init([
|
|
37
|
+
'dsn' => 'https://<key>@<org>.ingest.sentry.io/<project>',
|
|
38
|
+
'environment' => 'production',
|
|
39
|
+
'release' => 'my-app@1.2.3',
|
|
40
|
+
'sample_rate' => 1.0,
|
|
41
|
+
'send_default_pii' => false,
|
|
42
|
+
'max_breadcrumbs' => 100,
|
|
43
|
+
'in_app_exclude' => ['/var/www/html/vendor'],
|
|
44
|
+
]);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```php
|
|
48
|
+
// Laravel — config/sentry.php (published by php artisan vendor:publish)
|
|
49
|
+
return [
|
|
50
|
+
'dsn' => env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')),
|
|
51
|
+
'release' => env('SENTRY_RELEASE'),
|
|
52
|
+
'environment' => env('SENTRY_ENVIRONMENT'), // defaults to APP_ENV
|
|
53
|
+
'sample_rate' => (float) env('SENTRY_SAMPLE_RATE', 1.0),
|
|
54
|
+
'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false),
|
|
55
|
+
'ignore_exceptions' => [],
|
|
56
|
+
];
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
# Symfony — config/packages/sentry.yaml
|
|
61
|
+
sentry:
|
|
62
|
+
dsn: "%env(SENTRY_DSN)%"
|
|
63
|
+
register_error_listener: true # auto-captures on kernel.exception
|
|
64
|
+
register_error_handler: true # registers PHP error/exception handlers
|
|
65
|
+
options:
|
|
66
|
+
environment: "%kernel.environment%"
|
|
67
|
+
release: "%env(default::SENTRY_RELEASE)%"
|
|
68
|
+
sample_rate: 1.0
|
|
69
|
+
send_default_pii: false
|
|
70
|
+
max_breadcrumbs: 100
|
|
71
|
+
in_app_exclude:
|
|
72
|
+
- "%kernel.cache_dir%"
|
|
73
|
+
- "%kernel.project_dir%/vendor"
|
|
74
|
+
ignore_exceptions:
|
|
75
|
+
- Symfony\Component\HttpKernel\Exception\NotFoundHttpException
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Capture APIs
|
|
79
|
+
|
|
80
|
+
#### `captureException()`
|
|
81
|
+
|
|
82
|
+
```php
|
|
83
|
+
// Signature: function captureException(\Throwable $exception, ?EventHint $hint = null): ?EventId
|
|
84
|
+
|
|
85
|
+
// Basic
|
|
86
|
+
try {
|
|
87
|
+
riskyOperation();
|
|
88
|
+
} catch (\Throwable $e) {
|
|
89
|
+
\Sentry\captureException($e);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// With extra data attached via hint
|
|
93
|
+
\Sentry\captureException($e, \Sentry\EventHint::fromArray([
|
|
94
|
+
'extra' => ['sql' => $query, 'bindings' => $bindings],
|
|
95
|
+
]));
|
|
96
|
+
|
|
97
|
+
// Mark as unhandled (higher priority / inbox in Sentry UI)
|
|
98
|
+
\Sentry\captureException($e, \Sentry\EventHint::fromArray([
|
|
99
|
+
'mechanism' => new \Sentry\ExceptionMechanism(
|
|
100
|
+
\Sentry\ExceptionMechanism::TYPE_GENERIC,
|
|
101
|
+
false // $handled = false
|
|
102
|
+
),
|
|
103
|
+
]));
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### `captureMessage()`
|
|
107
|
+
|
|
108
|
+
```php
|
|
109
|
+
// Signature: function captureMessage(string $message, ?Severity $level = null, ?EventHint $hint = null): ?EventId
|
|
110
|
+
|
|
111
|
+
\Sentry\captureMessage('Payment gateway timeout');
|
|
112
|
+
\Sentry\captureMessage('Low disk space', \Sentry\Severity::warning());
|
|
113
|
+
\Sentry\captureMessage('Critical failure', \Sentry\Severity::fatal());
|
|
114
|
+
|
|
115
|
+
// All Severity factory methods:
|
|
116
|
+
// Severity::debug() Severity::info() Severity::warning()
|
|
117
|
+
// Severity::error() Severity::fatal()
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
#### `captureEvent()`
|
|
121
|
+
|
|
122
|
+
```php
|
|
123
|
+
// Signature: function captureEvent(Event $event, ?EventHint $hint = null): ?EventId
|
|
124
|
+
|
|
125
|
+
$event = \Sentry\Event::createEvent();
|
|
126
|
+
$event->setMessage('Custom billing event');
|
|
127
|
+
$event->setLevel(\Sentry\Severity::info());
|
|
128
|
+
$event->setTags(['component' => 'payment', 'provider' => 'stripe']);
|
|
129
|
+
$event->setExtra(['order_id' => 42, 'retries' => 3]);
|
|
130
|
+
$event->setFingerprint(['{{ default }}', 'payment-module']);
|
|
131
|
+
$event->setTransaction('checkout.payment');
|
|
132
|
+
|
|
133
|
+
\Sentry\captureEvent($event);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### `captureLastError()`
|
|
137
|
+
|
|
138
|
+
```php
|
|
139
|
+
// Signature: function captureLastError(?EventHint $hint = null): ?EventId
|
|
140
|
+
// Reads the most recent error from error_get_last()
|
|
141
|
+
|
|
142
|
+
register_shutdown_function(function (): void {
|
|
143
|
+
\Sentry\captureLastError();
|
|
144
|
+
\Sentry\flush(); // required in CLI/shutdown contexts
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Note: installed automatically by FatalErrorListenerIntegration
|
|
148
|
+
// when default_integrations => true (the default).
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Automatic capture by framework
|
|
152
|
+
|
|
153
|
+
```php
|
|
154
|
+
// Plain PHP — default integrations auto-install PHP error handlers
|
|
155
|
+
\Sentry\init(['dsn' => '...']);
|
|
156
|
+
// ErrorListenerIntegration → set_error_handler()
|
|
157
|
+
// ExceptionListenerIntegration → set_exception_handler()
|
|
158
|
+
// FatalErrorListenerIntegration → register_shutdown_function()
|
|
159
|
+
|
|
160
|
+
// Laravel 11+ (bootstrap/app.php)
|
|
161
|
+
use Sentry\Laravel\Integration;
|
|
162
|
+
|
|
163
|
+
return Application::configure(basePath: dirname(__DIR__))
|
|
164
|
+
->withExceptions(function ($exceptions) {
|
|
165
|
+
Integration::handles($exceptions);
|
|
166
|
+
})
|
|
167
|
+
->create();
|
|
168
|
+
|
|
169
|
+
// Laravel 10 and below (app/Exceptions/Handler.php)
|
|
170
|
+
public function register(): void
|
|
171
|
+
{
|
|
172
|
+
$this->reportable(function (\Throwable $e) {
|
|
173
|
+
\Sentry\Laravel\Integration::captureUnhandledException($e);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Symfony — register_error_listener: true in sentry.yaml (default)
|
|
178
|
+
// ErrorListener subscribes to kernel.exception and captures automatically
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Scope management
|
|
182
|
+
|
|
183
|
+
Three scope types control where data persists:
|
|
184
|
+
|
|
185
|
+
| Scope API | Lifetime | Use for |
|
|
186
|
+
| -------------------------- | ------------------------ | --------------------------------------- |
|
|
187
|
+
| `configureScope()` | Current scope (persists) | Per-request user identity, session tags |
|
|
188
|
+
| `withScope()` | Isolated child scope | Data for a single capture call |
|
|
189
|
+
| `pushScope()`/`popScope()` | Manually isolated scope | Long-running processes (Octane, queues) |
|
|
190
|
+
|
|
191
|
+
```php
|
|
192
|
+
// Persistent — modifies current scope, data appears on all subsequent events
|
|
193
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
|
|
194
|
+
$scope->setTag('tenant', 'acme-corp');
|
|
195
|
+
$scope->setUser(['id' => 42, 'email' => 'user@example.com']);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// Isolated — child scope discarded after callback; changes don't leak
|
|
199
|
+
\Sentry\withScope(function (\Sentry\State\Scope $scope): void {
|
|
200
|
+
$scope->setTag('payment_flow', 'checkout');
|
|
201
|
+
$scope->setExtra('cart_id', 'cart-123');
|
|
202
|
+
\Sentry\captureException(new \RuntimeException('Payment failed'));
|
|
203
|
+
});
|
|
204
|
+
// ← tag and extra are gone after this line
|
|
205
|
+
|
|
206
|
+
// Long-running process isolation (prevents cross-request contamination)
|
|
207
|
+
$hub = \Sentry\SentrySdk::getCurrentHub();
|
|
208
|
+
$hub->pushScope();
|
|
209
|
+
try {
|
|
210
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope) use ($job): void {
|
|
211
|
+
$scope->setTag('job.class', get_class($job));
|
|
212
|
+
});
|
|
213
|
+
$job->handle();
|
|
214
|
+
} finally {
|
|
215
|
+
$hub->popScope();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Manual push/pop (lower level)
|
|
219
|
+
$hub = \Sentry\SentrySdk::getCurrentHub();
|
|
220
|
+
$hub->pushScope();
|
|
221
|
+
try {
|
|
222
|
+
// ... isolated work ...
|
|
223
|
+
} finally {
|
|
224
|
+
$hub->popScope();
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Context enrichment
|
|
229
|
+
|
|
230
|
+
#### Tags
|
|
231
|
+
|
|
232
|
+
Tags are **indexed** — searchable and filterable in the Sentry UI. Max key 32 chars,
|
|
233
|
+
value 200 chars.
|
|
234
|
+
|
|
235
|
+
```php
|
|
236
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
|
|
237
|
+
$scope->setTag('environment', 'production');
|
|
238
|
+
$scope->setTags(['payment_provider' => 'stripe', 'checkout_version' => 'v3']);
|
|
239
|
+
$scope->removeTag('debug_mode');
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// Per-event only
|
|
243
|
+
\Sentry\withScope(function (\Sentry\State\Scope $scope): void {
|
|
244
|
+
$scope->setTag('retry_attempt', '2');
|
|
245
|
+
\Sentry\captureException(new \RuntimeException('Still failing'));
|
|
246
|
+
});
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### User context — `UserDataBag`
|
|
250
|
+
|
|
251
|
+
```php
|
|
252
|
+
// Via array (Scope::setUser accepts array OR UserDataBag)
|
|
253
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
|
|
254
|
+
$scope->setUser([
|
|
255
|
+
'id' => 42,
|
|
256
|
+
'email' => 'jane@example.com',
|
|
257
|
+
'username' => 'jane_doe',
|
|
258
|
+
'ip_address' => '192.168.1.1',
|
|
259
|
+
'plan' => 'enterprise', // extra keys become metadata
|
|
260
|
+
]);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// Via UserDataBag fluent API
|
|
264
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
|
|
265
|
+
$user = \Sentry\UserDataBag::createFromUserIdentifier(42);
|
|
266
|
+
$user->setEmail('jane@example.com');
|
|
267
|
+
$user->setMetadata('plan', 'enterprise');
|
|
268
|
+
$scope->setUser($user);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Clear user (e.g., on logout)
|
|
272
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
|
|
273
|
+
$scope->removeUser();
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
#### Breadcrumbs — `Breadcrumb` constants
|
|
278
|
+
|
|
279
|
+
```php
|
|
280
|
+
// Type constants (Breadcrumb::TYPE_*)
|
|
281
|
+
Breadcrumb::TYPE_DEFAULT // 'default' — generic log entry
|
|
282
|
+
Breadcrumb::TYPE_HTTP // 'http' — outgoing HTTP request
|
|
283
|
+
Breadcrumb::TYPE_USER // 'user' — user interaction
|
|
284
|
+
Breadcrumb::TYPE_NAVIGATION // 'navigation' — URL/route change
|
|
285
|
+
Breadcrumb::TYPE_ERROR // 'error' — captured error
|
|
286
|
+
|
|
287
|
+
// Level constants (Breadcrumb::LEVEL_*)
|
|
288
|
+
Breadcrumb::LEVEL_DEBUG
|
|
289
|
+
Breadcrumb::LEVEL_INFO
|
|
290
|
+
Breadcrumb::LEVEL_WARNING
|
|
291
|
+
Breadcrumb::LEVEL_ERROR
|
|
292
|
+
Breadcrumb::LEVEL_FATAL
|
|
293
|
+
|
|
294
|
+
// Shorthand via global function (PHP 8 named args)
|
|
295
|
+
\Sentry\addBreadcrumb(
|
|
296
|
+
category: 'auth',
|
|
297
|
+
message: 'User authenticated',
|
|
298
|
+
metadata: ['user_id' => 42, 'method' => 'oauth'],
|
|
299
|
+
level: \Sentry\Breadcrumb::LEVEL_INFO,
|
|
300
|
+
type: \Sentry\Breadcrumb::TYPE_DEFAULT,
|
|
301
|
+
);
|
|
302
|
+
|
|
303
|
+
// Explicit Breadcrumb object
|
|
304
|
+
\Sentry\addBreadcrumb(new \Sentry\Breadcrumb(
|
|
305
|
+
\Sentry\Breadcrumb::LEVEL_INFO,
|
|
306
|
+
\Sentry\Breadcrumb::TYPE_HTTP,
|
|
307
|
+
'http.client',
|
|
308
|
+
'POST https://api.stripe.com/v1/charges',
|
|
309
|
+
['status_code' => 200, 'duration_ms' => 243]
|
|
310
|
+
));
|
|
311
|
+
|
|
312
|
+
// Navigation crumb
|
|
313
|
+
\Sentry\addBreadcrumb(new \Sentry\Breadcrumb(
|
|
314
|
+
\Sentry\Breadcrumb::LEVEL_INFO,
|
|
315
|
+
\Sentry\Breadcrumb::TYPE_NAVIGATION,
|
|
316
|
+
'navigation',
|
|
317
|
+
null,
|
|
318
|
+
['from' => '/home', 'to' => '/checkout']
|
|
319
|
+
));
|
|
320
|
+
|
|
321
|
+
// Breadcrumb is immutable — modify via with*() methods (return clones)
|
|
322
|
+
$crumb = new \Sentry\Breadcrumb(
|
|
323
|
+
\Sentry\Breadcrumb::LEVEL_INFO,
|
|
324
|
+
\Sentry\Breadcrumb::TYPE_DEFAULT,
|
|
325
|
+
'cache', 'Cache miss', ['key' => 'user:42:profile']
|
|
326
|
+
);
|
|
327
|
+
$crumb = $crumb->withLevel(\Sentry\Breadcrumb::LEVEL_WARNING)
|
|
328
|
+
->withMetadata('ttl', 300);
|
|
329
|
+
\Sentry\addBreadcrumb($crumb);
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
#### Structured named context
|
|
333
|
+
|
|
334
|
+
Named context blocks appear as collapsible panels in the Sentry event UI.
|
|
335
|
+
|
|
336
|
+
```php
|
|
337
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
|
|
338
|
+
$scope->setContext('payment', [
|
|
339
|
+
'provider' => 'stripe',
|
|
340
|
+
'amount' => 9900,
|
|
341
|
+
'currency' => 'USD',
|
|
342
|
+
]);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
// Per-event
|
|
346
|
+
\Sentry\withScope(function (\Sentry\State\Scope $scope) use ($exception): void {
|
|
347
|
+
$scope->setContext('order', [
|
|
348
|
+
'id' => 'ord-999',
|
|
349
|
+
'items' => 3,
|
|
350
|
+
'total' => 59.99,
|
|
351
|
+
'status' => 'pending',
|
|
352
|
+
]);
|
|
353
|
+
\Sentry\captureException($exception);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
// Reserved names with special UI rendering: os, runtime, app, browser, device, gpu, culture, trace
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### `before_send` hook — filtering and scrubbing
|
|
360
|
+
|
|
361
|
+
```php
|
|
362
|
+
// Callback signature:
|
|
363
|
+
// callable(\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event
|
|
364
|
+
// Return null to DROP the event; return (modified) event to send.
|
|
365
|
+
|
|
366
|
+
\Sentry\init([
|
|
367
|
+
'before_send' => function (\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event {
|
|
368
|
+
// Drop health-check routes
|
|
369
|
+
$request = $event->getRequest();
|
|
370
|
+
if ($request?->getUrl() && str_contains($request->getUrl(), '/healthz')) {
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Scrub sensitive extra data
|
|
375
|
+
$extra = $event->getExtra();
|
|
376
|
+
unset($extra['password'], $extra['credit_card']);
|
|
377
|
+
$event->setExtra($extra);
|
|
378
|
+
|
|
379
|
+
// Add tag based on exception type
|
|
380
|
+
if ($hint?->exception instanceof \PDOException) {
|
|
381
|
+
$event->setTag('db_error', 'true');
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Custom fingerprint based on message
|
|
385
|
+
if ($hint?->exception && str_contains($hint->exception->getMessage(), 'timeout')) {
|
|
386
|
+
$event->setFingerprint(['timeout', get_class($hint->exception)]);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
return $event;
|
|
390
|
+
},
|
|
391
|
+
]);
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### `before_breadcrumb` hook
|
|
395
|
+
|
|
396
|
+
```php
|
|
397
|
+
// Callback signature:
|
|
398
|
+
// callable(\Sentry\Breadcrumb $breadcrumb): ?\Sentry\Breadcrumb
|
|
399
|
+
// Return null to DROP; return (modified) Breadcrumb to keep.
|
|
400
|
+
|
|
401
|
+
\Sentry\init([
|
|
402
|
+
'before_breadcrumb' => function (\Sentry\Breadcrumb $breadcrumb): ?\Sentry\Breadcrumb {
|
|
403
|
+
// Drop SQL queries containing sensitive data
|
|
404
|
+
if ($breadcrumb->getCategory() === 'db.sql.query') {
|
|
405
|
+
if (str_contains(strtolower($breadcrumb->getMessage() ?? ''), 'password')) {
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// Redact API keys from URLs
|
|
411
|
+
$metadata = $breadcrumb->getMetadata();
|
|
412
|
+
if (isset($metadata['url']) && str_contains($metadata['url'], 'api_key=')) {
|
|
413
|
+
return $breadcrumb->withMetadata(
|
|
414
|
+
'url',
|
|
415
|
+
preg_replace('/api_key=[^&]+/', 'api_key=[Filtered]', $metadata['url'])
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return $breadcrumb;
|
|
420
|
+
},
|
|
421
|
+
]);
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### Additional hook variants
|
|
425
|
+
|
|
426
|
+
```php
|
|
427
|
+
// Filter performance transactions (not error events)
|
|
428
|
+
'before_send_transaction' => function (\Sentry\Event $tx, ?\Sentry\EventHint $hint): ?\Sentry\Event {
|
|
429
|
+
if (in_array($tx->getTransaction(), ['GET /up', 'GET /ping', 'GET /healthz'])) {
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
return $tx;
|
|
433
|
+
},
|
|
434
|
+
|
|
435
|
+
// Filter cron monitor check-ins
|
|
436
|
+
'before_send_check_in' => function (\Sentry\Event $checkIn, ?\Sentry\EventHint $hint): ?\Sentry\Event {
|
|
437
|
+
return $checkIn; // or null to drop
|
|
438
|
+
},
|
|
439
|
+
|
|
440
|
+
// NOTE: Symfony uses service IDs instead of closures:
|
|
441
|
+
// options: { before_send: 'App\Sentry\BeforeSendHandler' }
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Error context — `EventHint` and `ExceptionMechanism`
|
|
445
|
+
|
|
446
|
+
```php
|
|
447
|
+
// EventHint public properties:
|
|
448
|
+
// $exception — original \Throwable
|
|
449
|
+
// $mechanism — ExceptionMechanism (how it was caught)
|
|
450
|
+
// $stacktrace — custom Stacktrace override
|
|
451
|
+
// $extra — array<string, mixed> passed to before_send but not in event body
|
|
452
|
+
|
|
453
|
+
// Handled vs unhandled — affects priority and inbox routing in Sentry
|
|
454
|
+
use Sentry\ExceptionMechanism;
|
|
455
|
+
|
|
456
|
+
$hint = \Sentry\EventHint::fromArray([
|
|
457
|
+
'exception' => $exception,
|
|
458
|
+
'mechanism' => new ExceptionMechanism(ExceptionMechanism::TYPE_GENERIC, false), // unhandled
|
|
459
|
+
]);
|
|
460
|
+
\Sentry\captureException($exception, $hint);
|
|
461
|
+
|
|
462
|
+
// Exception chaining — SDK auto-walks $e->getPrevious()
|
|
463
|
+
// All chained exceptions appear as exception.values[] in the event
|
|
464
|
+
try {
|
|
465
|
+
try {
|
|
466
|
+
$pdo->query($sql); // throws PDOException
|
|
467
|
+
} catch (\PDOException $dbEx) {
|
|
468
|
+
throw new \DomainException('Payment failed', 0, $dbEx);
|
|
469
|
+
}
|
|
470
|
+
} catch (\DomainException $e) {
|
|
471
|
+
\Sentry\captureException($e);
|
|
472
|
+
// Sentry event: exception.values[0] = DomainException
|
|
473
|
+
// exception.values[1] = PDOException ($previous)
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Pass data through hint to before_send without including it in the event body
|
|
477
|
+
$hint = \Sentry\EventHint::fromArray([
|
|
478
|
+
'extra' => ['query' => $sql, 'duration_ms' => $ms],
|
|
479
|
+
]);
|
|
480
|
+
\Sentry\captureException($exception, $hint);
|
|
481
|
+
|
|
482
|
+
// Access in before_send
|
|
483
|
+
'before_send' => function (\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event {
|
|
484
|
+
if ($hint !== null && ($hint->extra['duration_ms'] ?? 0) > 5000) {
|
|
485
|
+
$event->setTag('slow_query', 'true');
|
|
486
|
+
}
|
|
487
|
+
return $event;
|
|
488
|
+
},
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### Fingerprinting (custom grouping)
|
|
492
|
+
|
|
493
|
+
Default fingerprint: `['{{ default }}']` — stack trace hash + exception type + message.
|
|
494
|
+
|
|
495
|
+
```php
|
|
496
|
+
// Via scope — persistent
|
|
497
|
+
\Sentry\configureScope(function (\Sentry\State\Scope $scope): void {
|
|
498
|
+
$scope->setFingerprint(['payment-timeout', 'stripe-api']);
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
// Via withScope — per-event, combined with default
|
|
502
|
+
\Sentry\withScope(function (\Sentry\State\Scope $scope) use ($exception, $provider): void {
|
|
503
|
+
$scope->setFingerprint(['{{ default }}', 'payment', $provider]);
|
|
504
|
+
\Sentry\captureException($exception);
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
// Via before_send — dynamic
|
|
508
|
+
\Sentry\init([
|
|
509
|
+
'before_send' => function (\Sentry\Event $event, ?\Sentry\EventHint $hint): ?\Sentry\Event {
|
|
510
|
+
if ($hint?->exception instanceof \PDOException) {
|
|
511
|
+
$msg = $hint->exception->getMessage();
|
|
512
|
+
if (str_contains($msg, 'timed out')) {
|
|
513
|
+
$event->setFingerprint(['db-timeout', 'pdo']);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return $event;
|
|
517
|
+
},
|
|
518
|
+
]);
|
|
519
|
+
|
|
520
|
+
// Via captureEvent — inline
|
|
521
|
+
$event = \Sentry\Event::createEvent();
|
|
522
|
+
$event->setFingerprint(['my-custom-group', '{{ default }}']);
|
|
523
|
+
$event->setMessage('Grouped event');
|
|
524
|
+
\Sentry\captureEvent($event);
|
|
525
|
+
|
|
526
|
+
// Scope fingerprints are APPENDED to any existing event fingerprints:
|
|
527
|
+
// array_merge($event->getFingerprint(), $scope->getFingerprint())
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
## Framework-Specific Notes
|
|
531
|
+
|
|
532
|
+
### Plain PHP
|
|
533
|
+
|
|
534
|
+
- `default_integrations: true` (default) auto-installs `set_error_handler()`,
|
|
535
|
+
`set_exception_handler()`, and `register_shutdown_function()` — no manual handlers
|
|
536
|
+
needed
|
|
537
|
+
- Always call `\Sentry\flush()` before process exit in CLI scripts
|
|
538
|
+
- In long-running workers (e.g., RoadRunner, Swoole), use `pushScope()`/`popScope()` per
|
|
539
|
+
request to prevent cross-request scope contamination
|
|
540
|
+
|
|
541
|
+
### Laravel
|
|
542
|
+
|
|
543
|
+
- **Laravel 11+**: use `Integration::handles($exceptions)` in `bootstrap/app.php`
|
|
544
|
+
- **Laravel 10 and below**: use `Integration::captureUnhandledException($e)` in
|
|
545
|
+
`Handler::register()`
|
|
546
|
+
- `Integration::captureUnhandledException()` inspects the call stack to guess whether
|
|
547
|
+
the exception was truly unhandled and sets the `ExceptionMechanism::$handled` flag
|
|
548
|
+
accordingly
|
|
549
|
+
- Laravel auto-sets user context from `Auth::user()` on the `Authenticated` event (reads
|
|
550
|
+
`id`, `email`, `username`)
|
|
551
|
+
- **Octane**: scope is automatically isolated per request via `pushScope()`/`popScope()`
|
|
552
|
+
in the Octane event handlers — no manual action needed
|
|
553
|
+
- `SENTRY_SEND_DEFAULT_PII=true` is required to capture user email and IP
|
|
554
|
+
- Log levels map to breadcrumb levels: `critical`/`alert`/`emergency` → `LEVEL_FATAL`,
|
|
555
|
+
`warning` → `LEVEL_WARNING`, `error` → `LEVEL_ERROR`, `info`/`notice` → `LEVEL_INFO`,
|
|
556
|
+
`debug` → `LEVEL_DEBUG`
|
|
557
|
+
|
|
558
|
+
### Symfony
|
|
559
|
+
|
|
560
|
+
- Errors are captured by `ErrorListener` on the `kernel.exception` event — controlled by
|
|
561
|
+
`register_error_listener: true` (default)
|
|
562
|
+
- User context requires `send_default_pii: true`; populated by `LoginListener` on
|
|
563
|
+
`LoginSuccessEvent` / `AuthenticationSuccessEvent`
|
|
564
|
+
- Inject `HubInterface` via DI rather than using global `\Sentry\*` functions in
|
|
565
|
+
services
|
|
566
|
+
- `before_send` in Symfony must be a **service ID**, not a closure — closures cannot be
|
|
567
|
+
serialized and break config caching:
|
|
568
|
+
|
|
569
|
+
```php
|
|
570
|
+
// src/Sentry/BeforeSendHandler.php
|
|
571
|
+
namespace App\Sentry;
|
|
572
|
+
|
|
573
|
+
use Sentry\Event;
|
|
574
|
+
use Sentry\EventHint;
|
|
575
|
+
|
|
576
|
+
class BeforeSendHandler
|
|
577
|
+
{
|
|
578
|
+
public function __invoke(Event $event, ?EventHint $hint): ?Event
|
|
579
|
+
{
|
|
580
|
+
// ... filter / scrub ...
|
|
581
|
+
return $event;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
```yaml
|
|
587
|
+
# config/packages/sentry.yaml
|
|
588
|
+
sentry:
|
|
589
|
+
options:
|
|
590
|
+
before_send: 'App\Sentry\BeforeSendHandler'
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
- `MessengerListener` captures exceptions from failed Messenger messages — inject it if
|
|
594
|
+
using the Messenger component
|
|
595
|
+
|
|
596
|
+
## Best Practices
|
|
597
|
+
|
|
598
|
+
- Set `send_default_pii: false` (default) — add explicit scrubbing in `before_send` for
|
|
599
|
+
any sensitive fields
|
|
600
|
+
- Use `configureScope()` for per-request data (user identity) and `withScope()` for
|
|
601
|
+
per-capture isolation
|
|
602
|
+
- Prefer `setContext()` for structured detail data; use `setTag()` only for fields you
|
|
603
|
+
want to filter/search on
|
|
604
|
+
- Use `ignore_exceptions: [...]` for exceptions that should never be reported (e.g.,
|
|
605
|
+
`NotFoundHttpException`)
|
|
606
|
+
- In PHP-FPM (one process per request), global scope is safe.
|
|
607
|
+
In long-running servers (Octane, RoadRunner), always isolate scope per request/task
|
|
608
|
+
- `ignore_exceptions` runs **before** `before_send` — matching classes are silently
|
|
609
|
+
dropped and `before_send` is never called
|
|
610
|
+
- `EventHint` received in `before_send` is the same object passed to
|
|
611
|
+
`captureException()` — use it to access the original `Throwable` and any `extra`
|
|
612
|
+
context
|
|
613
|
+
|
|
614
|
+
## Troubleshooting
|
|
615
|
+
|
|
616
|
+
| Issue | Solution |
|
|
617
|
+
| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
618
|
+
| Events not appearing in Sentry | Verify DSN, call `\Sentry\init()` before all other code, try `'debug' => true` to log to `error_log()` |
|
|
619
|
+
| User/tag data missing from events | Set scope data **before** the exception occurs; in Laravel, check `SENTRY_SEND_DEFAULT_PII` |
|
|
620
|
+
| PII appearing in events | Ensure `send_default_pii: false` (default), add `before_send` scrubber for headers/cookies |
|
|
621
|
+
| `captureException()` sends no event | Check `ignore_exceptions` — class may match by `instanceof`; verify `before_send` isn’t returning `null` |
|
|
622
|
+
| Duplicate events in Laravel | `Integration::handles()` (L11) already calls `captureUnhandledException()` — don’t also add a manual `reportable()` |
|
|
623
|
+
| Cross-request scope contamination in Octane | Enable Octane breadcrumb events (already in default config); use `pushScope()`/`popScope()` in queue workers |
|
|
624
|
+
| `before_send` option ignored in Symfony | Must be a service ID string, not a closure — closures can’t be serialized for config caching |
|
|
625
|
+
| Breadcrumbs missing | Check `max_breadcrumbs` setting and `before_breadcrumb` hook; in Laravel verify `breadcrumbs.*` config flags |
|
|
626
|
+
| Fatal errors not captured | Ensure `default_integrations: true` (default) or manually call `register_shutdown_function()` with `captureLastError()` + `flush()` |
|