@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,383 @@
|
|
|
1
|
+
# Sentry Elixir SDK
|
|
2
|
+
|
|
3
|
+
Opinionated wizard that scans your Elixir project and guides you through complete Sentry
|
|
4
|
+
setup.
|
|
5
|
+
|
|
6
|
+
> **Note:** SDK versions and APIs below reflect Sentry docs at time of writing (sentry
|
|
7
|
+
> v13.2.0, requires Elixir ~> 1.13). Always verify against
|
|
8
|
+
> [docs.sentry.io/platforms/elixir/](https://docs.sentry.io/platforms/elixir/) before
|
|
9
|
+
> implementing.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Phase 1: Detect
|
|
14
|
+
|
|
15
|
+
Run these commands to understand the project before making any recommendations:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Check existing Sentry dependency
|
|
19
|
+
grep -i sentry mix.exs 2>/dev/null
|
|
20
|
+
|
|
21
|
+
# Detect Elixir version
|
|
22
|
+
cat .tool-versions 2>/dev/null | grep elixir
|
|
23
|
+
grep "elixir:" mix.exs 2>/dev/null
|
|
24
|
+
|
|
25
|
+
# Detect Phoenix or Plug
|
|
26
|
+
grep -E '"phoenix"|"plug"' mix.exs 2>/dev/null
|
|
27
|
+
|
|
28
|
+
# Detect Phoenix LiveView
|
|
29
|
+
grep "phoenix_live_view" mix.exs 2>/dev/null
|
|
30
|
+
|
|
31
|
+
# Detect Oban (job queue / crons)
|
|
32
|
+
grep "oban" mix.exs 2>/dev/null
|
|
33
|
+
|
|
34
|
+
# Detect Quantum (cron scheduler)
|
|
35
|
+
grep "quantum" mix.exs 2>/dev/null
|
|
36
|
+
|
|
37
|
+
# Detect OpenTelemetry usage
|
|
38
|
+
grep "opentelemetry" mix.exs 2>/dev/null
|
|
39
|
+
|
|
40
|
+
# Check for companion frontend
|
|
41
|
+
ls assets/ frontend/ web/ client/ 2>/dev/null
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**What to note:**
|
|
45
|
+
|
|
46
|
+
| Signal | Impact |
|
|
47
|
+
| ------------------------------ | -------------------------------------------------------------------------------- |
|
|
48
|
+
| `sentry` already in `mix.exs`? | Skip install; go to Phase 2 (configure features) |
|
|
49
|
+
| Phoenix detected? | Add `Sentry.PlugCapture`, `Sentry.PlugContext`, optionally `Sentry.LiveViewHook` |
|
|
50
|
+
| LiveView detected? | Add `Sentry.LiveViewHook` to the `live_view` macro in `my_app_web.ex` |
|
|
51
|
+
| Oban detected? | Recommend Crons + error capture via Oban integration |
|
|
52
|
+
| Quantum detected? | Recommend Crons via Quantum integration |
|
|
53
|
+
| OpenTelemetry already present? | Tracing setup only needs `Sentry.OpenTelemetry.*` config |
|
|
54
|
+
| Frontend directory found? | Trigger Phase 4 cross-link suggestion |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Phase 2: Recommend
|
|
59
|
+
|
|
60
|
+
Based on what you found, present a concrete recommendation.
|
|
61
|
+
Don’t ask open-ended questions — lead with a proposal:
|
|
62
|
+
|
|
63
|
+
**Recommended (core coverage):**
|
|
64
|
+
|
|
65
|
+
- ✅ **Error Monitoring** — always; captures exceptions and crash reports
|
|
66
|
+
- ✅ **Logging** — `Sentry.LoggerHandler` forwards crash reports and error logs to Sentry
|
|
67
|
+
- ✅ **Tracing** — if Phoenix, Plug, or Ecto detected (via OpenTelemetry)
|
|
68
|
+
|
|
69
|
+
**Optional (enhanced observability):**
|
|
70
|
+
|
|
71
|
+
- ⚡ **Crons** — detect silent failures in scheduled jobs (Oban, Quantum, or manual
|
|
72
|
+
GenServer)
|
|
73
|
+
- ⚡ **Sentry Logs** — forward structured logs to Sentry Logs Protocol (sentry v12.0.0+)
|
|
74
|
+
|
|
75
|
+
**Recommendation logic:**
|
|
76
|
+
|
|
77
|
+
| Feature | Recommend when … |
|
|
78
|
+
| ---------------- | -------------------------------------------------------------------------------------------- |
|
|
79
|
+
| Error Monitoring | **Always** — non-negotiable baseline |
|
|
80
|
+
| Logging | **Always** — `LoggerHandler` captures crashes that aren’t explicit `capture_exception` calls |
|
|
81
|
+
| Tracing | Phoenix, Plug, Ecto, or OpenTelemetry imports detected |
|
|
82
|
+
| Crons | Oban, Quantum, or periodic `GenServer`/`Task` patterns detected |
|
|
83
|
+
| Sentry Logs | sentry v12.0.0+ in use and structured log search is needed |
|
|
84
|
+
|
|
85
|
+
Propose: _“I recommend setting up Error Monitoring + Logging
|
|
86
|
+
[+ Tracing if Phoenix/Ecto detected]. Want me to also add Crons or Sentry Logs?”_
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Phase 3: Guide
|
|
91
|
+
|
|
92
|
+
### Option 1: Igniter Installer (Recommended)
|
|
93
|
+
|
|
94
|
+
> **You need to run this yourself** — the Igniter installer requires interactive
|
|
95
|
+
> terminal input that the agent can’t handle.
|
|
96
|
+
> Copy-paste into your terminal:
|
|
97
|
+
>
|
|
98
|
+
> ```bash
|
|
99
|
+
> mix igniter.install sentry
|
|
100
|
+
> ```
|
|
101
|
+
>
|
|
102
|
+
> Available since sentry v11.0.0. It auto-configures `config/config.exs`,
|
|
103
|
+
> `config/prod.exs`, `config/runtime.exs`, and `lib/my_app/application.ex`.
|
|
104
|
+
>
|
|
105
|
+
> **Once it finishes, come back and skip to [Verification](#verification).**
|
|
106
|
+
|
|
107
|
+
If the user skips the Igniter installer, proceed with Option 2 (Manual Setup) below.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### Option 2: Manual Setup
|
|
112
|
+
|
|
113
|
+
#### Install
|
|
114
|
+
|
|
115
|
+
Add to `mix.exs` dependencies:
|
|
116
|
+
|
|
117
|
+
```elixir
|
|
118
|
+
# mix.exs
|
|
119
|
+
defp deps do
|
|
120
|
+
[
|
|
121
|
+
{:sentry, "~> 13.0"},
|
|
122
|
+
{:finch, "~> 0.21"}
|
|
123
|
+
# Add jason if using Elixir < 1.18:
|
|
124
|
+
# {:jason, "~> 1.4"},
|
|
125
|
+
]
|
|
126
|
+
end
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
mix deps.get
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### Configure
|
|
134
|
+
|
|
135
|
+
```elixir
|
|
136
|
+
# config/config.exs
|
|
137
|
+
config :sentry,
|
|
138
|
+
dsn: System.get_env("SENTRY_DSN"),
|
|
139
|
+
environment_name: config_env(),
|
|
140
|
+
enable_source_code_context: true,
|
|
141
|
+
root_source_code_paths: [File.cwd!()],
|
|
142
|
+
in_app_otp_apps: [:my_app]
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
For runtime configuration (recommended for DSN and release):
|
|
146
|
+
|
|
147
|
+
```elixir
|
|
148
|
+
# config/runtime.exs
|
|
149
|
+
import Config
|
|
150
|
+
|
|
151
|
+
config :sentry,
|
|
152
|
+
dsn: System.fetch_env!("SENTRY_DSN"),
|
|
153
|
+
release: System.get_env("SENTRY_RELEASE", "my-app@#{Application.spec(:my_app, :vsn)}")
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
#### Quick Start — Recommended Init Config
|
|
157
|
+
|
|
158
|
+
This config enables the most features with sensible defaults:
|
|
159
|
+
|
|
160
|
+
```elixir
|
|
161
|
+
# config/config.exs
|
|
162
|
+
config :sentry,
|
|
163
|
+
dsn: System.get_env("SENTRY_DSN"),
|
|
164
|
+
environment_name: config_env(),
|
|
165
|
+
enable_source_code_context: true,
|
|
166
|
+
root_source_code_paths: [File.cwd!()],
|
|
167
|
+
in_app_otp_apps: [:my_app]
|
|
168
|
+
|
|
169
|
+
# Logger handler — captures crash reports. Defined under your OTP app's :logger
|
|
170
|
+
# key so that Logger.add_handlers(:my_app) (below) actually loads it. Handlers
|
|
171
|
+
# nested under `config :sentry` would be ignored by add_handlers/1.
|
|
172
|
+
config :my_app, :logger, [
|
|
173
|
+
{:handler, :sentry_handler, Sentry.LoggerHandler, %{
|
|
174
|
+
config: %{
|
|
175
|
+
metadata: [:request_id],
|
|
176
|
+
capture_log_messages: true,
|
|
177
|
+
level: :error
|
|
178
|
+
}
|
|
179
|
+
}}
|
|
180
|
+
]
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### Activate Logger Handler
|
|
184
|
+
|
|
185
|
+
Add `Logger.add_handlers/1` in `Application.start/2`:
|
|
186
|
+
|
|
187
|
+
```elixir
|
|
188
|
+
# lib/my_app/application.ex
|
|
189
|
+
def start(_type, _args) do
|
|
190
|
+
Logger.add_handlers(:my_app) # activates the :sentry_handler configured above
|
|
191
|
+
|
|
192
|
+
children = [
|
|
193
|
+
MyAppWeb.Endpoint
|
|
194
|
+
# ... other children
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
Supervisor.start_link(children, strategy: :one_for_one)
|
|
198
|
+
end
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
#### Phoenix Integration
|
|
202
|
+
|
|
203
|
+
**`lib/my_app_web/endpoint.ex`**
|
|
204
|
+
|
|
205
|
+
```elixir
|
|
206
|
+
defmodule MyAppWeb.Endpoint do
|
|
207
|
+
use Sentry.PlugCapture # Add ABOVE use Phoenix.Endpoint (Cowboy adapter only)
|
|
208
|
+
use Phoenix.Endpoint, otp_app: :my_app
|
|
209
|
+
|
|
210
|
+
# ...
|
|
211
|
+
|
|
212
|
+
plug Plug.Parsers,
|
|
213
|
+
parsers: [:urlencoded, :multipart, :json],
|
|
214
|
+
pass: ["*/*"],
|
|
215
|
+
json_decoder: Phoenix.json_library()
|
|
216
|
+
|
|
217
|
+
plug Sentry.PlugContext # Add BELOW Plug.Parsers
|
|
218
|
+
# ...
|
|
219
|
+
end
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
> **Note:** `Sentry.PlugCapture` is only needed for the **Cowboy** adapter.
|
|
223
|
+
> Phoenix 1.7+ defaults to **Bandit**, where `PlugCapture` is harmless but unnecessary.
|
|
224
|
+
> `Sentry.PlugContext` is always recommended — it enriches events with HTTP request
|
|
225
|
+
> data.
|
|
226
|
+
|
|
227
|
+
**LiveView errors — `lib/my_app_web.ex`**
|
|
228
|
+
|
|
229
|
+
```elixir
|
|
230
|
+
def live_view do
|
|
231
|
+
quote do
|
|
232
|
+
use Phoenix.LiveView
|
|
233
|
+
|
|
234
|
+
on_mount Sentry.LiveViewHook # captures errors in mount/handle_event/handle_info
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
#### Plain Plug Application
|
|
240
|
+
|
|
241
|
+
```elixir
|
|
242
|
+
defmodule MyApp.Router do
|
|
243
|
+
use Plug.Router
|
|
244
|
+
use Sentry.PlugCapture # Cowboy only
|
|
245
|
+
|
|
246
|
+
plug Plug.Parsers, parsers: [:urlencoded, :multipart]
|
|
247
|
+
plug Sentry.PlugContext
|
|
248
|
+
# ...
|
|
249
|
+
end
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### For Each Agreed Feature
|
|
253
|
+
|
|
254
|
+
Walk through features one at a time.
|
|
255
|
+
Load the reference file for each, follow its steps, and verify before moving to the
|
|
256
|
+
next:
|
|
257
|
+
|
|
258
|
+
| Feature | Reference file | Load when … |
|
|
259
|
+
| ---------------- | ----------------------- | ---------------------------------------- |
|
|
260
|
+
| Error Monitoring | `./error-monitoring.md` | Always (baseline) |
|
|
261
|
+
| Tracing | `./tracing.md` | Phoenix / Ecto / OpenTelemetry detected |
|
|
262
|
+
| Logging | `./logging.md` | `LoggerHandler` or Sentry Logs setup |
|
|
263
|
+
| Crons | `./crons.md` | Oban, Quantum, or periodic jobs detected |
|
|
264
|
+
|
|
265
|
+
For each feature: `Read ./<feature>.md`, follow steps exactly, verify it works.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Configuration Reference
|
|
270
|
+
|
|
271
|
+
### Key Config Options
|
|
272
|
+
|
|
273
|
+
| Option | Type | Default | Purpose |
|
|
274
|
+
| ----------------------------- | ----------------------------------- | --------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
275
|
+
| `:dsn` | `string \| nil` | `nil` | SDK disabled if nil; env: `SENTRY_DSN` |
|
|
276
|
+
| `:environment_name` | `atom \| string` | `"production"` | e.g., `:prod`; env: `SENTRY_ENVIRONMENT` |
|
|
277
|
+
| `:release` | `string \| nil` | `nil` | e.g., `"my-app@1.0.0"`; env: `SENTRY_RELEASE` |
|
|
278
|
+
| `:sample_rate` | `float` | `1.0` | Error event sample rate (0.0–1.0) |
|
|
279
|
+
| `:enable_source_code_context` | `boolean` | `false` | Include source lines around errors |
|
|
280
|
+
| `:root_source_code_paths` | `[path]` | `[]` | Required when source context is enabled |
|
|
281
|
+
| `:in_app_otp_apps` | `[atom]` | `[]` | OTP apps whose modules are “in-app” in stacktraces |
|
|
282
|
+
| `:before_send` | `(event -> event \| nil) \| {m, f}` | `nil` | Hook to mutate or drop error events |
|
|
283
|
+
| `:after_send_event` | `(event, result -> any) \| {m, f}` | `nil` | Hook called after event is sent |
|
|
284
|
+
| `:filter` | `module` | `Sentry.DefaultEventFilter` | Module implementing `Sentry.EventFilter` |
|
|
285
|
+
| `:max_breadcrumbs` | `integer` | `100` | Max breadcrumbs per process |
|
|
286
|
+
| `:max_stacktrace_arg_length` | `integer` | `10000` | Max length (in graphemes) of each inspected function argument in stacktrace vars (v13.2.0+) |
|
|
287
|
+
| `:dedup_events` | `boolean` | `true` | Deduplicate identical events within ~30 seconds |
|
|
288
|
+
| `:tags` | `map` | `%{}` | Global tags sent with every event |
|
|
289
|
+
| `:traces_sample_rate` | `float \| nil` | `nil` | Non-nil enables tracing (requires OTel setup) |
|
|
290
|
+
| `:traces_sampler` | `fn \| {m, f} \| nil` | `nil` | Custom per-transaction sampling |
|
|
291
|
+
| `:enable_logs` | `boolean` | `false` | Enable Sentry Logs Protocol (v12.0.0+) |
|
|
292
|
+
| `:scrubber` | `keyword` | `[]` | Scrubber config (v13.1.1+); keys: `:conn_private_allow_list` (list of atoms kept from `Plug.Conn.private`) |
|
|
293
|
+
| `:test_mode` | `boolean` | `false` | Capture events in-memory for testing |
|
|
294
|
+
|
|
295
|
+
### Default PII Guidance
|
|
296
|
+
|
|
297
|
+
Most Sentry SDKs expose a send-default-PII option.
|
|
298
|
+
As of sentry v12, the Elixir SDK does not expose a `send_default_pii` config option in
|
|
299
|
+
its documented option list or current config schema, so do **not** add a non-existent
|
|
300
|
+
option. For richer user context, use `Sentry.PlugContext` and explicitly set allowed
|
|
301
|
+
fields with `Sentry.Context.set_user_context/1`, then scrub with `:before_send` if
|
|
302
|
+
needed. If a future Elixir SDK release adds `send_default_pii`, recommend setting it.
|
|
303
|
+
|
|
304
|
+
**Automatic PII Scrubbing:** As of v13.1.0, stacktrace frame variables and
|
|
305
|
+
`FunctionClauseError`/`Phoenix.ActionClauseError` arguments are automatically scrubbed
|
|
306
|
+
for sensitive data using the same scrubber rules as HTTP request data.
|
|
307
|
+
Use `:scrubber` config to customize which `Plug.Conn.private` keys are retained.
|
|
308
|
+
|
|
309
|
+
### Environment Variables
|
|
310
|
+
|
|
311
|
+
| Variable | Maps to | Purpose |
|
|
312
|
+
| -------------------- | ------------------- | ---------------------------------- |
|
|
313
|
+
| `SENTRY_DSN` | `:dsn` | Data Source Name |
|
|
314
|
+
| `SENTRY_RELEASE` | `:release` | App version (e.g., `my-app@1.0.0`) |
|
|
315
|
+
| `SENTRY_ENVIRONMENT` | `:environment_name` | Deployment environment |
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Verification
|
|
320
|
+
|
|
321
|
+
Test that Sentry is receiving events:
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
# Send a test event from your project
|
|
325
|
+
MIX_ENV=dev mix sentry.send_test_event
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Or add a temporary call in a controller action:
|
|
329
|
+
|
|
330
|
+
```elixir
|
|
331
|
+
# Temporary test — remove after confirming
|
|
332
|
+
def index(conn, _params) do
|
|
333
|
+
Sentry.capture_message("Sentry Elixir SDK test event")
|
|
334
|
+
text(conn, "sent")
|
|
335
|
+
end
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
Check the Sentry dashboard within a few seconds.
|
|
339
|
+
If nothing appears:
|
|
340
|
+
|
|
341
|
+
1. Set `config :sentry, log_level: :debug` for verbose SDK output
|
|
342
|
+
2. Verify `SENTRY_DSN` is set and the project exists
|
|
343
|
+
3. Confirm `:environment_name` is not set to a value Sentry filters in your alert rules
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Phase 4: Cross-Link
|
|
348
|
+
|
|
349
|
+
After completing Elixir setup, check for a companion frontend missing Sentry coverage:
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
ls assets/ frontend/ web/ client/ ui/ 2>/dev/null
|
|
353
|
+
cat assets/package.json frontend/package.json 2>/dev/null | grep -E '"react"|"svelte"|"vue"|"next"'
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
If a frontend directory exists without Sentry configured, suggest the matching skill:
|
|
357
|
+
|
|
358
|
+
| Frontend detected | Suggest skill |
|
|
359
|
+
| ------------------ | -------------------------------------------------------------------------------------------------------------- |
|
|
360
|
+
| React / Next.js | [`react`](../react/index.md) or [`nextjs`](../nextjs/index.md) |
|
|
361
|
+
| Svelte / SvelteKit | [`svelte`](../svelte/index.md) |
|
|
362
|
+
| Vue | See [docs.sentry.io/platforms/javascript/guides/vue/](https://docs.sentry.io/platforms/javascript/guides/vue/) |
|
|
363
|
+
| Other JS/TS | [`browser`](../browser/index.md) |
|
|
364
|
+
|
|
365
|
+
Connecting Phoenix backend and JavaScript frontend with linked Sentry projects enables
|
|
366
|
+
**distributed tracing** — stack traces that span the browser, Phoenix HTTP server, and
|
|
367
|
+
downstream services in a single trace view.
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Troubleshooting
|
|
372
|
+
|
|
373
|
+
| Issue | Solution |
|
|
374
|
+
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
375
|
+
| Events not appearing | Verify `SENTRY_DSN` is set; run `mix sentry.send_test_event`; set `log_level: :debug` |
|
|
376
|
+
| Missing stack traces on captured exceptions | Pass `stacktrace: __STACKTRACE__` in the `rescue` block: `Sentry.capture_exception(e, stacktrace: __STACKTRACE__)` |
|
|
377
|
+
| `PlugCapture` not working on Bandit | `Sentry.PlugCapture` is Cowboy-only; with Bandit errors surface via `LoggerHandler` |
|
|
378
|
+
| Source code context missing in production | Run `mix sentry.package_source_code` before building your OTP release |
|
|
379
|
+
| Context not appearing on async events | `Sentry.Context.*` is process-scoped; pass values explicitly or propagate Logger metadata across processes |
|
|
380
|
+
| Oban integration not reporting crons | Requires Oban v2.17.6+ or Oban Pro; cron jobs must have `"cron" => true` in job meta |
|
|
381
|
+
| Duplicate events from Cowboy/Bandit crashes | Set `excluded_domains: [:cowboy, :bandit]` in `LoggerHandler` config (both excluded by default as of v13.1.0) |
|
|
382
|
+
| `finch` not starting | Ensure `{:finch, "~> 0.21"}` is in deps; Finch is the default HTTP client since v12.0.0 |
|
|
383
|
+
| JSON encoding error | Add `{:jason, "~> 1.4"}` and set `json_library: Jason` for Elixir < 1.18 |
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Logging — Sentry Elixir SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `sentry` v9.0.0+ for `Sentry.LoggerHandler`; v12.0.0+ for Sentry Logs
|
|
4
|
+
> Protocol
|
|
5
|
+
|
|
6
|
+
The Elixir SDK provides two independent logging mechanisms:
|
|
7
|
+
|
|
8
|
+
1. **`Sentry.LoggerHandler`** — Erlang `:logger` handler that forwards crash reports and
|
|
9
|
+
error log messages from your app to Sentry as _error events_. This is the primary way
|
|
10
|
+
to catch errors that weren’t explicitly passed to `capture_exception/2`.
|
|
11
|
+
|
|
12
|
+
2. **Sentry Logs Protocol** (v12.0.0+) — Forwards structured log entries to Sentry’s
|
|
13
|
+
Logs product, where they appear alongside errors and traces.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Sentry.LoggerHandler
|
|
18
|
+
|
|
19
|
+
### Configuration
|
|
20
|
+
|
|
21
|
+
The recommended setup uses the `:logger` key in your app’s config and activates handlers
|
|
22
|
+
in `Application.start/2`.
|
|
23
|
+
|
|
24
|
+
**Step 1: Define the handler in config**
|
|
25
|
+
|
|
26
|
+
```elixir
|
|
27
|
+
# config/config.exs
|
|
28
|
+
config :my_app, :logger, [
|
|
29
|
+
{:handler, :sentry_handler, Sentry.LoggerHandler, %{
|
|
30
|
+
config: %{
|
|
31
|
+
metadata: [:request_id, :user_id], # Logger metadata keys to include as extra context
|
|
32
|
+
capture_log_messages: true, # Send all :error messages, not just crash reports
|
|
33
|
+
level: :error # Minimum log level (default: :error)
|
|
34
|
+
}
|
|
35
|
+
}}
|
|
36
|
+
]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Step 2: Activate in Application.start/2**
|
|
40
|
+
|
|
41
|
+
```elixir
|
|
42
|
+
# lib/my_app/application.ex
|
|
43
|
+
def start(_type, _args) do
|
|
44
|
+
Logger.add_handlers(:my_app) # activates all handlers defined in config :my_app, :logger
|
|
45
|
+
|
|
46
|
+
children = [
|
|
47
|
+
MyAppWeb.Endpoint
|
|
48
|
+
# ... other children
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
Supervisor.start_link(children, strategy: :one_for_one)
|
|
52
|
+
end
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Alternative: Add handler directly in Application.start/2**
|
|
56
|
+
|
|
57
|
+
```elixir
|
|
58
|
+
def start(_type, _args) do
|
|
59
|
+
:logger.add_handler(:sentry_handler, Sentry.LoggerHandler, %{
|
|
60
|
+
config: %{
|
|
61
|
+
metadata: [:request_id],
|
|
62
|
+
capture_log_messages: true,
|
|
63
|
+
level: :error
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
Supervisor.start_link(children, strategy: :one_for_one)
|
|
68
|
+
end
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### LoggerHandler Configuration Options
|
|
72
|
+
|
|
73
|
+
| Option | Type | Default | Description |
|
|
74
|
+
| ----------------------- | ------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
|
75
|
+
| `:level` | `Logger.level \| nil` | `:error` | Minimum log level to forward to Sentry |
|
|
76
|
+
| `:excluded_domains` | `[atom]` | `[:cowboy]` | Domains to skip (cowboy excluded by default to avoid double-reporting with `PlugCapture`) |
|
|
77
|
+
| `:metadata` | `[atom] \| :all` | `[]` | Logger metadata keys to include as extra context on the Sentry event |
|
|
78
|
+
| `:tags_from_metadata` | `[atom]` | `[]` | Metadata keys to promote to Sentry tags (searchable). Since v10.9.0 |
|
|
79
|
+
| `:capture_log_messages` | `boolean` | `false` | When `true`, all `:error`+ log messages are sent; when `false`, only crash reports (supervisor crashes, process exits) are sent |
|
|
80
|
+
| `:rate_limiting` | `[max_events: integer, interval: integer] \| nil` | `nil` | Rate limit; e.g., `[max_events: 10, interval: 1_000]`. Since v10.5.0 |
|
|
81
|
+
| `:sync_threshold` | `non_neg_integer \| nil` | `100` | Queue depth before switching to sync mode. Since v10.6.0 |
|
|
82
|
+
| `:discard_threshold` | `non_neg_integer \| nil` | `nil` | Queue depth above which events are dropped (cannot combine with `:sync_threshold`). Since v10.9.0 |
|
|
83
|
+
|
|
84
|
+
### Capturing specific log levels only
|
|
85
|
+
|
|
86
|
+
```elixir
|
|
87
|
+
config :my_app, :logger, [
|
|
88
|
+
{:handler, :sentry_handler, Sentry.LoggerHandler, %{
|
|
89
|
+
config: %{
|
|
90
|
+
level: :warning, # :debug | :info | :warning | :error | :critical
|
|
91
|
+
capture_log_messages: true,
|
|
92
|
+
metadata: :all # include all Logger metadata
|
|
93
|
+
}
|
|
94
|
+
}}
|
|
95
|
+
]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Rate limiting
|
|
99
|
+
|
|
100
|
+
Prevent log storms from flooding Sentry:
|
|
101
|
+
|
|
102
|
+
```elixir
|
|
103
|
+
config :my_app, :logger, [
|
|
104
|
+
{:handler, :sentry_handler, Sentry.LoggerHandler, %{
|
|
105
|
+
config: %{
|
|
106
|
+
capture_log_messages: true,
|
|
107
|
+
level: :error,
|
|
108
|
+
rate_limiting: [max_events: 20, interval: 60_000] # max 20 events per minute
|
|
109
|
+
}
|
|
110
|
+
}}
|
|
111
|
+
]
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Promoting metadata to Sentry tags
|
|
115
|
+
|
|
116
|
+
Tags are indexed and searchable in Sentry.
|
|
117
|
+
Promote high-value metadata keys:
|
|
118
|
+
|
|
119
|
+
```elixir
|
|
120
|
+
config :my_app, :logger, [
|
|
121
|
+
{:handler, :sentry_handler, Sentry.LoggerHandler, %{
|
|
122
|
+
config: %{
|
|
123
|
+
metadata: [:request_id, :user_id, :region],
|
|
124
|
+
tags_from_metadata: [:region], # "region" becomes a searchable Sentry tag
|
|
125
|
+
capture_log_messages: true,
|
|
126
|
+
level: :error
|
|
127
|
+
}
|
|
128
|
+
}}
|
|
129
|
+
]
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### LoggerBackend (legacy)
|
|
133
|
+
|
|
134
|
+
`Sentry.LoggerBackend` is the older Elixir `Logger` backend.
|
|
135
|
+
Prefer `LoggerHandler` for new projects.
|
|
136
|
+
`LoggerBackend` will eventually be deprecated.
|
|
137
|
+
|
|
138
|
+
```elixir
|
|
139
|
+
# lib/my_app/application.ex
|
|
140
|
+
def start(_type, _args) do
|
|
141
|
+
Logger.add_backend(Sentry.LoggerBackend)
|
|
142
|
+
# ...
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# config/config.exs
|
|
146
|
+
config :logger, Sentry.LoggerBackend,
|
|
147
|
+
level: :warning,
|
|
148
|
+
excluded_domains: [],
|
|
149
|
+
metadata: [:foo_bar],
|
|
150
|
+
capture_log_messages: true
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Sentry Logs Protocol (since v12.0.0)
|
|
156
|
+
|
|
157
|
+
The Sentry Logs feature sends structured log entries to Sentry’s Logs product — separate
|
|
158
|
+
from error events. This enables log search, log-to-trace correlation, and dashboards
|
|
159
|
+
alongside your error data.
|
|
160
|
+
|
|
161
|
+
### Enable
|
|
162
|
+
|
|
163
|
+
```elixir
|
|
164
|
+
# config/config.exs
|
|
165
|
+
config :sentry,
|
|
166
|
+
enable_logs: true, # auto-attaches a TelemetryProcessor-backed LoggerHandler
|
|
167
|
+
logs: [
|
|
168
|
+
level: :info, # minimum log level (default: :info)
|
|
169
|
+
metadata: [:request_id, :user_id], # metadata keys to include as log attributes
|
|
170
|
+
excluded_domains: [:cowboy, :ecto_sql] # domains to skip
|
|
171
|
+
]
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`enable_logs: true` automatically wires up a Logger handler that captures log entries
|
|
175
|
+
and forwards them to the Sentry Logs Protocol endpoint via the `TelemetryProcessor`.
|
|
176
|
+
|
|
177
|
+
### Filter logs before sending
|
|
178
|
+
|
|
179
|
+
```elixir
|
|
180
|
+
config :sentry,
|
|
181
|
+
enable_logs: true,
|
|
182
|
+
before_send_log: fn log_event ->
|
|
183
|
+
# Return nil to drop the log; return log_event to send it
|
|
184
|
+
if log_event.level == :debug, do: nil, else: log_event
|
|
185
|
+
end
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Route all categories through TelemetryProcessor
|
|
189
|
+
|
|
190
|
+
By default only logs use the `TelemetryProcessor` ring buffer.
|
|
191
|
+
You can route errors, check-ins, and transactions through it too:
|
|
192
|
+
|
|
193
|
+
```elixir
|
|
194
|
+
config :sentry,
|
|
195
|
+
enable_logs: true,
|
|
196
|
+
telemetry_processor_categories: [:log, :error, :check_in, :transaction]
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## How the Two Systems Interact
|
|
202
|
+
|
|
203
|
+
| What | LoggerHandler | Sentry Logs Protocol |
|
|
204
|
+
| ----------------- | ------------------------------- | ----------------------------------------------- |
|
|
205
|
+
| Appears in Sentry | Issues (errors) | Logs product |
|
|
206
|
+
| Use for | Crash reports, unhandled errors | Structured log search, log-to-trace correlation |
|
|
207
|
+
| Min SDK version | v9.0.0 | v12.0.0 |
|
|
208
|
+
| Config key | `:logger` in app config | `:enable_logs` in sentry config |
|
|
209
|
+
|
|
210
|
+
You can run both simultaneously.
|
|
211
|
+
A common setup: `LoggerHandler` at `:error` level for issues, and Sentry Logs at `:info`
|
|
212
|
+
for structured log search.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Best Practices
|
|
217
|
+
|
|
218
|
+
- Prefer `Sentry.LoggerHandler` over `Sentry.LoggerBackend` for new projects —
|
|
219
|
+
`LoggerHandler` is the Erlang `:logger` handler and runs in the calling process, which
|
|
220
|
+
is more efficient
|
|
221
|
+
- Set `excluded_domains: [:cowboy]` (the default) to avoid duplicate events when using
|
|
222
|
+
`Sentry.PlugCapture` with Cowboy
|
|
223
|
+
- Enable `capture_log_messages: true` to catch error-level log messages that are not
|
|
224
|
+
explicit `capture_exception` calls
|
|
225
|
+
- Use `tags_from_metadata` to promote high-cardinality identifiers (user ID, region,
|
|
226
|
+
request ID) to searchable Sentry tags
|
|
227
|
+
- Apply `rate_limiting` in high-throughput services to prevent log storms from
|
|
228
|
+
overwhelming your Sentry quota
|
|
229
|
+
|
|
230
|
+
## Troubleshooting
|
|
231
|
+
|
|
232
|
+
| Issue | Solution |
|
|
233
|
+
| ------------------------------------ | --------------------------------------------------------------------------------- |
|
|
234
|
+
| LoggerHandler not capturing anything | Verify `Logger.add_handlers(:my_app)` is called in `Application.start/2` |
|
|
235
|
+
| Duplicate events from Cowboy crashes | `excluded_domains: [:cowboy]` is the default; check if it was removed from config |
|
|
236
|
+
| No Sentry Logs entries appearing | Ensure `enable_logs: true` is set and sentry v12.0.0+ is in use |
|
|
237
|
+
| Log metadata not appearing in Sentry | List keys explicitly in `metadata:` option; or use `metadata: :all` |
|
|
238
|
+
| Too many log events hitting quota | Add `rate_limiting: [max_events: N, interval: ms]` to `LoggerHandler` config |
|
|
239
|
+
| `LoggerBackend` warnings in logs | Migrate to `Sentry.LoggerHandler`; `LoggerBackend` will be deprecated |
|