@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,107 @@
|
|
|
1
|
+
# Profiling — Sentry Ruby SDK
|
|
2
|
+
|
|
3
|
+
> ⚠️ **Beta** — profiling is in beta and may have bugs.
|
|
4
|
+
> Minimum SDK: `sentry-ruby` v5.9.0+ (StackProf), v5.21.0+ (Vernier)
|
|
5
|
+
|
|
6
|
+
Profiling attaches CPU/memory samples to Sentry transactions.
|
|
7
|
+
It requires tracing to be enabled first — `profiles_sample_rate` is relative to
|
|
8
|
+
`traces_sample_rate`.
|
|
9
|
+
|
|
10
|
+
## Contents
|
|
11
|
+
|
|
12
|
+
- [Choosing a profiler](#choosing-a-profiler)
|
|
13
|
+
- [StackProf setup](#stackprof-setup)
|
|
14
|
+
- [Vernier setup](#vernier-setup)
|
|
15
|
+
- [Configuration](#configuration)
|
|
16
|
+
- [Best Practices](#best-practices)
|
|
17
|
+
- [Troubleshooting](#troubleshooting)
|
|
18
|
+
|
|
19
|
+
## Choosing a Profiler
|
|
20
|
+
|
|
21
|
+
| Profiler | Gem | Min sentry-ruby | Min Ruby | Notes |
|
|
22
|
+
| --------- | ----------- | --------------- | -------- | -------------------------- |
|
|
23
|
+
| StackProf | `stackprof` | v5.9.0 | Any | Wall-clock or CPU sampling |
|
|
24
|
+
| Vernier | `vernier` | v5.21.0 | 3.2.1+ | Lower overhead; GVL-aware |
|
|
25
|
+
|
|
26
|
+
Vernier is preferred for Ruby 3.2.1+ applications.
|
|
27
|
+
Use StackProf for older Ruby versions.
|
|
28
|
+
|
|
29
|
+
### GVL-aware profiling (Vernier)
|
|
30
|
+
|
|
31
|
+
Ruby’s Global VM Lock (GVL) means only one thread executes Ruby code at a time.
|
|
32
|
+
StackProf only samples the thread holding the GVL, so multi-threaded apps (Puma,
|
|
33
|
+
Sidekiq) show incomplete profiles.
|
|
34
|
+
Vernier is GVL-aware — it tracks all threads including those waiting on I/O or the GVL,
|
|
35
|
+
giving a complete picture of where time is spent across the entire process.
|
|
36
|
+
|
|
37
|
+
### Production overhead
|
|
38
|
+
|
|
39
|
+
Both profilers use sampling (not tracing), so overhead is low.
|
|
40
|
+
Expect ~2-5% CPU overhead per profiled transaction.
|
|
41
|
+
Use `profiles_sample_rate` to control how many transactions are profiled — start with
|
|
42
|
+
`0.1` in production and adjust based on your performance budget.
|
|
43
|
+
|
|
44
|
+
## StackProf Setup
|
|
45
|
+
|
|
46
|
+
```ruby
|
|
47
|
+
# Gemfile
|
|
48
|
+
gem "sentry-ruby"
|
|
49
|
+
gem "sentry-rails" # if Rails
|
|
50
|
+
gem "stackprof"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
# config/initializers/sentry.rb (Rails) or Sentry.init block
|
|
55
|
+
Sentry.init do |config|
|
|
56
|
+
config.dsn = ENV["SENTRY_DSN"]
|
|
57
|
+
config.traces_sample_rate = 1.0 # tracing must be enabled
|
|
58
|
+
config.profiles_sample_rate = 1.0 # relative to traces_sample_rate
|
|
59
|
+
end
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Vernier Setup
|
|
63
|
+
|
|
64
|
+
```ruby
|
|
65
|
+
# Gemfile
|
|
66
|
+
gem "sentry-ruby"
|
|
67
|
+
gem "sentry-rails" # if Rails
|
|
68
|
+
gem "vernier"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```ruby
|
|
72
|
+
Sentry.init do |config|
|
|
73
|
+
config.dsn = ENV["SENTRY_DSN"]
|
|
74
|
+
config.traces_sample_rate = 1.0
|
|
75
|
+
config.profiles_sample_rate = 1.0
|
|
76
|
+
config.profiler_class = Sentry::Vernier::Profiler # opt into Vernier
|
|
77
|
+
end
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Configuration
|
|
81
|
+
|
|
82
|
+
| Option | Type | Default | Purpose |
|
|
83
|
+
| ---------------------- | ----- | ------------------ | ----------------------------------------------------------------- |
|
|
84
|
+
| `profiles_sample_rate` | Float | `nil` | Fraction of sampled transactions that include a profile [0.0–1.0] |
|
|
85
|
+
| `profiler_class` | Class | StackProf profiler | Set to `Sentry::Vernier::Profiler` to use Vernier |
|
|
86
|
+
|
|
87
|
+
`profiles_sample_rate` is **relative** to `traces_sample_rate`. With
|
|
88
|
+
`traces_sample_rate = 0.1` and `profiles_sample_rate = 0.5`, 5% of total transactions
|
|
89
|
+
include a profile.
|
|
90
|
+
|
|
91
|
+
## Best Practices
|
|
92
|
+
|
|
93
|
+
- Start with `profiles_sample_rate = 1.0` in development to verify profiles appear in
|
|
94
|
+
Sentry
|
|
95
|
+
- Lower to `0.1`–`0.5` in production — profiling adds overhead per sampled transaction
|
|
96
|
+
- Prefer Vernier on Ruby 3.2.1+ for lower overhead and GVL visibility
|
|
97
|
+
- Profiling without tracing is not supported — ensure `traces_sample_rate > 0`
|
|
98
|
+
|
|
99
|
+
## Troubleshooting
|
|
100
|
+
|
|
101
|
+
| Issue | Solution |
|
|
102
|
+
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
103
|
+
| No profiles in Sentry | Verify `traces_sample_rate > 0` — profiling requires tracing to be active |
|
|
104
|
+
| `Sentry::Vernier::Profiler` not found | Ensure `vernier` gem is installed and `sentry-ruby` ≥ 5.21.0 |
|
|
105
|
+
| StackProf missing constant error | Add `gem "stackprof"` to Gemfile and run `bundle install` |
|
|
106
|
+
| Profiles on some requests only | Expected — `profiles_sample_rate` is a fraction of sampled transactions, not all requests |
|
|
107
|
+
| Beta instability | Check [sentry-ruby releases](https://github.com/getsentry/sentry-ruby/releases) for fixes; report issues there |
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
# Tracing — Sentry Ruby SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `sentry-ruby` v5.10.0+ for distributed tracing out of the box
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- [Configuration](#configuration)
|
|
8
|
+
- [Automatic Instrumentation](#automatic-instrumentation)
|
|
9
|
+
- [Custom Instrumentation](#custom-instrumentation)
|
|
10
|
+
- [Distributed Tracing](#distributed-tracing)
|
|
11
|
+
- [`before_send_transaction` hook](#before_send_transaction-hook)
|
|
12
|
+
- [OpenTelemetry — OTLP Integration](#opentelemetry--otlp-integration)
|
|
13
|
+
- [Framework Auto-Instrumentation Summary](#framework-auto-instrumentation-summary)
|
|
14
|
+
- [Request Queue Time](#request-queue-time)
|
|
15
|
+
- [Best Practices](#best-practices)
|
|
16
|
+
- [Troubleshooting](#troubleshooting)
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
|
|
20
|
+
| Option | Type | Default | Purpose |
|
|
21
|
+
| --------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
22
|
+
| `traces_sample_rate` | Float | `nil` | Uniform sample rate [0.0–1.0]; `nil` disables tracing |
|
|
23
|
+
| `traces_sampler` | Lambda | `nil` | Custom per-transaction sampling; overrides `traces_sample_rate` |
|
|
24
|
+
| `trace_propagation_targets` | Array | `[/.*/]` | URLs to inject `sentry-trace` + `baggage` headers into |
|
|
25
|
+
| `propagate_traces` | Boolean | `true` | Propagate trace headers on outbound Net::HTTP requests |
|
|
26
|
+
| `capture_queue_time` | Boolean | `true` | Record request queue time from `X-Request-Start` header (v6.4.0+, Rails fixed in v6.4.1) |
|
|
27
|
+
| `org_id` | String | `nil` | Explicit organization ID; overrides the value auto-extracted from the DSN. Set this for self-hosted or Relay setups where DSN-based parsing may not work (v6.5.0+) |
|
|
28
|
+
| `strict_trace_continuation` | Boolean | `false` | When `true`, only continue an incoming trace if the `sentry-org_id` baggage matches the SDK’s effective org ID; if either is missing the trace is **not** continued. Prevents inadvertent trace stitching from unknown third-party services (v6.5.0+) |
|
|
29
|
+
|
|
30
|
+
```ruby
|
|
31
|
+
Sentry.init do |config|
|
|
32
|
+
config.traces_sample_rate = 1.0 # set to 0.05–0.2 in production
|
|
33
|
+
|
|
34
|
+
# — or — per-transaction dynamic sampling:
|
|
35
|
+
config.traces_sampler = lambda do |sampling_context|
|
|
36
|
+
tc = sampling_context[:transaction_context]
|
|
37
|
+
case tc[:op]
|
|
38
|
+
when /http/
|
|
39
|
+
case tc[:name]
|
|
40
|
+
when /health/ then 0.0 # drop health checks
|
|
41
|
+
else 0.1
|
|
42
|
+
end
|
|
43
|
+
when /sidekiq/ then 0.01
|
|
44
|
+
else 0.0
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Automatic Instrumentation
|
|
51
|
+
|
|
52
|
+
### Rails (via `sentry-rails`)
|
|
53
|
+
|
|
54
|
+
No extra code needed.
|
|
55
|
+
The following are auto-instrumented:
|
|
56
|
+
|
|
57
|
+
- `ActionController` — one transaction per request
|
|
58
|
+
- `ActiveRecord` — SQL queries as child spans
|
|
59
|
+
- `ActionMailer` — mail delivery as child spans
|
|
60
|
+
- `ActiveJob` — job execution as child spans
|
|
61
|
+
- `Net::HTTP` outbound calls — child spans with trace header propagation
|
|
62
|
+
|
|
63
|
+
### Rack / Sinatra (via `Sentry::Rack::CaptureExceptions`)
|
|
64
|
+
|
|
65
|
+
```ruby
|
|
66
|
+
use Sentry::Rack::CaptureExceptions
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Wraps each Rack request in a transaction.
|
|
70
|
+
|
|
71
|
+
### Sidekiq (via `sentry-sidekiq`)
|
|
72
|
+
|
|
73
|
+
No extra code. Each worker execution becomes a transaction, inheriting distributed trace
|
|
74
|
+
context from the enqueuing request.
|
|
75
|
+
|
|
76
|
+
## Custom Instrumentation
|
|
77
|
+
|
|
78
|
+
### Wrap a block in a child span (preferred)
|
|
79
|
+
|
|
80
|
+
```ruby
|
|
81
|
+
Sentry.with_child_span(op: "process_items", description: "processing order items") do |span|
|
|
82
|
+
span&.set_data(:item_count, items.length)
|
|
83
|
+
span&.set_data(:order_id, order.id)
|
|
84
|
+
order.process_items
|
|
85
|
+
end
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`with_child_span` yields `nil` when not sampling — always guard data calls with
|
|
89
|
+
`span&.set_data`.
|
|
90
|
+
|
|
91
|
+
### Child span on an existing transaction
|
|
92
|
+
|
|
93
|
+
```ruby
|
|
94
|
+
transaction = Sentry.get_current_scope.get_transaction
|
|
95
|
+
transaction&.with_child_span(op: "cache.fetch", description: "fetch user cache") do |span|
|
|
96
|
+
span&.set_data("cache.key", cache_key)
|
|
97
|
+
Rails.cache.fetch(cache_key) { User.find(user_id) }
|
|
98
|
+
end
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Manual transaction (only when no automatic transaction wraps the code)
|
|
102
|
+
|
|
103
|
+
```ruby
|
|
104
|
+
transaction = Sentry.start_transaction(
|
|
105
|
+
name: "ProcessBatch",
|
|
106
|
+
op: "background_job",
|
|
107
|
+
sampled: true
|
|
108
|
+
)
|
|
109
|
+
Sentry.get_current_scope.set_span(transaction)
|
|
110
|
+
|
|
111
|
+
begin
|
|
112
|
+
process_batch(records)
|
|
113
|
+
transaction.set_status("ok")
|
|
114
|
+
rescue => e
|
|
115
|
+
transaction.set_status("internal_error")
|
|
116
|
+
Sentry.capture_exception(e)
|
|
117
|
+
raise
|
|
118
|
+
ensure
|
|
119
|
+
transaction.finish
|
|
120
|
+
end
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Span data conventions
|
|
124
|
+
|
|
125
|
+
```ruby
|
|
126
|
+
Sentry.with_child_span(op: "http.client") do |span|
|
|
127
|
+
span&.set_data("http.method", "POST")
|
|
128
|
+
span&.set_data("http.url", endpoint)
|
|
129
|
+
response = http_client.post(endpoint, body)
|
|
130
|
+
span&.set_data("http.status_code", response.status)
|
|
131
|
+
response
|
|
132
|
+
end
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Distributed Tracing
|
|
136
|
+
|
|
137
|
+
Distributed tracing works out of the box for same-process `Net::HTTP` calls — Sentry
|
|
138
|
+
patches Net::HTTP to inject `sentry-trace` and `baggage` headers automatically.
|
|
139
|
+
|
|
140
|
+
### Manual header propagation (custom HTTP clients)
|
|
141
|
+
|
|
142
|
+
```ruby
|
|
143
|
+
headers = Sentry.get_trace_propagation_headers
|
|
144
|
+
# => { "sentry-trace" => "abc...xyz-1", "baggage" => "sentry-trace_id=abc..." }
|
|
145
|
+
|
|
146
|
+
faraday_conn.get("/api/orders") do |req|
|
|
147
|
+
headers.each { |k, v| req.headers[k] = v }
|
|
148
|
+
end
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Frontend trace stitching (Ruby backend → JS frontend)
|
|
152
|
+
|
|
153
|
+
Inject Sentry trace metadata into your HTML `<head>` so the browser SDK can continue the
|
|
154
|
+
same trace:
|
|
155
|
+
|
|
156
|
+
**Rails (`app/views/layouts/application.html.erb`):**
|
|
157
|
+
|
|
158
|
+
```erb
|
|
159
|
+
<head>
|
|
160
|
+
<%= Sentry.get_trace_propagation_meta.html_safe %>
|
|
161
|
+
...
|
|
162
|
+
</head>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
This renders two `<meta>` tags that `@sentry/browser` (and framework SDKs like
|
|
166
|
+
`@sentry/react`, [`svelte`](../svelte/index.md)) automatically read on page load.
|
|
167
|
+
Requires `browserTracingIntegration` on the frontend SDK.
|
|
168
|
+
|
|
169
|
+
### Inbound trace propagation (accepting from upstream)
|
|
170
|
+
|
|
171
|
+
Rails and Rack middleware automatically read incoming `sentry-trace` and `baggage`
|
|
172
|
+
headers and continue the trace — no configuration required.
|
|
173
|
+
|
|
174
|
+
### Strict trace continuation (v6.5.0+)
|
|
175
|
+
|
|
176
|
+
By default the SDK continues any incoming trace regardless of which organization sent
|
|
177
|
+
it.
|
|
178
|
+
Enable `strict_trace_continuation` to reject traces from services outside your Sentry
|
|
179
|
+
organization:
|
|
180
|
+
|
|
181
|
+
```ruby
|
|
182
|
+
Sentry.init do |config|
|
|
183
|
+
config.dsn = ENV["SENTRY_DSN"]
|
|
184
|
+
# Reject traces where the incoming sentry-org_id baggage doesn't match this SDK's org.
|
|
185
|
+
# The org ID is normally extracted from the DSN automatically.
|
|
186
|
+
# For self-hosted or Relay setups where the DSN host doesn't embed an org ID, set it explicitly:
|
|
187
|
+
# config.org_id = "123456"
|
|
188
|
+
config.strict_trace_continuation = true
|
|
189
|
+
end
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Decision matrix:**
|
|
193
|
+
|
|
194
|
+
| Incoming `sentry-org_id` | SDK org ID | `strict_trace_continuation` | Result |
|
|
195
|
+
| ------------------------ | ------------ | --------------------------- | ------------------- |
|
|
196
|
+
| matches | matches | `false` | Continue trace |
|
|
197
|
+
| missing | present | `false` | Continue trace |
|
|
198
|
+
| present | missing | `false` | Continue trace |
|
|
199
|
+
| missing | missing | `false` | Continue trace |
|
|
200
|
+
| **mismatch** | **mismatch** | **`false`** | **Start new trace** |
|
|
201
|
+
| matches | matches | `true` | Continue trace |
|
|
202
|
+
| missing | present | `true` | **Start new trace** |
|
|
203
|
+
| present | missing | `true` | **Start new trace** |
|
|
204
|
+
| missing | missing | `true` | Continue trace |
|
|
205
|
+
| mismatch | mismatch | `true` | Start new trace |
|
|
206
|
+
|
|
207
|
+
Use `strict_trace_continuation` when your service receives requests from third-party
|
|
208
|
+
systems that also use Sentry — without it, their trace IDs can accidentally appear in
|
|
209
|
+
your dashboards.
|
|
210
|
+
|
|
211
|
+
## `before_send_transaction` hook
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
config.before_send_transaction = lambda do |event, _hint|
|
|
215
|
+
# Drop health check transactions
|
|
216
|
+
if event.transaction&.match?(%r{/health(z|check)?$})
|
|
217
|
+
next nil
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Scrub sensitive data from DB spans
|
|
221
|
+
event.spans.each do |span|
|
|
222
|
+
if span[:op]&.start_with?("db") && span[:description]&.include?("password")
|
|
223
|
+
span[:description] = "<filtered>"
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
event
|
|
228
|
+
end
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## OpenTelemetry — OTLP Integration
|
|
232
|
+
|
|
233
|
+
> Minimum SDK: `sentry-ruby` v6.4.0+ with `sentry-opentelemetry` v6.4.0+
|
|
234
|
+
|
|
235
|
+
If the project already uses OpenTelemetry for tracing, **use the OTLP integration
|
|
236
|
+
instead of Sentry’s native tracing**. Sentry ingests OTel spans directly via its OTLP
|
|
237
|
+
endpoint — no span conversion, no dual instrumentation.
|
|
238
|
+
|
|
239
|
+
**When to use this path:** OTel tracing gems (`opentelemetry-sdk`,
|
|
240
|
+
`opentelemetry-instrumentation-*`) detected in the Gemfile, or
|
|
241
|
+
`OpenTelemetry::SDK.configure` found in source.
|
|
242
|
+
|
|
243
|
+
**When NOT to use this path:** No OpenTelemetry in the project — use Sentry’s native
|
|
244
|
+
`traces_sample_rate` instead.
|
|
245
|
+
|
|
246
|
+
### Setup
|
|
247
|
+
|
|
248
|
+
```ruby
|
|
249
|
+
# Gemfile — add alongside existing opentelemetry gems:
|
|
250
|
+
gem "sentry-opentelemetry"
|
|
251
|
+
gem "opentelemetry-exporter-otlp" # required for OTLP export
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```ruby
|
|
255
|
+
# config/initializers/sentry.rb
|
|
256
|
+
Sentry.init do |config|
|
|
257
|
+
config.dsn = ENV["SENTRY_DSN"]
|
|
258
|
+
config.send_default_pii = true
|
|
259
|
+
config.otlp.enabled = true
|
|
260
|
+
# config.otlp.collector_url = "http://localhost:4318/v1/traces" # set if sending spans to an OTel Collector
|
|
261
|
+
config.enable_logs = true
|
|
262
|
+
|
|
263
|
+
# Do NOT set traces_sample_rate — tracing is handled by OTel
|
|
264
|
+
# Errors, Logs, Crons, and Metrics are still captured natively by Sentry
|
|
265
|
+
# and automatically linked to the active OTel trace
|
|
266
|
+
end
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
```ruby
|
|
270
|
+
# config/initializers/opentelemetry.rb — keep your existing OTel setup:
|
|
271
|
+
OpenTelemetry::SDK.configure do |c|
|
|
272
|
+
c.use_all # or specific instrumentations
|
|
273
|
+
# Sentry auto-adds its OTLP exporter and propagator —
|
|
274
|
+
# no manual SpanProcessor or Propagator wiring needed
|
|
275
|
+
end
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### How it works
|
|
279
|
+
|
|
280
|
+
- Sentry derives an OTLP endpoint from your DSN and registers a `BatchSpanProcessor`
|
|
281
|
+
with the existing `TracerProvider` — your other exporters (Jaeger, Zipkin, Collector)
|
|
282
|
+
continue working
|
|
283
|
+
- A propagator injects `sentry-trace` + `baggage` headers for distributed tracing with
|
|
284
|
+
other Sentry-instrumented services
|
|
285
|
+
- Errors captured via `Sentry.capture_exception` are automatically linked to the active
|
|
286
|
+
OTel trace/span via shared `trace_id`
|
|
287
|
+
|
|
288
|
+
### OTLP configuration options
|
|
289
|
+
|
|
290
|
+
| Option | Default | Purpose |
|
|
291
|
+
| ---------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
292
|
+
| `config.otlp.enabled` | `false` | Master switch |
|
|
293
|
+
| `config.otlp.collector_url` | `nil` | OTLP HTTP endpoint of an OTel Collector (e.g., `http://localhost:4318/v1/traces`); when set, spans are sent to the collector instead of directly to Sentry |
|
|
294
|
+
| `config.otlp.setup_otlp_traces_exporter` | `true` | Auto-configure exporter; set `false` if you send to your own Collector |
|
|
295
|
+
| `config.otlp.setup_propagator` | `true` | Auto-configure propagator; set `false` if you manage propagation yourself |
|
|
296
|
+
|
|
297
|
+
### Important
|
|
298
|
+
|
|
299
|
+
**Do not combine OTLP with native Sentry tracing.** When `config.otlp.enabled = true`:
|
|
300
|
+
|
|
301
|
+
- Do **not** set `traces_sample_rate` or `traces_sampler`
|
|
302
|
+
- Do **not** set `config.instrumenter = :otel` (that is the legacy SpanProcessor
|
|
303
|
+
approach)
|
|
304
|
+
- Do **not** call `Sentry.with_child_span` or `Sentry.start_transaction` — use OTel’s
|
|
305
|
+
`tracer.in_span` instead
|
|
306
|
+
|
|
307
|
+
## Framework Auto-Instrumentation Summary
|
|
308
|
+
|
|
309
|
+
| Framework / Library | Gem Required | What’s Instrumented |
|
|
310
|
+
| ------------------- | -------------------- | ------------------------------------------------------ |
|
|
311
|
+
| Rails controllers | `sentry-rails` | Requests → transactions; actions → spans |
|
|
312
|
+
| ActiveRecord | `sentry-rails` | SQL queries → spans |
|
|
313
|
+
| ActionMailer | `sentry-rails` | Mail delivery → spans |
|
|
314
|
+
| ActiveJob | `sentry-rails` | Job execution → spans |
|
|
315
|
+
| Sidekiq workers | `sentry-sidekiq` | Worker execution → transactions |
|
|
316
|
+
| Resque workers | `sentry-resque` | Worker execution → transactions |
|
|
317
|
+
| DelayedJob | `sentry-delayed_job` | Job execution → transactions |
|
|
318
|
+
| Net::HTTP | `sentry-ruby` | Outbound HTTP → spans + header propagation |
|
|
319
|
+
| Redis | `sentry-ruby` | Redis commands → spans (needs `:redis_logger`) |
|
|
320
|
+
| GraphQL | `sentry-ruby` | Queries → transactions (enable with `enabled_patches`) |
|
|
321
|
+
|
|
322
|
+
## Request Queue Time
|
|
323
|
+
|
|
324
|
+
> Minimum SDK: `sentry-ruby` v6.4.0+. Enabled by default (`capture_queue_time = true`).
|
|
325
|
+
|
|
326
|
+
Sentry automatically reads the `X-Request-Start` header and records how long the request
|
|
327
|
+
waited in the server queue before a worker thread picked it up.
|
|
328
|
+
The value is stored as `http.server.request.time_in_queue` (milliseconds) on the
|
|
329
|
+
transaction.
|
|
330
|
+
|
|
331
|
+
When running behind Puma, the SDK subtracts `puma.request_body_wait` (time Puma spent
|
|
332
|
+
receiving the request body from a slow client) to isolate actual queue time from upload
|
|
333
|
+
time.
|
|
334
|
+
|
|
335
|
+
### Proxy configuration required
|
|
336
|
+
|
|
337
|
+
Your reverse proxy must set the header.
|
|
338
|
+
Without it, no queue time is recorded.
|
|
339
|
+
|
|
340
|
+
**Nginx:**
|
|
341
|
+
|
|
342
|
+
```nginx
|
|
343
|
+
proxy_set_header X-Request-Start "t=${msec}";
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Heroku:** Sets `X-Request-Start` automatically — no configuration needed.
|
|
347
|
+
|
|
348
|
+
**HAProxy:**
|
|
349
|
+
|
|
350
|
+
```
|
|
351
|
+
http-request set-header X-Request-Start t=%[date()]%[date_us()]
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Disable
|
|
355
|
+
|
|
356
|
+
```ruby
|
|
357
|
+
config.capture_queue_time = false
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Why this matters
|
|
361
|
+
|
|
362
|
+
High queue time means Puma workers are saturated — requests are waiting for a free
|
|
363
|
+
thread. This is a key indicator for scaling decisions.
|
|
364
|
+
Sentry surfaces it in the transaction waterfall so you can distinguish “the app is slow”
|
|
365
|
+
from “the app was waiting for a worker.”
|
|
366
|
+
|
|
367
|
+
## Best Practices
|
|
368
|
+
|
|
369
|
+
- Set `traces_sample_rate = 1.0` in development/staging; use `0.05`–`0.2` in production
|
|
370
|
+
- Use `traces_sampler` to exclude health checks and low-value endpoints
|
|
371
|
+
- Set `op` to a semantic value: `"http.server"`, `"db.query"`, `"queue.process"`,
|
|
372
|
+
`"cache.get"`
|
|
373
|
+
- Prefer `with_child_span` over manual transaction management — it handles errors and
|
|
374
|
+
finishing automatically
|
|
375
|
+
- Always guard span calls with `span&.set_data` — `with_child_span` yields `nil` when
|
|
376
|
+
not sampling
|
|
377
|
+
|
|
378
|
+
## Troubleshooting
|
|
379
|
+
|
|
380
|
+
| Issue | Solution |
|
|
381
|
+
| --------------------------------------- | --------------------------------------------------------------------------------- |
|
|
382
|
+
| No transactions in dashboard | Set `traces_sample_rate > 0`; ensure `sentry-rails` or Rack middleware is present |
|
|
383
|
+
| Sidekiq jobs not traced | Add `sentry-sidekiq` gem; no other config needed |
|
|
384
|
+
| Missing DB spans | Ensure `sentry-rails` is loaded (it patches ActiveRecord) |
|
|
385
|
+
| Distributed trace not stitching | Verify `sentry-trace` + `baggage` headers are forwarded by all services |
|
|
386
|
+
| Frontend trace not linking | Add `<%= Sentry.get_trace_propagation_meta.html_safe %>` to your HTML `<head>` |
|
|
387
|
+
| Health check transactions flooding | Use `traces_sampler` to return `0.0` for health check transaction names |
|
|
388
|
+
| `before_send_transaction` not filtering | Return `nil` (not `false`) to drop the event |
|