[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sentry-sentry-ruby-sdk":3,"mdc-z4t3v6-key":36,"related-org-sentry-sentry-ruby-sdk":3844,"related-repo-sentry-sentry-ruby-sdk":4024},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":31,"sourceUrl":34,"mdContent":35},"sentry-ruby-sdk","integrate Sentry SDK into Ruby applications","Full Sentry SDK setup for Ruby. Use when asked to add Sentry to Ruby, install sentry-ruby, setup Sentry in Rails\u002FSinatra\u002FRack, or configure error monitoring, tracing, logging, metrics, profiling, or crons for Ruby applications. Also handles migration from AppSignal, Honeybadger, Bugsnag, Rollbar, or Airbrake. Supports Rails, Sinatra, Rack, Sidekiq, and Resque.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"sentry","Sentry","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsentry.png","getsentry",[13,17,20,21],{"name":14,"slug":15,"type":16},"Observability","observability","tag",{"name":18,"slug":19,"type":16},"Monitoring","monitoring",{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"Ruby","ruby",237,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsentry-for-ai","2026-07-11T05:52:52.25016","Apache-2.0",30,[30],"tag-production",{"repoUrl":25,"stars":24,"forks":28,"topics":32,"description":33},[30],"Teach your AI coding assistant how to use Sentry - setup, debugging, alerts, and more","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsentry-for-ai\u002Ftree\u002FHEAD\u002Fskills-legacy\u002Fsentry-ruby-sdk","---\nname: sentry-ruby-sdk\ndescription: Full Sentry SDK setup for Ruby. Use when asked to add Sentry to Ruby, install sentry-ruby, setup Sentry in Rails\u002FSinatra\u002FRack, or configure error monitoring, tracing, logging, metrics, profiling, or crons for Ruby applications. Also handles migration from AppSignal, Honeybadger, Bugsnag, Rollbar, or Airbrake. Supports Rails, Sinatra, Rack, Sidekiq, and Resque.\nlicense: Apache-2.0\ncategory: sdk-setup\nparent: sentry-sdk-setup\ndisable-model-invocation: true\n---\n\n> [All Skills](..\u002F..\u002FSKILL_TREE.md) > [SDK Setup](..\u002Fsentry-sdk-setup\u002FSKILL.md) > Ruby SDK\n\n# Sentry Ruby SDK\n\nOpinionated wizard that scans the project and guides through complete Sentry setup.\n\n## Invoke This Skill When\n\n- User asks to \"add Sentry to Ruby\" or \"set up Sentry\" in a Ruby app\n- User wants error monitoring, tracing, logging, metrics, profiling, or crons in Ruby\n- User mentions `sentry-ruby`, `sentry-rails`, or the Ruby Sentry SDK\n- User is migrating from AppSignal, Honeybadger, Bugsnag, Rollbar, or Airbrake to Sentry\n- User wants to monitor exceptions, HTTP requests, or background jobs in Rails\u002FSinatra\n\n> **Note:** SDK APIs below reflect sentry-ruby v6.6.2.\n> Always verify against [docs.sentry.io\u002Fplatforms\u002Fruby\u002F](https:\u002F\u002Fdocs.sentry.io\u002Fplatforms\u002Fruby\u002F) before implementing.\n\n---\n\n## Phase 1: Detect\n\n```bash\n# Existing Sentry gems\ngrep -i sentry Gemfile 2>\u002Fdev\u002Fnull\n\n# Framework\ngrep -iE '\\brails\\b|\\bsinatra\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Web server — Puma triggers queue time guidance\ngrep -iE '\\bpuma\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Background jobs\ngrep -iE '\\bsidekiq\\b|\\bresque\\b|\\bdelayed_job\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Yabeda metrics framework\ngrep -iE '\\byabeda\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Competitor monitoring tools — triggers migration path if found\ngrep -iE '\\bappsignal\\b|\\bhoneybadger\\b|\\bbugsnag\\b|\\brollbar\\b|\\bairbrake\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Scheduled jobs — triggers Crons recommendation\ngrep -iE '\\bsidekiq-cron\\b|\\bclockwork\\b|\\bwhenever\\b|\\brufus-scheduler\\b' Gemfile 2>\u002Fdev\u002Fnull\ngrep -rn \"Sidekiq::Cron\\|Clockwork\\|every.*do\" config\u002F lib\u002F --include=\"*.rb\" 2>\u002Fdev\u002Fnull | head -10\n\n# OpenTelemetry tracing — check for SDK + instrumentations\ngrep -iE '\\bopentelemetry-sdk\\b|\\bopentelemetry-instrumentation\\b' Gemfile 2>\u002Fdev\u002Fnull\ngrep -rn \"OpenTelemetry::SDK\\.configure\\|\\.use_all\\|\\.in_span\" config\u002F lib\u002F app\u002F --include=\"*.rb\" 2>\u002Fdev\u002Fnull | head -5\n\n# Existing metric patterns (StatsD, Datadog, Prometheus)\ngrep -rE \"(statsd|dogstatsd|prometheus|\\.gauge|\\.histogram|\\.increment|\\.timing)\" \\\n  app\u002F lib\u002F --include=\"*.rb\" 2>\u002Fdev\u002Fnull | grep -v \"_spec\\|_test\" | head -20\n\n# Companion frontend\ncat package.json frontend\u002Fpackage.json web\u002Fpackage.json 2>\u002Fdev\u002Fnull | grep -E '\"@sentry|\"sentry-'\n```\n\n**Route from what you find:**\n- **Competitor detected** (`appsignal`, `honeybadger`, `bugsnag`, `rollbar`, `airbrake`) → load `${SKILL_ROOT}\u002Freferences\u002Fmigration.md` first; **delete the competitor initializer** as part of migration\n- **Sentry already present** → skip to Phase 2 to configure features\n- **Rails** → use `sentry-rails` + `config\u002Finitializers\u002Fsentry.rb`\n- **Rack\u002FSinatra** → `sentry-ruby` + `Sentry::Rack::CaptureExceptions` middleware\n- **Sidekiq** → add `sentry-sidekiq`; recommend Metrics if existing metric patterns found\n- **Yabeda detected** → add `sentry-yabeda`; routes Yabeda metrics to Sentry metrics\n- **Puma detected** → queue time capture is automatic (v6.4.0+), but the reverse proxy must set `X-Request-Start` header; see `${SKILL_ROOT}\u002Freferences\u002Ftracing.md` → \"Request Queue Time\"\n- **OTel tracing detected** (`opentelemetry-sdk` + instrumentations in Gemfile, or `OpenTelemetry::SDK.configure` in source) → use OTLP path: `config.otlp.enabled = true`; do **not** set `traces_sample_rate`; Sentry links errors to OTel traces automatically\n\n---\n\n## Phase 2: Recommend\n\nLead with a concrete proposal — don't ask open-ended questions:\n\n| Feature | Recommend when... |\n|---------|------------------|\n| Error Monitoring | **Always** |\n| OTLP Integration | OTel tracing detected — **replaces** native Tracing |\n| Tracing | Rails \u002F Sinatra \u002F Rack \u002F any HTTP framework; **skip if OTel tracing detected** |\n| Logging | **Always** — `enable_logs: true` costs nothing |\n| Metrics | Sidekiq present; existing metric lib (StatsD, Prometheus) detected |\n| Profiling | ⚠️ Beta — performance profiling requested; requires `stackprof` or `vernier` gem; **skip if OTel tracing detected** (requires `traces_sample_rate`, incompatible with OTLP) |\n| Crons | Scheduled jobs detected (ActiveJob, Sidekiq-Cron, Clockwork, Whenever) |\n\n**OTel tracing detected:** *\"I see OpenTelemetry tracing in the project. I recommend Sentry's OTLP integration for tracing (via your existing OTel setup) + Error Monitoring + Sentry Logging [+ Metrics\u002FCrons if applicable]. Shall I proceed?\"*\n\n**No OTel:** *\"I recommend Error Monitoring + Tracing + Logging [+ Metrics if applicable]. Shall I proceed?\"*\n\n---\n\n## Phase 3: Guide\n\n### Install\n\n**Rails:**\n```ruby\n# Gemfile\ngem \"sentry-ruby\"\ngem \"sentry-rails\"\ngem \"sentry-sidekiq\"      # if using Sidekiq\ngem \"sentry-resque\"       # if using Resque\ngem \"sentry-delayed_job\"  # if using DelayedJob\ngem \"sentry-yabeda\"       # if using Yabeda metrics framework\n```\n\n**Rack \u002F Sinatra \u002F plain Ruby:**\n```ruby\ngem \"sentry-ruby\"\n```\n\nRun `bundle install`.\n\n### Framework Integration\n\n| Framework \u002F Runtime | Gem | Init location | Auto-instruments |\n|---------------------|-----|---------------|-----------------|\n| Rails | `sentry-rails` | `config\u002Finitializers\u002Fsentry.rb` | Controllers, ActiveRecord, ActiveJob, ActionMailer |\n| Rack \u002F Sinatra | `sentry-ruby` | Top of `config.ru` | Requests (via `Sentry::Rack::CaptureExceptions` middleware) |\n| Sidekiq | `sentry-sidekiq` | Sentry initializer or Sidekiq config | Worker execution → transactions |\n| Resque | `sentry-resque` | Sentry initializer | Worker execution → transactions |\n| DelayedJob | `sentry-delayed_job` | Sentry initializer | Job execution → transactions |\n| Yabeda metrics | `sentry-yabeda` | Sentry initializer | Yabeda metric events → Sentry metrics |\n\n### Init — Rails (`config\u002Finitializers\u002Fsentry.rb`)\n\n```ruby\nSentry.init do |config|\n  config.dsn = ENV[\"SENTRY_DSN\"]\n  config.spotlight = Rails.env.development?  # local Spotlight UI; no DSN needed in dev\n  config.breadcrumbs_logger = [:active_support_logger, :http_logger]\n  config.send_default_pii = true\n  config.traces_sample_rate = 1.0  # lower to 0.05–0.2 in production\n  config.enable_logs = true\n  # Metrics on by default; disable with: config.enable_metrics = false\nend\n```\n\n`sentry-rails` auto-instruments ActionController, ActiveRecord, ActiveJob, ActionMailer.\n\n### Init — Rack \u002F Sinatra\n\n```ruby\nrequire \"sentry-ruby\"\n\nSentry.init do |config|\n  config.dsn = ENV[\"SENTRY_DSN\"]\n  config.spotlight = ENV[\"RACK_ENV\"] == \"development\"\n  config.breadcrumbs_logger = [:sentry_logger, :http_logger]\n  config.send_default_pii = true\n  config.traces_sample_rate = 1.0\n  config.enable_logs = true\nend\n\nuse Sentry::Rack::CaptureExceptions  # in config.ru, before app middleware\n```\n\n### Init — Sidekiq standalone\n\n```ruby\nrequire \"sentry-ruby\"\nrequire \"sentry-sidekiq\"\n\nSentry.init do |config|\n  config.dsn = ENV[\"SENTRY_DSN\"]\n  config.spotlight = ENV.fetch(\"RAILS_ENV\", \"development\") == \"development\"\n  config.breadcrumbs_logger = [:sentry_logger]\n  config.traces_sample_rate = 1.0\n  config.enable_logs = true\nend\n```\n\n### Environment variables\n\n```bash\nSENTRY_DSN=https:\u002F\u002Fxxx@oYYY.ingest.sentry.io\u002FZZZ\nSENTRY_ENVIRONMENT=production   # overrides RAILS_ENV \u002F RACK_ENV\nSENTRY_RELEASE=my-app@1.0.0\n```\n\n### Feature reference files\n\nWalk through features one at a time. Load the reference file for each, follow its steps, and verify before moving to the next:\n\n| Feature | Reference file | Load when... |\n|---------|---------------|-------------|\n| Migration | `${SKILL_ROOT}\u002Freferences\u002Fmigration.md` | Competitor gem found — load **before** installing Sentry |\n| Error Monitoring | `${SKILL_ROOT}\u002Freferences\u002Ferror-monitoring.md` | Always |\n| Tracing | `${SKILL_ROOT}\u002Freferences\u002Ftracing.md` | HTTP handlers \u002F distributed tracing |\n| Logging | `${SKILL_ROOT}\u002Freferences\u002Flogging.md` | Structured log capture |\n| Metrics | `${SKILL_ROOT}\u002Freferences\u002Fmetrics.md` | Sidekiq present; existing metric patterns |\n| Profiling | `${SKILL_ROOT}\u002Freferences\u002Fprofiling.md` | Performance profiling requested (beta) |\n| Crons | `${SKILL_ROOT}\u002Freferences\u002Fcrons.md` | Scheduled jobs detected or requested |\n\nFor each feature: `Read ${SKILL_ROOT}\u002Freferences\u002F\u003Cfeature>.md`, follow steps exactly, verify it works.\n\n---\n\n## Configuration Reference\n\n### Key `Sentry.init` Options\n\n| Option | Type | Default | Purpose |\n|--------|------|---------|---------|\n| `dsn` | String | `nil` | SDK disabled if empty; env: `SENTRY_DSN` |\n| `environment` | String | `nil` | e.g., `\"production\"`; env: `SENTRY_ENVIRONMENT` |\n| `release` | String | `nil` | e.g., `\"myapp@1.0.0\"`; env: `SENTRY_RELEASE` |\n| `spotlight` | Boolean | `false` | Send events to Spotlight sidecar (local dev, no DSN needed) |\n| `send_default_pii` | Boolean | `false` | Include IP addresses and request headers |\n| `sample_rate` | Float | `1.0` | Error event sample rate (0.0–1.0) |\n| `traces_sample_rate` | Float | `nil` | Transaction sample rate; `nil` disables tracing |\n| `profiles_sample_rate` | Float | `nil` | Profiling rate relative to `traces_sample_rate`; requires `stackprof` or `vernier` |\n| `enable_logs` | Boolean | `false` | Enable Sentry structured Logs |\n| `enable_metrics` | Boolean | `true` | Enable custom metrics (on by default) |\n| `breadcrumbs_logger` | Array | `[]` | Loggers for automatic breadcrumbs (see logging reference) |\n| `max_breadcrumbs` | Integer | `100` | Max breadcrumbs per event |\n| `debug` | Boolean | `false` | Verbose SDK output to stdout |\n| `capture_queue_time` | Boolean | `true` | Record request queue time from `X-Request-Start` header (v6.4.0+, Rails fixed in v6.4.1) |\n| `otlp.enabled` | Boolean | `false` | Route OTel spans to Sentry via OTLP; **do not combine with** `traces_sample_rate` |\n| `otlp.collector_url` | String | `nil` | OTLP HTTP endpoint of an OTel Collector (e.g., `http:\u002F\u002Flocalhost:4318\u002Fv1\u002Ftraces`); when set, spans are sent to the collector instead of directly to Sentry |\n| `org_id` | String | `nil` | Explicit org ID; overrides DSN-extracted value; useful for self-hosted\u002FRelay setups (v6.5.0+) |\n| `strict_trace_continuation` | Boolean | `false` | Only continue incoming traces when `sentry-org_id` baggage matches SDK's org ID; prevents trace stitching from third-party services (v6.5.0+) |\n| `before_send` | Lambda | `nil` | Mutate or drop error events before sending |\n| `before_send_transaction` | Lambda | `nil` | Mutate or drop transaction events before sending |\n| `before_send_log` | Lambda | `nil` | Mutate or drop log events before sending |\n\n### Environment Variables\n\n| Variable | Maps to | Purpose |\n|----------|---------|---------|\n| `SENTRY_DSN` | `dsn` | Data Source Name |\n| `SENTRY_RELEASE` | `release` | App version (e.g., `my-app@1.0.0`) |\n| `SENTRY_ENVIRONMENT` | `environment` | Deployment environment |\n\nOptions set in `Sentry.init` override environment variables.\n\n---\n\n## Verification\n\n**Local dev (no DSN needed) — Spotlight:**\n```bash\nnpx @spotlightjs\u002Fspotlight          # browser UI at http:\u002F\u002Flocalhost:8969\n# or stream events to terminal:\nnpx @spotlightjs\u002Fspotlight tail traces --format json\n```\n`config.spotlight = Rails.env.development?` (already in the init block above) routes events to the local sidecar automatically.\n\n**With a real DSN:**\n```ruby\nSentry.capture_message(\"Sentry Ruby SDK test\")\n```\n\nNothing appears? Set `config.debug = true` and check stdout. Verify DSN format: `https:\u002F\u002F\u003Ckey>@o\u003Corg>.ingest.sentry.io\u002F\u003Cproject>`.\n\n---\n\n## Phase 4: Cross-Link\n\n```bash\ncat package.json frontend\u002Fpackage.json web\u002Fpackage.json 2>\u002Fdev\u002Fnull | grep -E '\"@sentry|\"sentry-'\n```\n\n| Frontend detected | Suggest |\n|-------------------|---------|\n| React \u002F Next.js | `sentry-react-sdk` |\n| Svelte \u002F SvelteKit | `sentry-svelte-sdk` |\n| Vue | `@sentry\u002Fvue` — [docs.sentry.io\u002Fplatforms\u002Fjavascript\u002Fguides\u002Fvue\u002F](https:\u002F\u002Fdocs.sentry.io\u002Fplatforms\u002Fjavascript\u002Fguides\u002Fvue\u002F) |\n\nFor trace stitching between Ruby backend and JS frontend, see `references\u002Ftracing.md` → \"Frontend trace stitching\".\n\n---\n\n## Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| Events not appearing | `config.debug = true`; verify DSN; ensure `Sentry.init` before first request |\n| Rails exceptions missing | Must use `sentry-rails` — `sentry-ruby` alone doesn't hook Rails error handlers |\n| No traces (native) | Set `traces_sample_rate > 0`; ensure `sentry-rails` or `Sentry::Rack::CaptureExceptions` |\n| No traces (OTLP) | Verify `opentelemetry-exporter-otlp` gem is installed; do **not** set `traces_sample_rate` when using `otlp.enabled = true` |\n| Sidekiq jobs not traced | Add `sentry-sidekiq` gem |\n| Missing request context | Set `config.send_default_pii = true` |\n| Logs not appearing | Set `config.enable_logs = true`; sentry-ruby ≥ 5.27.0 required |\n| Metrics not appearing | Check `enable_metrics` is not `false`; verify DSN |\n| Events lost on shutdown | `Process.exit!` skips `at_exit` hooks — call `Sentry.flush` explicitly before forced exits |\n| Forking server loses events | Puma\u002FUnicorn fork workers — re-initialize in `on_worker_boot` or `after_fork`; without this, the background worker thread dies in child processes |\n| DSN rejected \u002F events not delivered | Verify DSN format: `https:\u002F\u002F\u003Ckey>@o\u003Corg>.ingest.sentry.io\u002F\u003Cproject>`; set `config.debug = true` to see transport errors |\n",{"data":37,"body":41},{"name":4,"description":6,"license":27,"category":38,"parent":39,"disable-model-invocation":40},"sdk-setup","sentry-sdk-setup",true,{"type":42,"children":43},"root",[44,71,77,82,89,136,160,164,170,968,976,1206,1209,1215,1220,1395,1418,1438,1441,1447,1454,1462,1526,1534,1547,1560,1566,1767,1780,1859,1869,1875,1971,1977,2057,2063,2127,2133,2138,2316,2329,2332,2338,2352,3092,3098,3203,3215,3218,3224,3232,3296,3307,3315,3329,3349,3352,3358,3416,3497,3510,3513,3519,3838],{"type":45,"tag":46,"props":47,"children":48},"element","blockquote",{},[49],{"type":45,"tag":50,"props":51,"children":52},"p",{},[53,61,63,69],{"type":45,"tag":54,"props":55,"children":57},"a",{"href":56},"..\u002F..\u002FSKILL_TREE.md",[58],{"type":59,"value":60},"text","All Skills",{"type":59,"value":62}," > ",{"type":45,"tag":54,"props":64,"children":66},{"href":65},"..\u002Fsentry-sdk-setup\u002FSKILL.md",[67],{"type":59,"value":68},"SDK Setup",{"type":59,"value":70}," > Ruby SDK",{"type":45,"tag":72,"props":73,"children":74},"h1",{"id":4},[75],{"type":59,"value":76},"Sentry Ruby SDK",{"type":45,"tag":50,"props":78,"children":79},{},[80],{"type":59,"value":81},"Opinionated wizard that scans the project and guides through complete Sentry setup.",{"type":45,"tag":83,"props":84,"children":86},"h2",{"id":85},"invoke-this-skill-when",[87],{"type":59,"value":88},"Invoke This Skill When",{"type":45,"tag":90,"props":91,"children":92},"ul",{},[93,99,104,126,131],{"type":45,"tag":94,"props":95,"children":96},"li",{},[97],{"type":59,"value":98},"User asks to \"add Sentry to Ruby\" or \"set up Sentry\" in a Ruby app",{"type":45,"tag":94,"props":100,"children":101},{},[102],{"type":59,"value":103},"User wants error monitoring, tracing, logging, metrics, profiling, or crons in Ruby",{"type":45,"tag":94,"props":105,"children":106},{},[107,109,116,118,124],{"type":59,"value":108},"User mentions ",{"type":45,"tag":110,"props":111,"children":113},"code",{"className":112},[],[114],{"type":59,"value":115},"sentry-ruby",{"type":59,"value":117},", ",{"type":45,"tag":110,"props":119,"children":121},{"className":120},[],[122],{"type":59,"value":123},"sentry-rails",{"type":59,"value":125},", or the Ruby Sentry SDK",{"type":45,"tag":94,"props":127,"children":128},{},[129],{"type":59,"value":130},"User is migrating from AppSignal, Honeybadger, Bugsnag, Rollbar, or Airbrake to Sentry",{"type":45,"tag":94,"props":132,"children":133},{},[134],{"type":59,"value":135},"User wants to monitor exceptions, HTTP requests, or background jobs in Rails\u002FSinatra",{"type":45,"tag":46,"props":137,"children":138},{},[139],{"type":45,"tag":50,"props":140,"children":141},{},[142,148,150,158],{"type":45,"tag":143,"props":144,"children":145},"strong",{},[146],{"type":59,"value":147},"Note:",{"type":59,"value":149}," SDK APIs below reflect sentry-ruby v6.6.2.\nAlways verify against ",{"type":45,"tag":54,"props":151,"children":155},{"href":152,"rel":153},"https:\u002F\u002Fdocs.sentry.io\u002Fplatforms\u002Fruby\u002F",[154],"nofollow",[156],{"type":59,"value":157},"docs.sentry.io\u002Fplatforms\u002Fruby\u002F",{"type":59,"value":159}," before implementing.",{"type":45,"tag":161,"props":162,"children":163},"hr",{},[],{"type":45,"tag":83,"props":165,"children":167},{"id":166},"phase-1-detect",[168],{"type":59,"value":169},"Phase 1: Detect",{"type":45,"tag":171,"props":172,"children":177},"pre",{"className":173,"code":174,"language":175,"meta":176,"style":176},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Existing Sentry gems\ngrep -i sentry Gemfile 2>\u002Fdev\u002Fnull\n\n# Framework\ngrep -iE '\\brails\\b|\\bsinatra\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Web server — Puma triggers queue time guidance\ngrep -iE '\\bpuma\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Background jobs\ngrep -iE '\\bsidekiq\\b|\\bresque\\b|\\bdelayed_job\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Yabeda metrics framework\ngrep -iE '\\byabeda\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Competitor monitoring tools — triggers migration path if found\ngrep -iE '\\bappsignal\\b|\\bhoneybadger\\b|\\bbugsnag\\b|\\brollbar\\b|\\bairbrake\\b' Gemfile 2>\u002Fdev\u002Fnull\n\n# Scheduled jobs — triggers Crons recommendation\ngrep -iE '\\bsidekiq-cron\\b|\\bclockwork\\b|\\bwhenever\\b|\\brufus-scheduler\\b' Gemfile 2>\u002Fdev\u002Fnull\ngrep -rn \"Sidekiq::Cron\\|Clockwork\\|every.*do\" config\u002F lib\u002F --include=\"*.rb\" 2>\u002Fdev\u002Fnull | head -10\n\n# OpenTelemetry tracing — check for SDK + instrumentations\ngrep -iE '\\bopentelemetry-sdk\\b|\\bopentelemetry-instrumentation\\b' Gemfile 2>\u002Fdev\u002Fnull\ngrep -rn \"OpenTelemetry::SDK\\.configure\\|\\.use_all\\|\\.in_span\" config\u002F lib\u002F app\u002F --include=\"*.rb\" 2>\u002Fdev\u002Fnull | head -5\n\n# Existing metric patterns (StatsD, Datadog, Prometheus)\ngrep -rE \"(statsd|dogstatsd|prometheus|\\.gauge|\\.histogram|\\.increment|\\.timing)\" \\\n  app\u002F lib\u002F --include=\"*.rb\" 2>\u002Fdev\u002Fnull | grep -v \"_spec\\|_test\" | head -20\n\n# Companion frontend\ncat package.json frontend\u002Fpackage.json web\u002Fpackage.json 2>\u002Fdev\u002Fnull | grep -E '\"@sentry|\"sentry-'\n","bash","",[178],{"type":45,"tag":110,"props":179,"children":180},{"__ignoreMap":176},[181,193,230,239,248,288,296,305,342,350,359,396,404,413,450,458,467,504,512,521,558,638,646,655,692,767,775,784,816,893,900,909],{"type":45,"tag":182,"props":183,"children":186},"span",{"class":184,"line":185},"line",1,[187],{"type":45,"tag":182,"props":188,"children":190},{"style":189},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[191],{"type":59,"value":192},"# Existing Sentry gems\n",{"type":45,"tag":182,"props":194,"children":196},{"class":184,"line":195},2,[197,203,209,214,219,225],{"type":45,"tag":182,"props":198,"children":200},{"style":199},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[201],{"type":59,"value":202},"grep",{"type":45,"tag":182,"props":204,"children":206},{"style":205},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[207],{"type":59,"value":208}," -i",{"type":45,"tag":182,"props":210,"children":211},{"style":205},[212],{"type":59,"value":213}," sentry",{"type":45,"tag":182,"props":215,"children":216},{"style":205},[217],{"type":59,"value":218}," Gemfile",{"type":45,"tag":182,"props":220,"children":222},{"style":221},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[223],{"type":59,"value":224}," 2>",{"type":45,"tag":182,"props":226,"children":227},{"style":205},[228],{"type":59,"value":229},"\u002Fdev\u002Fnull\n",{"type":45,"tag":182,"props":231,"children":233},{"class":184,"line":232},3,[234],{"type":45,"tag":182,"props":235,"children":236},{"emptyLinePlaceholder":40},[237],{"type":59,"value":238},"\n",{"type":45,"tag":182,"props":240,"children":242},{"class":184,"line":241},4,[243],{"type":45,"tag":182,"props":244,"children":245},{"style":189},[246],{"type":59,"value":247},"# Framework\n",{"type":45,"tag":182,"props":249,"children":251},{"class":184,"line":250},5,[252,256,261,266,271,276,280,284],{"type":45,"tag":182,"props":253,"children":254},{"style":199},[255],{"type":59,"value":202},{"type":45,"tag":182,"props":257,"children":258},{"style":205},[259],{"type":59,"value":260}," -iE",{"type":45,"tag":182,"props":262,"children":263},{"style":221},[264],{"type":59,"value":265}," '",{"type":45,"tag":182,"props":267,"children":268},{"style":205},[269],{"type":59,"value":270},"\\brails\\b|\\bsinatra\\b",{"type":45,"tag":182,"props":272,"children":273},{"style":221},[274],{"type":59,"value":275},"'",{"type":45,"tag":182,"props":277,"children":278},{"style":205},[279],{"type":59,"value":218},{"type":45,"tag":182,"props":281,"children":282},{"style":221},[283],{"type":59,"value":224},{"type":45,"tag":182,"props":285,"children":286},{"style":205},[287],{"type":59,"value":229},{"type":45,"tag":182,"props":289,"children":291},{"class":184,"line":290},6,[292],{"type":45,"tag":182,"props":293,"children":294},{"emptyLinePlaceholder":40},[295],{"type":59,"value":238},{"type":45,"tag":182,"props":297,"children":299},{"class":184,"line":298},7,[300],{"type":45,"tag":182,"props":301,"children":302},{"style":189},[303],{"type":59,"value":304},"# Web server — Puma triggers queue time guidance\n",{"type":45,"tag":182,"props":306,"children":308},{"class":184,"line":307},8,[309,313,317,321,326,330,334,338],{"type":45,"tag":182,"props":310,"children":311},{"style":199},[312],{"type":59,"value":202},{"type":45,"tag":182,"props":314,"children":315},{"style":205},[316],{"type":59,"value":260},{"type":45,"tag":182,"props":318,"children":319},{"style":221},[320],{"type":59,"value":265},{"type":45,"tag":182,"props":322,"children":323},{"style":205},[324],{"type":59,"value":325},"\\bpuma\\b",{"type":45,"tag":182,"props":327,"children":328},{"style":221},[329],{"type":59,"value":275},{"type":45,"tag":182,"props":331,"children":332},{"style":205},[333],{"type":59,"value":218},{"type":45,"tag":182,"props":335,"children":336},{"style":221},[337],{"type":59,"value":224},{"type":45,"tag":182,"props":339,"children":340},{"style":205},[341],{"type":59,"value":229},{"type":45,"tag":182,"props":343,"children":345},{"class":184,"line":344},9,[346],{"type":45,"tag":182,"props":347,"children":348},{"emptyLinePlaceholder":40},[349],{"type":59,"value":238},{"type":45,"tag":182,"props":351,"children":353},{"class":184,"line":352},10,[354],{"type":45,"tag":182,"props":355,"children":356},{"style":189},[357],{"type":59,"value":358},"# Background jobs\n",{"type":45,"tag":182,"props":360,"children":362},{"class":184,"line":361},11,[363,367,371,375,380,384,388,392],{"type":45,"tag":182,"props":364,"children":365},{"style":199},[366],{"type":59,"value":202},{"type":45,"tag":182,"props":368,"children":369},{"style":205},[370],{"type":59,"value":260},{"type":45,"tag":182,"props":372,"children":373},{"style":221},[374],{"type":59,"value":265},{"type":45,"tag":182,"props":376,"children":377},{"style":205},[378],{"type":59,"value":379},"\\bsidekiq\\b|\\bresque\\b|\\bdelayed_job\\b",{"type":45,"tag":182,"props":381,"children":382},{"style":221},[383],{"type":59,"value":275},{"type":45,"tag":182,"props":385,"children":386},{"style":205},[387],{"type":59,"value":218},{"type":45,"tag":182,"props":389,"children":390},{"style":221},[391],{"type":59,"value":224},{"type":45,"tag":182,"props":393,"children":394},{"style":205},[395],{"type":59,"value":229},{"type":45,"tag":182,"props":397,"children":399},{"class":184,"line":398},12,[400],{"type":45,"tag":182,"props":401,"children":402},{"emptyLinePlaceholder":40},[403],{"type":59,"value":238},{"type":45,"tag":182,"props":405,"children":407},{"class":184,"line":406},13,[408],{"type":45,"tag":182,"props":409,"children":410},{"style":189},[411],{"type":59,"value":412},"# Yabeda metrics framework\n",{"type":45,"tag":182,"props":414,"children":416},{"class":184,"line":415},14,[417,421,425,429,434,438,442,446],{"type":45,"tag":182,"props":418,"children":419},{"style":199},[420],{"type":59,"value":202},{"type":45,"tag":182,"props":422,"children":423},{"style":205},[424],{"type":59,"value":260},{"type":45,"tag":182,"props":426,"children":427},{"style":221},[428],{"type":59,"value":265},{"type":45,"tag":182,"props":430,"children":431},{"style":205},[432],{"type":59,"value":433},"\\byabeda\\b",{"type":45,"tag":182,"props":435,"children":436},{"style":221},[437],{"type":59,"value":275},{"type":45,"tag":182,"props":439,"children":440},{"style":205},[441],{"type":59,"value":218},{"type":45,"tag":182,"props":443,"children":444},{"style":221},[445],{"type":59,"value":224},{"type":45,"tag":182,"props":447,"children":448},{"style":205},[449],{"type":59,"value":229},{"type":45,"tag":182,"props":451,"children":453},{"class":184,"line":452},15,[454],{"type":45,"tag":182,"props":455,"children":456},{"emptyLinePlaceholder":40},[457],{"type":59,"value":238},{"type":45,"tag":182,"props":459,"children":461},{"class":184,"line":460},16,[462],{"type":45,"tag":182,"props":463,"children":464},{"style":189},[465],{"type":59,"value":466},"# Competitor monitoring tools — triggers migration path if found\n",{"type":45,"tag":182,"props":468,"children":470},{"class":184,"line":469},17,[471,475,479,483,488,492,496,500],{"type":45,"tag":182,"props":472,"children":473},{"style":199},[474],{"type":59,"value":202},{"type":45,"tag":182,"props":476,"children":477},{"style":205},[478],{"type":59,"value":260},{"type":45,"tag":182,"props":480,"children":481},{"style":221},[482],{"type":59,"value":265},{"type":45,"tag":182,"props":484,"children":485},{"style":205},[486],{"type":59,"value":487},"\\bappsignal\\b|\\bhoneybadger\\b|\\bbugsnag\\b|\\brollbar\\b|\\bairbrake\\b",{"type":45,"tag":182,"props":489,"children":490},{"style":221},[491],{"type":59,"value":275},{"type":45,"tag":182,"props":493,"children":494},{"style":205},[495],{"type":59,"value":218},{"type":45,"tag":182,"props":497,"children":498},{"style":221},[499],{"type":59,"value":224},{"type":45,"tag":182,"props":501,"children":502},{"style":205},[503],{"type":59,"value":229},{"type":45,"tag":182,"props":505,"children":507},{"class":184,"line":506},18,[508],{"type":45,"tag":182,"props":509,"children":510},{"emptyLinePlaceholder":40},[511],{"type":59,"value":238},{"type":45,"tag":182,"props":513,"children":515},{"class":184,"line":514},19,[516],{"type":45,"tag":182,"props":517,"children":518},{"style":189},[519],{"type":59,"value":520},"# Scheduled jobs — triggers Crons recommendation\n",{"type":45,"tag":182,"props":522,"children":524},{"class":184,"line":523},20,[525,529,533,537,542,546,550,554],{"type":45,"tag":182,"props":526,"children":527},{"style":199},[528],{"type":59,"value":202},{"type":45,"tag":182,"props":530,"children":531},{"style":205},[532],{"type":59,"value":260},{"type":45,"tag":182,"props":534,"children":535},{"style":221},[536],{"type":59,"value":265},{"type":45,"tag":182,"props":538,"children":539},{"style":205},[540],{"type":59,"value":541},"\\bsidekiq-cron\\b|\\bclockwork\\b|\\bwhenever\\b|\\brufus-scheduler\\b",{"type":45,"tag":182,"props":543,"children":544},{"style":221},[545],{"type":59,"value":275},{"type":45,"tag":182,"props":547,"children":548},{"style":205},[549],{"type":59,"value":218},{"type":45,"tag":182,"props":551,"children":552},{"style":221},[553],{"type":59,"value":224},{"type":45,"tag":182,"props":555,"children":556},{"style":205},[557],{"type":59,"value":229},{"type":45,"tag":182,"props":559,"children":561},{"class":184,"line":560},21,[562,566,571,576,581,586,591,596,601,605,610,614,618,623,628,633],{"type":45,"tag":182,"props":563,"children":564},{"style":199},[565],{"type":59,"value":202},{"type":45,"tag":182,"props":567,"children":568},{"style":205},[569],{"type":59,"value":570}," -rn",{"type":45,"tag":182,"props":572,"children":573},{"style":221},[574],{"type":59,"value":575}," \"",{"type":45,"tag":182,"props":577,"children":578},{"style":205},[579],{"type":59,"value":580},"Sidekiq::Cron\\|Clockwork\\|every.*do",{"type":45,"tag":182,"props":582,"children":583},{"style":221},[584],{"type":59,"value":585},"\"",{"type":45,"tag":182,"props":587,"children":588},{"style":205},[589],{"type":59,"value":590}," config\u002F",{"type":45,"tag":182,"props":592,"children":593},{"style":205},[594],{"type":59,"value":595}," lib\u002F",{"type":45,"tag":182,"props":597,"children":598},{"style":205},[599],{"type":59,"value":600}," --include=",{"type":45,"tag":182,"props":602,"children":603},{"style":221},[604],{"type":59,"value":585},{"type":45,"tag":182,"props":606,"children":607},{"style":205},[608],{"type":59,"value":609},"*.rb",{"type":45,"tag":182,"props":611,"children":612},{"style":221},[613],{"type":59,"value":585},{"type":45,"tag":182,"props":615,"children":616},{"style":221},[617],{"type":59,"value":224},{"type":45,"tag":182,"props":619,"children":620},{"style":205},[621],{"type":59,"value":622},"\u002Fdev\u002Fnull",{"type":45,"tag":182,"props":624,"children":625},{"style":221},[626],{"type":59,"value":627}," |",{"type":45,"tag":182,"props":629,"children":630},{"style":199},[631],{"type":59,"value":632}," head",{"type":45,"tag":182,"props":634,"children":635},{"style":205},[636],{"type":59,"value":637}," -10\n",{"type":45,"tag":182,"props":639,"children":641},{"class":184,"line":640},22,[642],{"type":45,"tag":182,"props":643,"children":644},{"emptyLinePlaceholder":40},[645],{"type":59,"value":238},{"type":45,"tag":182,"props":647,"children":649},{"class":184,"line":648},23,[650],{"type":45,"tag":182,"props":651,"children":652},{"style":189},[653],{"type":59,"value":654},"# OpenTelemetry tracing — check for SDK + instrumentations\n",{"type":45,"tag":182,"props":656,"children":658},{"class":184,"line":657},24,[659,663,667,671,676,680,684,688],{"type":45,"tag":182,"props":660,"children":661},{"style":199},[662],{"type":59,"value":202},{"type":45,"tag":182,"props":664,"children":665},{"style":205},[666],{"type":59,"value":260},{"type":45,"tag":182,"props":668,"children":669},{"style":221},[670],{"type":59,"value":265},{"type":45,"tag":182,"props":672,"children":673},{"style":205},[674],{"type":59,"value":675},"\\bopentelemetry-sdk\\b|\\bopentelemetry-instrumentation\\b",{"type":45,"tag":182,"props":677,"children":678},{"style":221},[679],{"type":59,"value":275},{"type":45,"tag":182,"props":681,"children":682},{"style":205},[683],{"type":59,"value":218},{"type":45,"tag":182,"props":685,"children":686},{"style":221},[687],{"type":59,"value":224},{"type":45,"tag":182,"props":689,"children":690},{"style":205},[691],{"type":59,"value":229},{"type":45,"tag":182,"props":693,"children":695},{"class":184,"line":694},25,[696,700,704,708,713,717,721,725,730,734,738,742,746,750,754,758,762],{"type":45,"tag":182,"props":697,"children":698},{"style":199},[699],{"type":59,"value":202},{"type":45,"tag":182,"props":701,"children":702},{"style":205},[703],{"type":59,"value":570},{"type":45,"tag":182,"props":705,"children":706},{"style":221},[707],{"type":59,"value":575},{"type":45,"tag":182,"props":709,"children":710},{"style":205},[711],{"type":59,"value":712},"OpenTelemetry::SDK\\.configure\\|\\.use_all\\|\\.in_span",{"type":45,"tag":182,"props":714,"children":715},{"style":221},[716],{"type":59,"value":585},{"type":45,"tag":182,"props":718,"children":719},{"style":205},[720],{"type":59,"value":590},{"type":45,"tag":182,"props":722,"children":723},{"style":205},[724],{"type":59,"value":595},{"type":45,"tag":182,"props":726,"children":727},{"style":205},[728],{"type":59,"value":729}," app\u002F",{"type":45,"tag":182,"props":731,"children":732},{"style":205},[733],{"type":59,"value":600},{"type":45,"tag":182,"props":735,"children":736},{"style":221},[737],{"type":59,"value":585},{"type":45,"tag":182,"props":739,"children":740},{"style":205},[741],{"type":59,"value":609},{"type":45,"tag":182,"props":743,"children":744},{"style":221},[745],{"type":59,"value":585},{"type":45,"tag":182,"props":747,"children":748},{"style":221},[749],{"type":59,"value":224},{"type":45,"tag":182,"props":751,"children":752},{"style":205},[753],{"type":59,"value":622},{"type":45,"tag":182,"props":755,"children":756},{"style":221},[757],{"type":59,"value":627},{"type":45,"tag":182,"props":759,"children":760},{"style":199},[761],{"type":59,"value":632},{"type":45,"tag":182,"props":763,"children":764},{"style":205},[765],{"type":59,"value":766}," -5\n",{"type":45,"tag":182,"props":768,"children":770},{"class":184,"line":769},26,[771],{"type":45,"tag":182,"props":772,"children":773},{"emptyLinePlaceholder":40},[774],{"type":59,"value":238},{"type":45,"tag":182,"props":776,"children":778},{"class":184,"line":777},27,[779],{"type":45,"tag":182,"props":780,"children":781},{"style":189},[782],{"type":59,"value":783},"# Existing metric patterns (StatsD, Datadog, Prometheus)\n",{"type":45,"tag":182,"props":785,"children":787},{"class":184,"line":786},28,[788,792,797,801,806,810],{"type":45,"tag":182,"props":789,"children":790},{"style":199},[791],{"type":59,"value":202},{"type":45,"tag":182,"props":793,"children":794},{"style":205},[795],{"type":59,"value":796}," -rE",{"type":45,"tag":182,"props":798,"children":799},{"style":221},[800],{"type":59,"value":575},{"type":45,"tag":182,"props":802,"children":803},{"style":205},[804],{"type":59,"value":805},"(statsd|dogstatsd|prometheus|\\.gauge|\\.histogram|\\.increment|\\.timing)",{"type":45,"tag":182,"props":807,"children":808},{"style":221},[809],{"type":59,"value":585},{"type":45,"tag":182,"props":811,"children":813},{"style":812},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[814],{"type":59,"value":815}," \\\n",{"type":45,"tag":182,"props":817,"children":819},{"class":184,"line":818},29,[820,825,829,833,837,841,845,849,853,857,862,867,871,876,880,884,888],{"type":45,"tag":182,"props":821,"children":822},{"style":205},[823],{"type":59,"value":824},"  app\u002F",{"type":45,"tag":182,"props":826,"children":827},{"style":205},[828],{"type":59,"value":595},{"type":45,"tag":182,"props":830,"children":831},{"style":205},[832],{"type":59,"value":600},{"type":45,"tag":182,"props":834,"children":835},{"style":221},[836],{"type":59,"value":585},{"type":45,"tag":182,"props":838,"children":839},{"style":205},[840],{"type":59,"value":609},{"type":45,"tag":182,"props":842,"children":843},{"style":221},[844],{"type":59,"value":585},{"type":45,"tag":182,"props":846,"children":847},{"style":221},[848],{"type":59,"value":224},{"type":45,"tag":182,"props":850,"children":851},{"style":205},[852],{"type":59,"value":622},{"type":45,"tag":182,"props":854,"children":855},{"style":221},[856],{"type":59,"value":627},{"type":45,"tag":182,"props":858,"children":859},{"style":199},[860],{"type":59,"value":861}," grep",{"type":45,"tag":182,"props":863,"children":864},{"style":205},[865],{"type":59,"value":866}," -v",{"type":45,"tag":182,"props":868,"children":869},{"style":221},[870],{"type":59,"value":575},{"type":45,"tag":182,"props":872,"children":873},{"style":205},[874],{"type":59,"value":875},"_spec\\|_test",{"type":45,"tag":182,"props":877,"children":878},{"style":221},[879],{"type":59,"value":585},{"type":45,"tag":182,"props":881,"children":882},{"style":221},[883],{"type":59,"value":627},{"type":45,"tag":182,"props":885,"children":886},{"style":199},[887],{"type":59,"value":632},{"type":45,"tag":182,"props":889,"children":890},{"style":205},[891],{"type":59,"value":892}," -20\n",{"type":45,"tag":182,"props":894,"children":895},{"class":184,"line":28},[896],{"type":45,"tag":182,"props":897,"children":898},{"emptyLinePlaceholder":40},[899],{"type":59,"value":238},{"type":45,"tag":182,"props":901,"children":903},{"class":184,"line":902},31,[904],{"type":45,"tag":182,"props":905,"children":906},{"style":189},[907],{"type":59,"value":908},"# Companion frontend\n",{"type":45,"tag":182,"props":910,"children":912},{"class":184,"line":911},32,[913,918,923,928,933,937,941,945,949,954,958,963],{"type":45,"tag":182,"props":914,"children":915},{"style":199},[916],{"type":59,"value":917},"cat",{"type":45,"tag":182,"props":919,"children":920},{"style":205},[921],{"type":59,"value":922}," package.json",{"type":45,"tag":182,"props":924,"children":925},{"style":205},[926],{"type":59,"value":927}," frontend\u002Fpackage.json",{"type":45,"tag":182,"props":929,"children":930},{"style":205},[931],{"type":59,"value":932}," web\u002Fpackage.json",{"type":45,"tag":182,"props":934,"children":935},{"style":221},[936],{"type":59,"value":224},{"type":45,"tag":182,"props":938,"children":939},{"style":205},[940],{"type":59,"value":622},{"type":45,"tag":182,"props":942,"children":943},{"style":221},[944],{"type":59,"value":627},{"type":45,"tag":182,"props":946,"children":947},{"style":199},[948],{"type":59,"value":861},{"type":45,"tag":182,"props":950,"children":951},{"style":205},[952],{"type":59,"value":953}," -E",{"type":45,"tag":182,"props":955,"children":956},{"style":221},[957],{"type":59,"value":265},{"type":45,"tag":182,"props":959,"children":960},{"style":205},[961],{"type":59,"value":962},"\"@sentry|\"sentry-",{"type":45,"tag":182,"props":964,"children":965},{"style":221},[966],{"type":59,"value":967},"'\n",{"type":45,"tag":50,"props":969,"children":970},{},[971],{"type":45,"tag":143,"props":972,"children":973},{},[974],{"type":59,"value":975},"Route from what you find:",{"type":45,"tag":90,"props":977,"children":978},{},[979,1040,1050,1073,1097,1115,1132,1158],{"type":45,"tag":94,"props":980,"children":981},{},[982,987,989,995,996,1002,1003,1009,1010,1016,1017,1023,1025,1031,1033,1038],{"type":45,"tag":143,"props":983,"children":984},{},[985],{"type":59,"value":986},"Competitor detected",{"type":59,"value":988}," (",{"type":45,"tag":110,"props":990,"children":992},{"className":991},[],[993],{"type":59,"value":994},"appsignal",{"type":59,"value":117},{"type":45,"tag":110,"props":997,"children":999},{"className":998},[],[1000],{"type":59,"value":1001},"honeybadger",{"type":59,"value":117},{"type":45,"tag":110,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":59,"value":1008},"bugsnag",{"type":59,"value":117},{"type":45,"tag":110,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":59,"value":1015},"rollbar",{"type":59,"value":117},{"type":45,"tag":110,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":59,"value":1022},"airbrake",{"type":59,"value":1024},") → load ",{"type":45,"tag":110,"props":1026,"children":1028},{"className":1027},[],[1029],{"type":59,"value":1030},"${SKILL_ROOT}\u002Freferences\u002Fmigration.md",{"type":59,"value":1032}," first; ",{"type":45,"tag":143,"props":1034,"children":1035},{},[1036],{"type":59,"value":1037},"delete the competitor initializer",{"type":59,"value":1039}," as part of migration",{"type":45,"tag":94,"props":1041,"children":1042},{},[1043,1048],{"type":45,"tag":143,"props":1044,"children":1045},{},[1046],{"type":59,"value":1047},"Sentry already present",{"type":59,"value":1049}," → skip to Phase 2 to configure features",{"type":45,"tag":94,"props":1051,"children":1052},{},[1053,1058,1060,1065,1067],{"type":45,"tag":143,"props":1054,"children":1055},{},[1056],{"type":59,"value":1057},"Rails",{"type":59,"value":1059}," → use ",{"type":45,"tag":110,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":59,"value":123},{"type":59,"value":1066}," + ",{"type":45,"tag":110,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":59,"value":1072},"config\u002Finitializers\u002Fsentry.rb",{"type":45,"tag":94,"props":1074,"children":1075},{},[1076,1081,1083,1088,1089,1095],{"type":45,"tag":143,"props":1077,"children":1078},{},[1079],{"type":59,"value":1080},"Rack\u002FSinatra",{"type":59,"value":1082}," → ",{"type":45,"tag":110,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":59,"value":115},{"type":59,"value":1066},{"type":45,"tag":110,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":59,"value":1094},"Sentry::Rack::CaptureExceptions",{"type":59,"value":1096}," middleware",{"type":45,"tag":94,"props":1098,"children":1099},{},[1100,1105,1107,1113],{"type":45,"tag":143,"props":1101,"children":1102},{},[1103],{"type":59,"value":1104},"Sidekiq",{"type":59,"value":1106}," → add ",{"type":45,"tag":110,"props":1108,"children":1110},{"className":1109},[],[1111],{"type":59,"value":1112},"sentry-sidekiq",{"type":59,"value":1114},"; recommend Metrics if existing metric patterns found",{"type":45,"tag":94,"props":1116,"children":1117},{},[1118,1123,1124,1130],{"type":45,"tag":143,"props":1119,"children":1120},{},[1121],{"type":59,"value":1122},"Yabeda detected",{"type":59,"value":1106},{"type":45,"tag":110,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":59,"value":1129},"sentry-yabeda",{"type":59,"value":1131},"; routes Yabeda metrics to Sentry metrics",{"type":45,"tag":94,"props":1133,"children":1134},{},[1135,1140,1142,1148,1150,1156],{"type":45,"tag":143,"props":1136,"children":1137},{},[1138],{"type":59,"value":1139},"Puma detected",{"type":59,"value":1141}," → queue time capture is automatic (v6.4.0+), but the reverse proxy must set ",{"type":45,"tag":110,"props":1143,"children":1145},{"className":1144},[],[1146],{"type":59,"value":1147},"X-Request-Start",{"type":59,"value":1149}," header; see ",{"type":45,"tag":110,"props":1151,"children":1153},{"className":1152},[],[1154],{"type":59,"value":1155},"${SKILL_ROOT}\u002Freferences\u002Ftracing.md",{"type":59,"value":1157}," → \"Request Queue Time\"",{"type":45,"tag":94,"props":1159,"children":1160},{},[1161,1166,1167,1173,1175,1181,1183,1189,1191,1196,1198,1204],{"type":45,"tag":143,"props":1162,"children":1163},{},[1164],{"type":59,"value":1165},"OTel tracing detected",{"type":59,"value":988},{"type":45,"tag":110,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":59,"value":1172},"opentelemetry-sdk",{"type":59,"value":1174}," + instrumentations in Gemfile, or ",{"type":45,"tag":110,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":59,"value":1180},"OpenTelemetry::SDK.configure",{"type":59,"value":1182}," in source) → use OTLP path: ",{"type":45,"tag":110,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":59,"value":1188},"config.otlp.enabled = true",{"type":59,"value":1190},"; do ",{"type":45,"tag":143,"props":1192,"children":1193},{},[1194],{"type":59,"value":1195},"not",{"type":59,"value":1197}," set ",{"type":45,"tag":110,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":59,"value":1203},"traces_sample_rate",{"type":59,"value":1205},"; Sentry links errors to OTel traces automatically",{"type":45,"tag":161,"props":1207,"children":1208},{},[],{"type":45,"tag":83,"props":1210,"children":1212},{"id":1211},"phase-2-recommend",[1213],{"type":59,"value":1214},"Phase 2: Recommend",{"type":45,"tag":50,"props":1216,"children":1217},{},[1218],{"type":59,"value":1219},"Lead with a concrete proposal — don't ask open-ended questions:",{"type":45,"tag":1221,"props":1222,"children":1223},"table",{},[1224,1243],{"type":45,"tag":1225,"props":1226,"children":1227},"thead",{},[1228],{"type":45,"tag":1229,"props":1230,"children":1231},"tr",{},[1232,1238],{"type":45,"tag":1233,"props":1234,"children":1235},"th",{},[1236],{"type":59,"value":1237},"Feature",{"type":45,"tag":1233,"props":1239,"children":1240},{},[1241],{"type":59,"value":1242},"Recommend when...",{"type":45,"tag":1244,"props":1245,"children":1246},"tbody",{},[1247,1264,1284,1302,1327,1340,1382],{"type":45,"tag":1229,"props":1248,"children":1249},{},[1250,1256],{"type":45,"tag":1251,"props":1252,"children":1253},"td",{},[1254],{"type":59,"value":1255},"Error Monitoring",{"type":45,"tag":1251,"props":1257,"children":1258},{},[1259],{"type":45,"tag":143,"props":1260,"children":1261},{},[1262],{"type":59,"value":1263},"Always",{"type":45,"tag":1229,"props":1265,"children":1266},{},[1267,1272],{"type":45,"tag":1251,"props":1268,"children":1269},{},[1270],{"type":59,"value":1271},"OTLP Integration",{"type":45,"tag":1251,"props":1273,"children":1274},{},[1275,1277,1282],{"type":59,"value":1276},"OTel tracing detected — ",{"type":45,"tag":143,"props":1278,"children":1279},{},[1280],{"type":59,"value":1281},"replaces",{"type":59,"value":1283}," native Tracing",{"type":45,"tag":1229,"props":1285,"children":1286},{},[1287,1292],{"type":45,"tag":1251,"props":1288,"children":1289},{},[1290],{"type":59,"value":1291},"Tracing",{"type":45,"tag":1251,"props":1293,"children":1294},{},[1295,1297],{"type":59,"value":1296},"Rails \u002F Sinatra \u002F Rack \u002F any HTTP framework; ",{"type":45,"tag":143,"props":1298,"children":1299},{},[1300],{"type":59,"value":1301},"skip if OTel tracing detected",{"type":45,"tag":1229,"props":1303,"children":1304},{},[1305,1310],{"type":45,"tag":1251,"props":1306,"children":1307},{},[1308],{"type":59,"value":1309},"Logging",{"type":45,"tag":1251,"props":1311,"children":1312},{},[1313,1317,1319,1325],{"type":45,"tag":143,"props":1314,"children":1315},{},[1316],{"type":59,"value":1263},{"type":59,"value":1318}," — ",{"type":45,"tag":110,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":59,"value":1324},"enable_logs: true",{"type":59,"value":1326}," costs nothing",{"type":45,"tag":1229,"props":1328,"children":1329},{},[1330,1335],{"type":45,"tag":1251,"props":1331,"children":1332},{},[1333],{"type":59,"value":1334},"Metrics",{"type":45,"tag":1251,"props":1336,"children":1337},{},[1338],{"type":59,"value":1339},"Sidekiq present; existing metric lib (StatsD, Prometheus) detected",{"type":45,"tag":1229,"props":1341,"children":1342},{},[1343,1348],{"type":45,"tag":1251,"props":1344,"children":1345},{},[1346],{"type":59,"value":1347},"Profiling",{"type":45,"tag":1251,"props":1349,"children":1350},{},[1351,1353,1359,1361,1367,1369,1373,1375,1380],{"type":59,"value":1352},"⚠️ Beta — performance profiling requested; requires ",{"type":45,"tag":110,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":59,"value":1358},"stackprof",{"type":59,"value":1360}," or ",{"type":45,"tag":110,"props":1362,"children":1364},{"className":1363},[],[1365],{"type":59,"value":1366},"vernier",{"type":59,"value":1368}," gem; ",{"type":45,"tag":143,"props":1370,"children":1371},{},[1372],{"type":59,"value":1301},{"type":59,"value":1374}," (requires ",{"type":45,"tag":110,"props":1376,"children":1378},{"className":1377},[],[1379],{"type":59,"value":1203},{"type":59,"value":1381},", incompatible with OTLP)",{"type":45,"tag":1229,"props":1383,"children":1384},{},[1385,1390],{"type":45,"tag":1251,"props":1386,"children":1387},{},[1388],{"type":59,"value":1389},"Crons",{"type":45,"tag":1251,"props":1391,"children":1392},{},[1393],{"type":59,"value":1394},"Scheduled jobs detected (ActiveJob, Sidekiq-Cron, Clockwork, Whenever)",{"type":45,"tag":50,"props":1396,"children":1397},{},[1398,1403,1405],{"type":45,"tag":143,"props":1399,"children":1400},{},[1401],{"type":59,"value":1402},"OTel tracing detected:",{"type":59,"value":1404}," ",{"type":45,"tag":1406,"props":1407,"children":1408},"em",{},[1409,1411,1416],{"type":59,"value":1410},"\"I see OpenTelemetry tracing in the project. I recommend Sentry's OTLP integration for tracing (via your existing OTel setup) + Error Monitoring + Sentry Logging ",{"type":45,"tag":182,"props":1412,"children":1413},{},[1414],{"type":59,"value":1415},"+ Metrics\u002FCrons if applicable",{"type":59,"value":1417},". Shall I proceed?\"",{"type":45,"tag":50,"props":1419,"children":1420},{},[1421,1426,1427],{"type":45,"tag":143,"props":1422,"children":1423},{},[1424],{"type":59,"value":1425},"No OTel:",{"type":59,"value":1404},{"type":45,"tag":1406,"props":1428,"children":1429},{},[1430,1432,1437],{"type":59,"value":1431},"\"I recommend Error Monitoring + Tracing + Logging ",{"type":45,"tag":182,"props":1433,"children":1434},{},[1435],{"type":59,"value":1436},"+ Metrics if applicable",{"type":59,"value":1417},{"type":45,"tag":161,"props":1439,"children":1440},{},[],{"type":45,"tag":83,"props":1442,"children":1444},{"id":1443},"phase-3-guide",[1445],{"type":59,"value":1446},"Phase 3: Guide",{"type":45,"tag":1448,"props":1449,"children":1451},"h3",{"id":1450},"install",[1452],{"type":59,"value":1453},"Install",{"type":45,"tag":50,"props":1455,"children":1456},{},[1457],{"type":45,"tag":143,"props":1458,"children":1459},{},[1460],{"type":59,"value":1461},"Rails:",{"type":45,"tag":171,"props":1463,"children":1466},{"className":1464,"code":1465,"language":23,"meta":176,"style":176},"language-ruby shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Gemfile\ngem \"sentry-ruby\"\ngem \"sentry-rails\"\ngem \"sentry-sidekiq\"      # if using Sidekiq\ngem \"sentry-resque\"       # if using Resque\ngem \"sentry-delayed_job\"  # if using DelayedJob\ngem \"sentry-yabeda\"       # if using Yabeda metrics framework\n",[1467],{"type":45,"tag":110,"props":1468,"children":1469},{"__ignoreMap":176},[1470,1478,1486,1494,1502,1510,1518],{"type":45,"tag":182,"props":1471,"children":1472},{"class":184,"line":185},[1473],{"type":45,"tag":182,"props":1474,"children":1475},{},[1476],{"type":59,"value":1477},"# Gemfile\n",{"type":45,"tag":182,"props":1479,"children":1480},{"class":184,"line":195},[1481],{"type":45,"tag":182,"props":1482,"children":1483},{},[1484],{"type":59,"value":1485},"gem \"sentry-ruby\"\n",{"type":45,"tag":182,"props":1487,"children":1488},{"class":184,"line":232},[1489],{"type":45,"tag":182,"props":1490,"children":1491},{},[1492],{"type":59,"value":1493},"gem \"sentry-rails\"\n",{"type":45,"tag":182,"props":1495,"children":1496},{"class":184,"line":241},[1497],{"type":45,"tag":182,"props":1498,"children":1499},{},[1500],{"type":59,"value":1501},"gem \"sentry-sidekiq\"      # if using Sidekiq\n",{"type":45,"tag":182,"props":1503,"children":1504},{"class":184,"line":250},[1505],{"type":45,"tag":182,"props":1506,"children":1507},{},[1508],{"type":59,"value":1509},"gem \"sentry-resque\"       # if using Resque\n",{"type":45,"tag":182,"props":1511,"children":1512},{"class":184,"line":290},[1513],{"type":45,"tag":182,"props":1514,"children":1515},{},[1516],{"type":59,"value":1517},"gem \"sentry-delayed_job\"  # if using DelayedJob\n",{"type":45,"tag":182,"props":1519,"children":1520},{"class":184,"line":298},[1521],{"type":45,"tag":182,"props":1522,"children":1523},{},[1524],{"type":59,"value":1525},"gem \"sentry-yabeda\"       # if using Yabeda metrics framework\n",{"type":45,"tag":50,"props":1527,"children":1528},{},[1529],{"type":45,"tag":143,"props":1530,"children":1531},{},[1532],{"type":59,"value":1533},"Rack \u002F Sinatra \u002F plain Ruby:",{"type":45,"tag":171,"props":1535,"children":1536},{"className":1464,"code":1485,"language":23,"meta":176,"style":176},[1537],{"type":45,"tag":110,"props":1538,"children":1539},{"__ignoreMap":176},[1540],{"type":45,"tag":182,"props":1541,"children":1542},{"class":184,"line":185},[1543],{"type":45,"tag":182,"props":1544,"children":1545},{},[1546],{"type":59,"value":1485},{"type":45,"tag":50,"props":1548,"children":1549},{},[1550,1552,1558],{"type":59,"value":1551},"Run ",{"type":45,"tag":110,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":59,"value":1557},"bundle install",{"type":59,"value":1559},".",{"type":45,"tag":1448,"props":1561,"children":1563},{"id":1562},"framework-integration",[1564],{"type":59,"value":1565},"Framework Integration",{"type":45,"tag":1221,"props":1567,"children":1568},{},[1569,1595],{"type":45,"tag":1225,"props":1570,"children":1571},{},[1572],{"type":45,"tag":1229,"props":1573,"children":1574},{},[1575,1580,1585,1590],{"type":45,"tag":1233,"props":1576,"children":1577},{},[1578],{"type":59,"value":1579},"Framework \u002F Runtime",{"type":45,"tag":1233,"props":1581,"children":1582},{},[1583],{"type":59,"value":1584},"Gem",{"type":45,"tag":1233,"props":1586,"children":1587},{},[1588],{"type":59,"value":1589},"Init location",{"type":45,"tag":1233,"props":1591,"children":1592},{},[1593],{"type":59,"value":1594},"Auto-instruments",{"type":45,"tag":1244,"props":1596,"children":1597},{},[1598,1626,1665,1690,1716,1742],{"type":45,"tag":1229,"props":1599,"children":1600},{},[1601,1605,1613,1621],{"type":45,"tag":1251,"props":1602,"children":1603},{},[1604],{"type":59,"value":1057},{"type":45,"tag":1251,"props":1606,"children":1607},{},[1608],{"type":45,"tag":110,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":59,"value":123},{"type":45,"tag":1251,"props":1614,"children":1615},{},[1616],{"type":45,"tag":110,"props":1617,"children":1619},{"className":1618},[],[1620],{"type":59,"value":1072},{"type":45,"tag":1251,"props":1622,"children":1623},{},[1624],{"type":59,"value":1625},"Controllers, ActiveRecord, ActiveJob, ActionMailer",{"type":45,"tag":1229,"props":1627,"children":1628},{},[1629,1634,1642,1653],{"type":45,"tag":1251,"props":1630,"children":1631},{},[1632],{"type":59,"value":1633},"Rack \u002F Sinatra",{"type":45,"tag":1251,"props":1635,"children":1636},{},[1637],{"type":45,"tag":110,"props":1638,"children":1640},{"className":1639},[],[1641],{"type":59,"value":115},{"type":45,"tag":1251,"props":1643,"children":1644},{},[1645,1647],{"type":59,"value":1646},"Top of ",{"type":45,"tag":110,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":59,"value":1652},"config.ru",{"type":45,"tag":1251,"props":1654,"children":1655},{},[1656,1658,1663],{"type":59,"value":1657},"Requests (via ",{"type":45,"tag":110,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":59,"value":1094},{"type":59,"value":1664}," middleware)",{"type":45,"tag":1229,"props":1666,"children":1667},{},[1668,1672,1680,1685],{"type":45,"tag":1251,"props":1669,"children":1670},{},[1671],{"type":59,"value":1104},{"type":45,"tag":1251,"props":1673,"children":1674},{},[1675],{"type":45,"tag":110,"props":1676,"children":1678},{"className":1677},[],[1679],{"type":59,"value":1112},{"type":45,"tag":1251,"props":1681,"children":1682},{},[1683],{"type":59,"value":1684},"Sentry initializer or Sidekiq config",{"type":45,"tag":1251,"props":1686,"children":1687},{},[1688],{"type":59,"value":1689},"Worker execution → transactions",{"type":45,"tag":1229,"props":1691,"children":1692},{},[1693,1698,1707,1712],{"type":45,"tag":1251,"props":1694,"children":1695},{},[1696],{"type":59,"value":1697},"Resque",{"type":45,"tag":1251,"props":1699,"children":1700},{},[1701],{"type":45,"tag":110,"props":1702,"children":1704},{"className":1703},[],[1705],{"type":59,"value":1706},"sentry-resque",{"type":45,"tag":1251,"props":1708,"children":1709},{},[1710],{"type":59,"value":1711},"Sentry initializer",{"type":45,"tag":1251,"props":1713,"children":1714},{},[1715],{"type":59,"value":1689},{"type":45,"tag":1229,"props":1717,"children":1718},{},[1719,1724,1733,1737],{"type":45,"tag":1251,"props":1720,"children":1721},{},[1722],{"type":59,"value":1723},"DelayedJob",{"type":45,"tag":1251,"props":1725,"children":1726},{},[1727],{"type":45,"tag":110,"props":1728,"children":1730},{"className":1729},[],[1731],{"type":59,"value":1732},"sentry-delayed_job",{"type":45,"tag":1251,"props":1734,"children":1735},{},[1736],{"type":59,"value":1711},{"type":45,"tag":1251,"props":1738,"children":1739},{},[1740],{"type":59,"value":1741},"Job execution → transactions",{"type":45,"tag":1229,"props":1743,"children":1744},{},[1745,1750,1758,1762],{"type":45,"tag":1251,"props":1746,"children":1747},{},[1748],{"type":59,"value":1749},"Yabeda metrics",{"type":45,"tag":1251,"props":1751,"children":1752},{},[1753],{"type":45,"tag":110,"props":1754,"children":1756},{"className":1755},[],[1757],{"type":59,"value":1129},{"type":45,"tag":1251,"props":1759,"children":1760},{},[1761],{"type":59,"value":1711},{"type":45,"tag":1251,"props":1763,"children":1764},{},[1765],{"type":59,"value":1766},"Yabeda metric events → Sentry metrics",{"type":45,"tag":1448,"props":1768,"children":1770},{"id":1769},"init-rails-configinitializerssentryrb",[1771,1773,1778],{"type":59,"value":1772},"Init — Rails (",{"type":45,"tag":110,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":59,"value":1072},{"type":59,"value":1779},")",{"type":45,"tag":171,"props":1781,"children":1783},{"className":1464,"code":1782,"language":23,"meta":176,"style":176},"Sentry.init do |config|\n  config.dsn = ENV[\"SENTRY_DSN\"]\n  config.spotlight = Rails.env.development?  # local Spotlight UI; no DSN needed in dev\n  config.breadcrumbs_logger = [:active_support_logger, :http_logger]\n  config.send_default_pii = true\n  config.traces_sample_rate = 1.0  # lower to 0.05–0.2 in production\n  config.enable_logs = true\n  # Metrics on by default; disable with: config.enable_metrics = false\nend\n",[1784],{"type":45,"tag":110,"props":1785,"children":1786},{"__ignoreMap":176},[1787,1795,1803,1811,1819,1827,1835,1843,1851],{"type":45,"tag":182,"props":1788,"children":1789},{"class":184,"line":185},[1790],{"type":45,"tag":182,"props":1791,"children":1792},{},[1793],{"type":59,"value":1794},"Sentry.init do |config|\n",{"type":45,"tag":182,"props":1796,"children":1797},{"class":184,"line":195},[1798],{"type":45,"tag":182,"props":1799,"children":1800},{},[1801],{"type":59,"value":1802},"  config.dsn = ENV[\"SENTRY_DSN\"]\n",{"type":45,"tag":182,"props":1804,"children":1805},{"class":184,"line":232},[1806],{"type":45,"tag":182,"props":1807,"children":1808},{},[1809],{"type":59,"value":1810},"  config.spotlight = Rails.env.development?  # local Spotlight UI; no DSN needed in dev\n",{"type":45,"tag":182,"props":1812,"children":1813},{"class":184,"line":241},[1814],{"type":45,"tag":182,"props":1815,"children":1816},{},[1817],{"type":59,"value":1818},"  config.breadcrumbs_logger = [:active_support_logger, :http_logger]\n",{"type":45,"tag":182,"props":1820,"children":1821},{"class":184,"line":250},[1822],{"type":45,"tag":182,"props":1823,"children":1824},{},[1825],{"type":59,"value":1826},"  config.send_default_pii = true\n",{"type":45,"tag":182,"props":1828,"children":1829},{"class":184,"line":290},[1830],{"type":45,"tag":182,"props":1831,"children":1832},{},[1833],{"type":59,"value":1834},"  config.traces_sample_rate = 1.0  # lower to 0.05–0.2 in production\n",{"type":45,"tag":182,"props":1836,"children":1837},{"class":184,"line":298},[1838],{"type":45,"tag":182,"props":1839,"children":1840},{},[1841],{"type":59,"value":1842},"  config.enable_logs = true\n",{"type":45,"tag":182,"props":1844,"children":1845},{"class":184,"line":307},[1846],{"type":45,"tag":182,"props":1847,"children":1848},{},[1849],{"type":59,"value":1850},"  # Metrics on by default; disable with: config.enable_metrics = false\n",{"type":45,"tag":182,"props":1852,"children":1853},{"class":184,"line":344},[1854],{"type":45,"tag":182,"props":1855,"children":1856},{},[1857],{"type":59,"value":1858},"end\n",{"type":45,"tag":50,"props":1860,"children":1861},{},[1862,1867],{"type":45,"tag":110,"props":1863,"children":1865},{"className":1864},[],[1866],{"type":59,"value":123},{"type":59,"value":1868}," auto-instruments ActionController, ActiveRecord, ActiveJob, ActionMailer.",{"type":45,"tag":1448,"props":1870,"children":1872},{"id":1871},"init-rack-sinatra",[1873],{"type":59,"value":1874},"Init — Rack \u002F Sinatra",{"type":45,"tag":171,"props":1876,"children":1878},{"className":1464,"code":1877,"language":23,"meta":176,"style":176},"require \"sentry-ruby\"\n\nSentry.init do |config|\n  config.dsn = ENV[\"SENTRY_DSN\"]\n  config.spotlight = ENV[\"RACK_ENV\"] == \"development\"\n  config.breadcrumbs_logger = [:sentry_logger, :http_logger]\n  config.send_default_pii = true\n  config.traces_sample_rate = 1.0\n  config.enable_logs = true\nend\n\nuse Sentry::Rack::CaptureExceptions  # in config.ru, before app middleware\n",[1879],{"type":45,"tag":110,"props":1880,"children":1881},{"__ignoreMap":176},[1882,1890,1897,1904,1911,1919,1927,1934,1942,1949,1956,1963],{"type":45,"tag":182,"props":1883,"children":1884},{"class":184,"line":185},[1885],{"type":45,"tag":182,"props":1886,"children":1887},{},[1888],{"type":59,"value":1889},"require \"sentry-ruby\"\n",{"type":45,"tag":182,"props":1891,"children":1892},{"class":184,"line":195},[1893],{"type":45,"tag":182,"props":1894,"children":1895},{"emptyLinePlaceholder":40},[1896],{"type":59,"value":238},{"type":45,"tag":182,"props":1898,"children":1899},{"class":184,"line":232},[1900],{"type":45,"tag":182,"props":1901,"children":1902},{},[1903],{"type":59,"value":1794},{"type":45,"tag":182,"props":1905,"children":1906},{"class":184,"line":241},[1907],{"type":45,"tag":182,"props":1908,"children":1909},{},[1910],{"type":59,"value":1802},{"type":45,"tag":182,"props":1912,"children":1913},{"class":184,"line":250},[1914],{"type":45,"tag":182,"props":1915,"children":1916},{},[1917],{"type":59,"value":1918},"  config.spotlight = ENV[\"RACK_ENV\"] == \"development\"\n",{"type":45,"tag":182,"props":1920,"children":1921},{"class":184,"line":290},[1922],{"type":45,"tag":182,"props":1923,"children":1924},{},[1925],{"type":59,"value":1926},"  config.breadcrumbs_logger = [:sentry_logger, :http_logger]\n",{"type":45,"tag":182,"props":1928,"children":1929},{"class":184,"line":298},[1930],{"type":45,"tag":182,"props":1931,"children":1932},{},[1933],{"type":59,"value":1826},{"type":45,"tag":182,"props":1935,"children":1936},{"class":184,"line":307},[1937],{"type":45,"tag":182,"props":1938,"children":1939},{},[1940],{"type":59,"value":1941},"  config.traces_sample_rate = 1.0\n",{"type":45,"tag":182,"props":1943,"children":1944},{"class":184,"line":344},[1945],{"type":45,"tag":182,"props":1946,"children":1947},{},[1948],{"type":59,"value":1842},{"type":45,"tag":182,"props":1950,"children":1951},{"class":184,"line":352},[1952],{"type":45,"tag":182,"props":1953,"children":1954},{},[1955],{"type":59,"value":1858},{"type":45,"tag":182,"props":1957,"children":1958},{"class":184,"line":361},[1959],{"type":45,"tag":182,"props":1960,"children":1961},{"emptyLinePlaceholder":40},[1962],{"type":59,"value":238},{"type":45,"tag":182,"props":1964,"children":1965},{"class":184,"line":398},[1966],{"type":45,"tag":182,"props":1967,"children":1968},{},[1969],{"type":59,"value":1970},"use Sentry::Rack::CaptureExceptions  # in config.ru, before app middleware\n",{"type":45,"tag":1448,"props":1972,"children":1974},{"id":1973},"init-sidekiq-standalone",[1975],{"type":59,"value":1976},"Init — Sidekiq standalone",{"type":45,"tag":171,"props":1978,"children":1980},{"className":1464,"code":1979,"language":23,"meta":176,"style":176},"require \"sentry-ruby\"\nrequire \"sentry-sidekiq\"\n\nSentry.init do |config|\n  config.dsn = ENV[\"SENTRY_DSN\"]\n  config.spotlight = ENV.fetch(\"RAILS_ENV\", \"development\") == \"development\"\n  config.breadcrumbs_logger = [:sentry_logger]\n  config.traces_sample_rate = 1.0\n  config.enable_logs = true\nend\n",[1981],{"type":45,"tag":110,"props":1982,"children":1983},{"__ignoreMap":176},[1984,1991,1999,2006,2013,2020,2028,2036,2043,2050],{"type":45,"tag":182,"props":1985,"children":1986},{"class":184,"line":185},[1987],{"type":45,"tag":182,"props":1988,"children":1989},{},[1990],{"type":59,"value":1889},{"type":45,"tag":182,"props":1992,"children":1993},{"class":184,"line":195},[1994],{"type":45,"tag":182,"props":1995,"children":1996},{},[1997],{"type":59,"value":1998},"require \"sentry-sidekiq\"\n",{"type":45,"tag":182,"props":2000,"children":2001},{"class":184,"line":232},[2002],{"type":45,"tag":182,"props":2003,"children":2004},{"emptyLinePlaceholder":40},[2005],{"type":59,"value":238},{"type":45,"tag":182,"props":2007,"children":2008},{"class":184,"line":241},[2009],{"type":45,"tag":182,"props":2010,"children":2011},{},[2012],{"type":59,"value":1794},{"type":45,"tag":182,"props":2014,"children":2015},{"class":184,"line":250},[2016],{"type":45,"tag":182,"props":2017,"children":2018},{},[2019],{"type":59,"value":1802},{"type":45,"tag":182,"props":2021,"children":2022},{"class":184,"line":290},[2023],{"type":45,"tag":182,"props":2024,"children":2025},{},[2026],{"type":59,"value":2027},"  config.spotlight = ENV.fetch(\"RAILS_ENV\", \"development\") == \"development\"\n",{"type":45,"tag":182,"props":2029,"children":2030},{"class":184,"line":298},[2031],{"type":45,"tag":182,"props":2032,"children":2033},{},[2034],{"type":59,"value":2035},"  config.breadcrumbs_logger = [:sentry_logger]\n",{"type":45,"tag":182,"props":2037,"children":2038},{"class":184,"line":307},[2039],{"type":45,"tag":182,"props":2040,"children":2041},{},[2042],{"type":59,"value":1941},{"type":45,"tag":182,"props":2044,"children":2045},{"class":184,"line":344},[2046],{"type":45,"tag":182,"props":2047,"children":2048},{},[2049],{"type":59,"value":1842},{"type":45,"tag":182,"props":2051,"children":2052},{"class":184,"line":352},[2053],{"type":45,"tag":182,"props":2054,"children":2055},{},[2056],{"type":59,"value":1858},{"type":45,"tag":1448,"props":2058,"children":2060},{"id":2059},"environment-variables",[2061],{"type":59,"value":2062},"Environment variables",{"type":45,"tag":171,"props":2064,"children":2066},{"className":173,"code":2065,"language":175,"meta":176,"style":176},"SENTRY_DSN=https:\u002F\u002Fxxx@oYYY.ingest.sentry.io\u002FZZZ\nSENTRY_ENVIRONMENT=production   # overrides RAILS_ENV \u002F RACK_ENV\nSENTRY_RELEASE=my-app@1.0.0\n",[2067],{"type":45,"tag":110,"props":2068,"children":2069},{"__ignoreMap":176},[2070,2088,2110],{"type":45,"tag":182,"props":2071,"children":2072},{"class":184,"line":185},[2073,2078,2083],{"type":45,"tag":182,"props":2074,"children":2075},{"style":812},[2076],{"type":59,"value":2077},"SENTRY_DSN",{"type":45,"tag":182,"props":2079,"children":2080},{"style":221},[2081],{"type":59,"value":2082},"=",{"type":45,"tag":182,"props":2084,"children":2085},{"style":205},[2086],{"type":59,"value":2087},"https:\u002F\u002Fxxx@oYYY.ingest.sentry.io\u002FZZZ\n",{"type":45,"tag":182,"props":2089,"children":2090},{"class":184,"line":195},[2091,2096,2100,2105],{"type":45,"tag":182,"props":2092,"children":2093},{"style":812},[2094],{"type":59,"value":2095},"SENTRY_ENVIRONMENT",{"type":45,"tag":182,"props":2097,"children":2098},{"style":221},[2099],{"type":59,"value":2082},{"type":45,"tag":182,"props":2101,"children":2102},{"style":205},[2103],{"type":59,"value":2104},"production",{"type":45,"tag":182,"props":2106,"children":2107},{"style":189},[2108],{"type":59,"value":2109},"   # overrides RAILS_ENV \u002F RACK_ENV\n",{"type":45,"tag":182,"props":2111,"children":2112},{"class":184,"line":232},[2113,2118,2122],{"type":45,"tag":182,"props":2114,"children":2115},{"style":812},[2116],{"type":59,"value":2117},"SENTRY_RELEASE",{"type":45,"tag":182,"props":2119,"children":2120},{"style":221},[2121],{"type":59,"value":2082},{"type":45,"tag":182,"props":2123,"children":2124},{"style":205},[2125],{"type":59,"value":2126},"my-app@1.0.0\n",{"type":45,"tag":1448,"props":2128,"children":2130},{"id":2129},"feature-reference-files",[2131],{"type":59,"value":2132},"Feature reference files",{"type":45,"tag":50,"props":2134,"children":2135},{},[2136],{"type":59,"value":2137},"Walk through features one at a time. Load the reference file for each, follow its steps, and verify before moving to the next:",{"type":45,"tag":1221,"props":2139,"children":2140},{},[2141,2161],{"type":45,"tag":1225,"props":2142,"children":2143},{},[2144],{"type":45,"tag":1229,"props":2145,"children":2146},{},[2147,2151,2156],{"type":45,"tag":1233,"props":2148,"children":2149},{},[2150],{"type":59,"value":1237},{"type":45,"tag":1233,"props":2152,"children":2153},{},[2154],{"type":59,"value":2155},"Reference file",{"type":45,"tag":1233,"props":2157,"children":2158},{},[2159],{"type":59,"value":2160},"Load when...",{"type":45,"tag":1244,"props":2162,"children":2163},{},[2164,2192,2212,2232,2253,2274,2295],{"type":45,"tag":1229,"props":2165,"children":2166},{},[2167,2172,2180],{"type":45,"tag":1251,"props":2168,"children":2169},{},[2170],{"type":59,"value":2171},"Migration",{"type":45,"tag":1251,"props":2173,"children":2174},{},[2175],{"type":45,"tag":110,"props":2176,"children":2178},{"className":2177},[],[2179],{"type":59,"value":1030},{"type":45,"tag":1251,"props":2181,"children":2182},{},[2183,2185,2190],{"type":59,"value":2184},"Competitor gem found — load ",{"type":45,"tag":143,"props":2186,"children":2187},{},[2188],{"type":59,"value":2189},"before",{"type":59,"value":2191}," installing Sentry",{"type":45,"tag":1229,"props":2193,"children":2194},{},[2195,2199,2208],{"type":45,"tag":1251,"props":2196,"children":2197},{},[2198],{"type":59,"value":1255},{"type":45,"tag":1251,"props":2200,"children":2201},{},[2202],{"type":45,"tag":110,"props":2203,"children":2205},{"className":2204},[],[2206],{"type":59,"value":2207},"${SKILL_ROOT}\u002Freferences\u002Ferror-monitoring.md",{"type":45,"tag":1251,"props":2209,"children":2210},{},[2211],{"type":59,"value":1263},{"type":45,"tag":1229,"props":2213,"children":2214},{},[2215,2219,2227],{"type":45,"tag":1251,"props":2216,"children":2217},{},[2218],{"type":59,"value":1291},{"type":45,"tag":1251,"props":2220,"children":2221},{},[2222],{"type":45,"tag":110,"props":2223,"children":2225},{"className":2224},[],[2226],{"type":59,"value":1155},{"type":45,"tag":1251,"props":2228,"children":2229},{},[2230],{"type":59,"value":2231},"HTTP handlers \u002F distributed tracing",{"type":45,"tag":1229,"props":2233,"children":2234},{},[2235,2239,2248],{"type":45,"tag":1251,"props":2236,"children":2237},{},[2238],{"type":59,"value":1309},{"type":45,"tag":1251,"props":2240,"children":2241},{},[2242],{"type":45,"tag":110,"props":2243,"children":2245},{"className":2244},[],[2246],{"type":59,"value":2247},"${SKILL_ROOT}\u002Freferences\u002Flogging.md",{"type":45,"tag":1251,"props":2249,"children":2250},{},[2251],{"type":59,"value":2252},"Structured log capture",{"type":45,"tag":1229,"props":2254,"children":2255},{},[2256,2260,2269],{"type":45,"tag":1251,"props":2257,"children":2258},{},[2259],{"type":59,"value":1334},{"type":45,"tag":1251,"props":2261,"children":2262},{},[2263],{"type":45,"tag":110,"props":2264,"children":2266},{"className":2265},[],[2267],{"type":59,"value":2268},"${SKILL_ROOT}\u002Freferences\u002Fmetrics.md",{"type":45,"tag":1251,"props":2270,"children":2271},{},[2272],{"type":59,"value":2273},"Sidekiq present; existing metric patterns",{"type":45,"tag":1229,"props":2275,"children":2276},{},[2277,2281,2290],{"type":45,"tag":1251,"props":2278,"children":2279},{},[2280],{"type":59,"value":1347},{"type":45,"tag":1251,"props":2282,"children":2283},{},[2284],{"type":45,"tag":110,"props":2285,"children":2287},{"className":2286},[],[2288],{"type":59,"value":2289},"${SKILL_ROOT}\u002Freferences\u002Fprofiling.md",{"type":45,"tag":1251,"props":2291,"children":2292},{},[2293],{"type":59,"value":2294},"Performance profiling requested (beta)",{"type":45,"tag":1229,"props":2296,"children":2297},{},[2298,2302,2311],{"type":45,"tag":1251,"props":2299,"children":2300},{},[2301],{"type":59,"value":1389},{"type":45,"tag":1251,"props":2303,"children":2304},{},[2305],{"type":45,"tag":110,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":59,"value":2310},"${SKILL_ROOT}\u002Freferences\u002Fcrons.md",{"type":45,"tag":1251,"props":2312,"children":2313},{},[2314],{"type":59,"value":2315},"Scheduled jobs detected or requested",{"type":45,"tag":50,"props":2317,"children":2318},{},[2319,2321,2327],{"type":59,"value":2320},"For each feature: ",{"type":45,"tag":110,"props":2322,"children":2324},{"className":2323},[],[2325],{"type":59,"value":2326},"Read ${SKILL_ROOT}\u002Freferences\u002F\u003Cfeature>.md",{"type":59,"value":2328},", follow steps exactly, verify it works.",{"type":45,"tag":161,"props":2330,"children":2331},{},[],{"type":45,"tag":83,"props":2333,"children":2335},{"id":2334},"configuration-reference",[2336],{"type":59,"value":2337},"Configuration Reference",{"type":45,"tag":1448,"props":2339,"children":2341},{"id":2340},"key-sentryinit-options",[2342,2344,2350],{"type":59,"value":2343},"Key ",{"type":45,"tag":110,"props":2345,"children":2347},{"className":2346},[],[2348],{"type":59,"value":2349},"Sentry.init",{"type":59,"value":2351}," Options",{"type":45,"tag":1221,"props":2353,"children":2354},{},[2355,2381],{"type":45,"tag":1225,"props":2356,"children":2357},{},[2358],{"type":45,"tag":1229,"props":2359,"children":2360},{},[2361,2366,2371,2376],{"type":45,"tag":1233,"props":2362,"children":2363},{},[2364],{"type":59,"value":2365},"Option",{"type":45,"tag":1233,"props":2367,"children":2368},{},[2369],{"type":59,"value":2370},"Type",{"type":45,"tag":1233,"props":2372,"children":2373},{},[2374],{"type":59,"value":2375},"Default",{"type":45,"tag":1233,"props":2377,"children":2378},{},[2379],{"type":59,"value":2380},"Purpose",{"type":45,"tag":1244,"props":2382,"children":2383},{},[2384,2420,2462,2502,2533,2562,2593,2628,2675,2704,2734,2765,2796,2825,2861,2901,2938,2967,3004,3034,3063],{"type":45,"tag":1229,"props":2385,"children":2386},{},[2387,2396,2401,2410],{"type":45,"tag":1251,"props":2388,"children":2389},{},[2390],{"type":45,"tag":110,"props":2391,"children":2393},{"className":2392},[],[2394],{"type":59,"value":2395},"dsn",{"type":45,"tag":1251,"props":2397,"children":2398},{},[2399],{"type":59,"value":2400},"String",{"type":45,"tag":1251,"props":2402,"children":2403},{},[2404],{"type":45,"tag":110,"props":2405,"children":2407},{"className":2406},[],[2408],{"type":59,"value":2409},"nil",{"type":45,"tag":1251,"props":2411,"children":2412},{},[2413,2415],{"type":59,"value":2414},"SDK disabled if empty; env: ",{"type":45,"tag":110,"props":2416,"children":2418},{"className":2417},[],[2419],{"type":59,"value":2077},{"type":45,"tag":1229,"props":2421,"children":2422},{},[2423,2432,2436,2444],{"type":45,"tag":1251,"props":2424,"children":2425},{},[2426],{"type":45,"tag":110,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":59,"value":2431},"environment",{"type":45,"tag":1251,"props":2433,"children":2434},{},[2435],{"type":59,"value":2400},{"type":45,"tag":1251,"props":2437,"children":2438},{},[2439],{"type":45,"tag":110,"props":2440,"children":2442},{"className":2441},[],[2443],{"type":59,"value":2409},{"type":45,"tag":1251,"props":2445,"children":2446},{},[2447,2449,2455,2457],{"type":59,"value":2448},"e.g., ",{"type":45,"tag":110,"props":2450,"children":2452},{"className":2451},[],[2453],{"type":59,"value":2454},"\"production\"",{"type":59,"value":2456},"; env: ",{"type":45,"tag":110,"props":2458,"children":2460},{"className":2459},[],[2461],{"type":59,"value":2095},{"type":45,"tag":1229,"props":2463,"children":2464},{},[2465,2474,2478,2486],{"type":45,"tag":1251,"props":2466,"children":2467},{},[2468],{"type":45,"tag":110,"props":2469,"children":2471},{"className":2470},[],[2472],{"type":59,"value":2473},"release",{"type":45,"tag":1251,"props":2475,"children":2476},{},[2477],{"type":59,"value":2400},{"type":45,"tag":1251,"props":2479,"children":2480},{},[2481],{"type":45,"tag":110,"props":2482,"children":2484},{"className":2483},[],[2485],{"type":59,"value":2409},{"type":45,"tag":1251,"props":2487,"children":2488},{},[2489,2490,2496,2497],{"type":59,"value":2448},{"type":45,"tag":110,"props":2491,"children":2493},{"className":2492},[],[2494],{"type":59,"value":2495},"\"myapp@1.0.0\"",{"type":59,"value":2456},{"type":45,"tag":110,"props":2498,"children":2500},{"className":2499},[],[2501],{"type":59,"value":2117},{"type":45,"tag":1229,"props":2503,"children":2504},{},[2505,2514,2519,2528],{"type":45,"tag":1251,"props":2506,"children":2507},{},[2508],{"type":45,"tag":110,"props":2509,"children":2511},{"className":2510},[],[2512],{"type":59,"value":2513},"spotlight",{"type":45,"tag":1251,"props":2515,"children":2516},{},[2517],{"type":59,"value":2518},"Boolean",{"type":45,"tag":1251,"props":2520,"children":2521},{},[2522],{"type":45,"tag":110,"props":2523,"children":2525},{"className":2524},[],[2526],{"type":59,"value":2527},"false",{"type":45,"tag":1251,"props":2529,"children":2530},{},[2531],{"type":59,"value":2532},"Send events to Spotlight sidecar (local dev, no DSN needed)",{"type":45,"tag":1229,"props":2534,"children":2535},{},[2536,2545,2549,2557],{"type":45,"tag":1251,"props":2537,"children":2538},{},[2539],{"type":45,"tag":110,"props":2540,"children":2542},{"className":2541},[],[2543],{"type":59,"value":2544},"send_default_pii",{"type":45,"tag":1251,"props":2546,"children":2547},{},[2548],{"type":59,"value":2518},{"type":45,"tag":1251,"props":2550,"children":2551},{},[2552],{"type":45,"tag":110,"props":2553,"children":2555},{"className":2554},[],[2556],{"type":59,"value":2527},{"type":45,"tag":1251,"props":2558,"children":2559},{},[2560],{"type":59,"value":2561},"Include IP addresses and request headers",{"type":45,"tag":1229,"props":2563,"children":2564},{},[2565,2574,2579,2588],{"type":45,"tag":1251,"props":2566,"children":2567},{},[2568],{"type":45,"tag":110,"props":2569,"children":2571},{"className":2570},[],[2572],{"type":59,"value":2573},"sample_rate",{"type":45,"tag":1251,"props":2575,"children":2576},{},[2577],{"type":59,"value":2578},"Float",{"type":45,"tag":1251,"props":2580,"children":2581},{},[2582],{"type":45,"tag":110,"props":2583,"children":2585},{"className":2584},[],[2586],{"type":59,"value":2587},"1.0",{"type":45,"tag":1251,"props":2589,"children":2590},{},[2591],{"type":59,"value":2592},"Error event sample rate (0.0–1.0)",{"type":45,"tag":1229,"props":2594,"children":2595},{},[2596,2604,2608,2616],{"type":45,"tag":1251,"props":2597,"children":2598},{},[2599],{"type":45,"tag":110,"props":2600,"children":2602},{"className":2601},[],[2603],{"type":59,"value":1203},{"type":45,"tag":1251,"props":2605,"children":2606},{},[2607],{"type":59,"value":2578},{"type":45,"tag":1251,"props":2609,"children":2610},{},[2611],{"type":45,"tag":110,"props":2612,"children":2614},{"className":2613},[],[2615],{"type":59,"value":2409},{"type":45,"tag":1251,"props":2617,"children":2618},{},[2619,2621,2626],{"type":59,"value":2620},"Transaction sample rate; ",{"type":45,"tag":110,"props":2622,"children":2624},{"className":2623},[],[2625],{"type":59,"value":2409},{"type":59,"value":2627}," disables tracing",{"type":45,"tag":1229,"props":2629,"children":2630},{},[2631,2640,2644,2652],{"type":45,"tag":1251,"props":2632,"children":2633},{},[2634],{"type":45,"tag":110,"props":2635,"children":2637},{"className":2636},[],[2638],{"type":59,"value":2639},"profiles_sample_rate",{"type":45,"tag":1251,"props":2641,"children":2642},{},[2643],{"type":59,"value":2578},{"type":45,"tag":1251,"props":2645,"children":2646},{},[2647],{"type":45,"tag":110,"props":2648,"children":2650},{"className":2649},[],[2651],{"type":59,"value":2409},{"type":45,"tag":1251,"props":2653,"children":2654},{},[2655,2657,2662,2664,2669,2670],{"type":59,"value":2656},"Profiling rate relative to ",{"type":45,"tag":110,"props":2658,"children":2660},{"className":2659},[],[2661],{"type":59,"value":1203},{"type":59,"value":2663},"; requires ",{"type":45,"tag":110,"props":2665,"children":2667},{"className":2666},[],[2668],{"type":59,"value":1358},{"type":59,"value":1360},{"type":45,"tag":110,"props":2671,"children":2673},{"className":2672},[],[2674],{"type":59,"value":1366},{"type":45,"tag":1229,"props":2676,"children":2677},{},[2678,2687,2691,2699],{"type":45,"tag":1251,"props":2679,"children":2680},{},[2681],{"type":45,"tag":110,"props":2682,"children":2684},{"className":2683},[],[2685],{"type":59,"value":2686},"enable_logs",{"type":45,"tag":1251,"props":2688,"children":2689},{},[2690],{"type":59,"value":2518},{"type":45,"tag":1251,"props":2692,"children":2693},{},[2694],{"type":45,"tag":110,"props":2695,"children":2697},{"className":2696},[],[2698],{"type":59,"value":2527},{"type":45,"tag":1251,"props":2700,"children":2701},{},[2702],{"type":59,"value":2703},"Enable Sentry structured Logs",{"type":45,"tag":1229,"props":2705,"children":2706},{},[2707,2716,2720,2729],{"type":45,"tag":1251,"props":2708,"children":2709},{},[2710],{"type":45,"tag":110,"props":2711,"children":2713},{"className":2712},[],[2714],{"type":59,"value":2715},"enable_metrics",{"type":45,"tag":1251,"props":2717,"children":2718},{},[2719],{"type":59,"value":2518},{"type":45,"tag":1251,"props":2721,"children":2722},{},[2723],{"type":45,"tag":110,"props":2724,"children":2726},{"className":2725},[],[2727],{"type":59,"value":2728},"true",{"type":45,"tag":1251,"props":2730,"children":2731},{},[2732],{"type":59,"value":2733},"Enable custom metrics (on by default)",{"type":45,"tag":1229,"props":2735,"children":2736},{},[2737,2746,2751,2760],{"type":45,"tag":1251,"props":2738,"children":2739},{},[2740],{"type":45,"tag":110,"props":2741,"children":2743},{"className":2742},[],[2744],{"type":59,"value":2745},"breadcrumbs_logger",{"type":45,"tag":1251,"props":2747,"children":2748},{},[2749],{"type":59,"value":2750},"Array",{"type":45,"tag":1251,"props":2752,"children":2753},{},[2754],{"type":45,"tag":110,"props":2755,"children":2757},{"className":2756},[],[2758],{"type":59,"value":2759},"[]",{"type":45,"tag":1251,"props":2761,"children":2762},{},[2763],{"type":59,"value":2764},"Loggers for automatic breadcrumbs (see logging reference)",{"type":45,"tag":1229,"props":2766,"children":2767},{},[2768,2777,2782,2791],{"type":45,"tag":1251,"props":2769,"children":2770},{},[2771],{"type":45,"tag":110,"props":2772,"children":2774},{"className":2773},[],[2775],{"type":59,"value":2776},"max_breadcrumbs",{"type":45,"tag":1251,"props":2778,"children":2779},{},[2780],{"type":59,"value":2781},"Integer",{"type":45,"tag":1251,"props":2783,"children":2784},{},[2785],{"type":45,"tag":110,"props":2786,"children":2788},{"className":2787},[],[2789],{"type":59,"value":2790},"100",{"type":45,"tag":1251,"props":2792,"children":2793},{},[2794],{"type":59,"value":2795},"Max breadcrumbs per event",{"type":45,"tag":1229,"props":2797,"children":2798},{},[2799,2808,2812,2820],{"type":45,"tag":1251,"props":2800,"children":2801},{},[2802],{"type":45,"tag":110,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":59,"value":2807},"debug",{"type":45,"tag":1251,"props":2809,"children":2810},{},[2811],{"type":59,"value":2518},{"type":45,"tag":1251,"props":2813,"children":2814},{},[2815],{"type":45,"tag":110,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":59,"value":2527},{"type":45,"tag":1251,"props":2821,"children":2822},{},[2823],{"type":59,"value":2824},"Verbose SDK output to stdout",{"type":45,"tag":1229,"props":2826,"children":2827},{},[2828,2837,2841,2849],{"type":45,"tag":1251,"props":2829,"children":2830},{},[2831],{"type":45,"tag":110,"props":2832,"children":2834},{"className":2833},[],[2835],{"type":59,"value":2836},"capture_queue_time",{"type":45,"tag":1251,"props":2838,"children":2839},{},[2840],{"type":59,"value":2518},{"type":45,"tag":1251,"props":2842,"children":2843},{},[2844],{"type":45,"tag":110,"props":2845,"children":2847},{"className":2846},[],[2848],{"type":59,"value":2728},{"type":45,"tag":1251,"props":2850,"children":2851},{},[2852,2854,2859],{"type":59,"value":2853},"Record request queue time from ",{"type":45,"tag":110,"props":2855,"children":2857},{"className":2856},[],[2858],{"type":59,"value":1147},{"type":59,"value":2860}," header (v6.4.0+, Rails fixed in v6.4.1)",{"type":45,"tag":1229,"props":2862,"children":2863},{},[2864,2873,2877,2885],{"type":45,"tag":1251,"props":2865,"children":2866},{},[2867],{"type":45,"tag":110,"props":2868,"children":2870},{"className":2869},[],[2871],{"type":59,"value":2872},"otlp.enabled",{"type":45,"tag":1251,"props":2874,"children":2875},{},[2876],{"type":59,"value":2518},{"type":45,"tag":1251,"props":2878,"children":2879},{},[2880],{"type":45,"tag":110,"props":2881,"children":2883},{"className":2882},[],[2884],{"type":59,"value":2527},{"type":45,"tag":1251,"props":2886,"children":2887},{},[2888,2890,2895,2896],{"type":59,"value":2889},"Route OTel spans to Sentry via OTLP; ",{"type":45,"tag":143,"props":2891,"children":2892},{},[2893],{"type":59,"value":2894},"do not combine with",{"type":59,"value":1404},{"type":45,"tag":110,"props":2897,"children":2899},{"className":2898},[],[2900],{"type":59,"value":1203},{"type":45,"tag":1229,"props":2902,"children":2903},{},[2904,2913,2917,2925],{"type":45,"tag":1251,"props":2905,"children":2906},{},[2907],{"type":45,"tag":110,"props":2908,"children":2910},{"className":2909},[],[2911],{"type":59,"value":2912},"otlp.collector_url",{"type":45,"tag":1251,"props":2914,"children":2915},{},[2916],{"type":59,"value":2400},{"type":45,"tag":1251,"props":2918,"children":2919},{},[2920],{"type":45,"tag":110,"props":2921,"children":2923},{"className":2922},[],[2924],{"type":59,"value":2409},{"type":45,"tag":1251,"props":2926,"children":2927},{},[2928,2930,2936],{"type":59,"value":2929},"OTLP HTTP endpoint of an OTel Collector (e.g., ",{"type":45,"tag":110,"props":2931,"children":2933},{"className":2932},[],[2934],{"type":59,"value":2935},"http:\u002F\u002Flocalhost:4318\u002Fv1\u002Ftraces",{"type":59,"value":2937},"); when set, spans are sent to the collector instead of directly to Sentry",{"type":45,"tag":1229,"props":2939,"children":2940},{},[2941,2950,2954,2962],{"type":45,"tag":1251,"props":2942,"children":2943},{},[2944],{"type":45,"tag":110,"props":2945,"children":2947},{"className":2946},[],[2948],{"type":59,"value":2949},"org_id",{"type":45,"tag":1251,"props":2951,"children":2952},{},[2953],{"type":59,"value":2400},{"type":45,"tag":1251,"props":2955,"children":2956},{},[2957],{"type":45,"tag":110,"props":2958,"children":2960},{"className":2959},[],[2961],{"type":59,"value":2409},{"type":45,"tag":1251,"props":2963,"children":2964},{},[2965],{"type":59,"value":2966},"Explicit org ID; overrides DSN-extracted value; useful for self-hosted\u002FRelay setups (v6.5.0+)",{"type":45,"tag":1229,"props":2968,"children":2969},{},[2970,2979,2983,2991],{"type":45,"tag":1251,"props":2971,"children":2972},{},[2973],{"type":45,"tag":110,"props":2974,"children":2976},{"className":2975},[],[2977],{"type":59,"value":2978},"strict_trace_continuation",{"type":45,"tag":1251,"props":2980,"children":2981},{},[2982],{"type":59,"value":2518},{"type":45,"tag":1251,"props":2984,"children":2985},{},[2986],{"type":45,"tag":110,"props":2987,"children":2989},{"className":2988},[],[2990],{"type":59,"value":2527},{"type":45,"tag":1251,"props":2992,"children":2993},{},[2994,2996,3002],{"type":59,"value":2995},"Only continue incoming traces when ",{"type":45,"tag":110,"props":2997,"children":2999},{"className":2998},[],[3000],{"type":59,"value":3001},"sentry-org_id",{"type":59,"value":3003}," baggage matches SDK's org ID; prevents trace stitching from third-party services (v6.5.0+)",{"type":45,"tag":1229,"props":3005,"children":3006},{},[3007,3016,3021,3029],{"type":45,"tag":1251,"props":3008,"children":3009},{},[3010],{"type":45,"tag":110,"props":3011,"children":3013},{"className":3012},[],[3014],{"type":59,"value":3015},"before_send",{"type":45,"tag":1251,"props":3017,"children":3018},{},[3019],{"type":59,"value":3020},"Lambda",{"type":45,"tag":1251,"props":3022,"children":3023},{},[3024],{"type":45,"tag":110,"props":3025,"children":3027},{"className":3026},[],[3028],{"type":59,"value":2409},{"type":45,"tag":1251,"props":3030,"children":3031},{},[3032],{"type":59,"value":3033},"Mutate or drop error events before sending",{"type":45,"tag":1229,"props":3035,"children":3036},{},[3037,3046,3050,3058],{"type":45,"tag":1251,"props":3038,"children":3039},{},[3040],{"type":45,"tag":110,"props":3041,"children":3043},{"className":3042},[],[3044],{"type":59,"value":3045},"before_send_transaction",{"type":45,"tag":1251,"props":3047,"children":3048},{},[3049],{"type":59,"value":3020},{"type":45,"tag":1251,"props":3051,"children":3052},{},[3053],{"type":45,"tag":110,"props":3054,"children":3056},{"className":3055},[],[3057],{"type":59,"value":2409},{"type":45,"tag":1251,"props":3059,"children":3060},{},[3061],{"type":59,"value":3062},"Mutate or drop transaction events before sending",{"type":45,"tag":1229,"props":3064,"children":3065},{},[3066,3075,3079,3087],{"type":45,"tag":1251,"props":3067,"children":3068},{},[3069],{"type":45,"tag":110,"props":3070,"children":3072},{"className":3071},[],[3073],{"type":59,"value":3074},"before_send_log",{"type":45,"tag":1251,"props":3076,"children":3077},{},[3078],{"type":59,"value":3020},{"type":45,"tag":1251,"props":3080,"children":3081},{},[3082],{"type":45,"tag":110,"props":3083,"children":3085},{"className":3084},[],[3086],{"type":59,"value":2409},{"type":45,"tag":1251,"props":3088,"children":3089},{},[3090],{"type":59,"value":3091},"Mutate or drop log events before sending",{"type":45,"tag":1448,"props":3093,"children":3095},{"id":3094},"environment-variables-1",[3096],{"type":59,"value":3097},"Environment Variables",{"type":45,"tag":1221,"props":3099,"children":3100},{},[3101,3121],{"type":45,"tag":1225,"props":3102,"children":3103},{},[3104],{"type":45,"tag":1229,"props":3105,"children":3106},{},[3107,3112,3117],{"type":45,"tag":1233,"props":3108,"children":3109},{},[3110],{"type":59,"value":3111},"Variable",{"type":45,"tag":1233,"props":3113,"children":3114},{},[3115],{"type":59,"value":3116},"Maps to",{"type":45,"tag":1233,"props":3118,"children":3119},{},[3120],{"type":59,"value":2380},{"type":45,"tag":1244,"props":3122,"children":3123},{},[3124,3148,3179],{"type":45,"tag":1229,"props":3125,"children":3126},{},[3127,3135,3143],{"type":45,"tag":1251,"props":3128,"children":3129},{},[3130],{"type":45,"tag":110,"props":3131,"children":3133},{"className":3132},[],[3134],{"type":59,"value":2077},{"type":45,"tag":1251,"props":3136,"children":3137},{},[3138],{"type":45,"tag":110,"props":3139,"children":3141},{"className":3140},[],[3142],{"type":59,"value":2395},{"type":45,"tag":1251,"props":3144,"children":3145},{},[3146],{"type":59,"value":3147},"Data Source Name",{"type":45,"tag":1229,"props":3149,"children":3150},{},[3151,3159,3167],{"type":45,"tag":1251,"props":3152,"children":3153},{},[3154],{"type":45,"tag":110,"props":3155,"children":3157},{"className":3156},[],[3158],{"type":59,"value":2117},{"type":45,"tag":1251,"props":3160,"children":3161},{},[3162],{"type":45,"tag":110,"props":3163,"children":3165},{"className":3164},[],[3166],{"type":59,"value":2473},{"type":45,"tag":1251,"props":3168,"children":3169},{},[3170,3172,3178],{"type":59,"value":3171},"App version (e.g., ",{"type":45,"tag":110,"props":3173,"children":3175},{"className":3174},[],[3176],{"type":59,"value":3177},"my-app@1.0.0",{"type":59,"value":1779},{"type":45,"tag":1229,"props":3180,"children":3181},{},[3182,3190,3198],{"type":45,"tag":1251,"props":3183,"children":3184},{},[3185],{"type":45,"tag":110,"props":3186,"children":3188},{"className":3187},[],[3189],{"type":59,"value":2095},{"type":45,"tag":1251,"props":3191,"children":3192},{},[3193],{"type":45,"tag":110,"props":3194,"children":3196},{"className":3195},[],[3197],{"type":59,"value":2431},{"type":45,"tag":1251,"props":3199,"children":3200},{},[3201],{"type":59,"value":3202},"Deployment environment",{"type":45,"tag":50,"props":3204,"children":3205},{},[3206,3208,3213],{"type":59,"value":3207},"Options set in ",{"type":45,"tag":110,"props":3209,"children":3211},{"className":3210},[],[3212],{"type":59,"value":2349},{"type":59,"value":3214}," override environment variables.",{"type":45,"tag":161,"props":3216,"children":3217},{},[],{"type":45,"tag":83,"props":3219,"children":3221},{"id":3220},"verification",[3222],{"type":59,"value":3223},"Verification",{"type":45,"tag":50,"props":3225,"children":3226},{},[3227],{"type":45,"tag":143,"props":3228,"children":3229},{},[3230],{"type":59,"value":3231},"Local dev (no DSN needed) — Spotlight:",{"type":45,"tag":171,"props":3233,"children":3235},{"className":173,"code":3234,"language":175,"meta":176,"style":176},"npx @spotlightjs\u002Fspotlight          # browser UI at http:\u002F\u002Flocalhost:8969\n# or stream events to terminal:\nnpx @spotlightjs\u002Fspotlight tail traces --format json\n",[3236],{"type":45,"tag":110,"props":3237,"children":3238},{"__ignoreMap":176},[3239,3257,3265],{"type":45,"tag":182,"props":3240,"children":3241},{"class":184,"line":185},[3242,3247,3252],{"type":45,"tag":182,"props":3243,"children":3244},{"style":199},[3245],{"type":59,"value":3246},"npx",{"type":45,"tag":182,"props":3248,"children":3249},{"style":205},[3250],{"type":59,"value":3251}," @spotlightjs\u002Fspotlight",{"type":45,"tag":182,"props":3253,"children":3254},{"style":189},[3255],{"type":59,"value":3256},"          # browser UI at http:\u002F\u002Flocalhost:8969\n",{"type":45,"tag":182,"props":3258,"children":3259},{"class":184,"line":195},[3260],{"type":45,"tag":182,"props":3261,"children":3262},{"style":189},[3263],{"type":59,"value":3264},"# or stream events to terminal:\n",{"type":45,"tag":182,"props":3266,"children":3267},{"class":184,"line":232},[3268,3272,3276,3281,3286,3291],{"type":45,"tag":182,"props":3269,"children":3270},{"style":199},[3271],{"type":59,"value":3246},{"type":45,"tag":182,"props":3273,"children":3274},{"style":205},[3275],{"type":59,"value":3251},{"type":45,"tag":182,"props":3277,"children":3278},{"style":205},[3279],{"type":59,"value":3280}," tail",{"type":45,"tag":182,"props":3282,"children":3283},{"style":205},[3284],{"type":59,"value":3285}," traces",{"type":45,"tag":182,"props":3287,"children":3288},{"style":205},[3289],{"type":59,"value":3290}," --format",{"type":45,"tag":182,"props":3292,"children":3293},{"style":205},[3294],{"type":59,"value":3295}," json\n",{"type":45,"tag":50,"props":3297,"children":3298},{},[3299,3305],{"type":45,"tag":110,"props":3300,"children":3302},{"className":3301},[],[3303],{"type":59,"value":3304},"config.spotlight = Rails.env.development?",{"type":59,"value":3306}," (already in the init block above) routes events to the local sidecar automatically.",{"type":45,"tag":50,"props":3308,"children":3309},{},[3310],{"type":45,"tag":143,"props":3311,"children":3312},{},[3313],{"type":59,"value":3314},"With a real DSN:",{"type":45,"tag":171,"props":3316,"children":3318},{"className":1464,"code":3317,"language":23,"meta":176,"style":176},"Sentry.capture_message(\"Sentry Ruby SDK test\")\n",[3319],{"type":45,"tag":110,"props":3320,"children":3321},{"__ignoreMap":176},[3322],{"type":45,"tag":182,"props":3323,"children":3324},{"class":184,"line":185},[3325],{"type":45,"tag":182,"props":3326,"children":3327},{},[3328],{"type":59,"value":3317},{"type":45,"tag":50,"props":3330,"children":3331},{},[3332,3334,3340,3342,3348],{"type":59,"value":3333},"Nothing appears? Set ",{"type":45,"tag":110,"props":3335,"children":3337},{"className":3336},[],[3338],{"type":59,"value":3339},"config.debug = true",{"type":59,"value":3341}," and check stdout. Verify DSN format: ",{"type":45,"tag":110,"props":3343,"children":3345},{"className":3344},[],[3346],{"type":59,"value":3347},"https:\u002F\u002F\u003Ckey>@o\u003Corg>.ingest.sentry.io\u002F\u003Cproject>",{"type":59,"value":1559},{"type":45,"tag":161,"props":3350,"children":3351},{},[],{"type":45,"tag":83,"props":3353,"children":3355},{"id":3354},"phase-4-cross-link",[3356],{"type":59,"value":3357},"Phase 4: Cross-Link",{"type":45,"tag":171,"props":3359,"children":3361},{"className":173,"code":3360,"language":175,"meta":176,"style":176},"cat package.json frontend\u002Fpackage.json web\u002Fpackage.json 2>\u002Fdev\u002Fnull | grep -E '\"@sentry|\"sentry-'\n",[3362],{"type":45,"tag":110,"props":3363,"children":3364},{"__ignoreMap":176},[3365],{"type":45,"tag":182,"props":3366,"children":3367},{"class":184,"line":185},[3368,3372,3376,3380,3384,3388,3392,3396,3400,3404,3408,3412],{"type":45,"tag":182,"props":3369,"children":3370},{"style":199},[3371],{"type":59,"value":917},{"type":45,"tag":182,"props":3373,"children":3374},{"style":205},[3375],{"type":59,"value":922},{"type":45,"tag":182,"props":3377,"children":3378},{"style":205},[3379],{"type":59,"value":927},{"type":45,"tag":182,"props":3381,"children":3382},{"style":205},[3383],{"type":59,"value":932},{"type":45,"tag":182,"props":3385,"children":3386},{"style":221},[3387],{"type":59,"value":224},{"type":45,"tag":182,"props":3389,"children":3390},{"style":205},[3391],{"type":59,"value":622},{"type":45,"tag":182,"props":3393,"children":3394},{"style":221},[3395],{"type":59,"value":627},{"type":45,"tag":182,"props":3397,"children":3398},{"style":199},[3399],{"type":59,"value":861},{"type":45,"tag":182,"props":3401,"children":3402},{"style":205},[3403],{"type":59,"value":953},{"type":45,"tag":182,"props":3405,"children":3406},{"style":221},[3407],{"type":59,"value":265},{"type":45,"tag":182,"props":3409,"children":3410},{"style":205},[3411],{"type":59,"value":962},{"type":45,"tag":182,"props":3413,"children":3414},{"style":221},[3415],{"type":59,"value":967},{"type":45,"tag":1221,"props":3417,"children":3418},{},[3419,3435],{"type":45,"tag":1225,"props":3420,"children":3421},{},[3422],{"type":45,"tag":1229,"props":3423,"children":3424},{},[3425,3430],{"type":45,"tag":1233,"props":3426,"children":3427},{},[3428],{"type":59,"value":3429},"Frontend detected",{"type":45,"tag":1233,"props":3431,"children":3432},{},[3433],{"type":59,"value":3434},"Suggest",{"type":45,"tag":1244,"props":3436,"children":3437},{},[3438,3455,3472],{"type":45,"tag":1229,"props":3439,"children":3440},{},[3441,3446],{"type":45,"tag":1251,"props":3442,"children":3443},{},[3444],{"type":59,"value":3445},"React \u002F Next.js",{"type":45,"tag":1251,"props":3447,"children":3448},{},[3449],{"type":45,"tag":110,"props":3450,"children":3452},{"className":3451},[],[3453],{"type":59,"value":3454},"sentry-react-sdk",{"type":45,"tag":1229,"props":3456,"children":3457},{},[3458,3463],{"type":45,"tag":1251,"props":3459,"children":3460},{},[3461],{"type":59,"value":3462},"Svelte \u002F SvelteKit",{"type":45,"tag":1251,"props":3464,"children":3465},{},[3466],{"type":45,"tag":110,"props":3467,"children":3469},{"className":3468},[],[3470],{"type":59,"value":3471},"sentry-svelte-sdk",{"type":45,"tag":1229,"props":3473,"children":3474},{},[3475,3480],{"type":45,"tag":1251,"props":3476,"children":3477},{},[3478],{"type":59,"value":3479},"Vue",{"type":45,"tag":1251,"props":3481,"children":3482},{},[3483,3489,3490],{"type":45,"tag":110,"props":3484,"children":3486},{"className":3485},[],[3487],{"type":59,"value":3488},"@sentry\u002Fvue",{"type":59,"value":1318},{"type":45,"tag":54,"props":3491,"children":3494},{"href":3492,"rel":3493},"https:\u002F\u002Fdocs.sentry.io\u002Fplatforms\u002Fjavascript\u002Fguides\u002Fvue\u002F",[154],[3495],{"type":59,"value":3496},"docs.sentry.io\u002Fplatforms\u002Fjavascript\u002Fguides\u002Fvue\u002F",{"type":45,"tag":50,"props":3498,"children":3499},{},[3500,3502,3508],{"type":59,"value":3501},"For trace stitching between Ruby backend and JS frontend, see ",{"type":45,"tag":110,"props":3503,"children":3505},{"className":3504},[],[3506],{"type":59,"value":3507},"references\u002Ftracing.md",{"type":59,"value":3509}," → \"Frontend trace stitching\".",{"type":45,"tag":161,"props":3511,"children":3512},{},[],{"type":45,"tag":83,"props":3514,"children":3516},{"id":3515},"troubleshooting",[3517],{"type":59,"value":3518},"Troubleshooting",{"type":45,"tag":1221,"props":3520,"children":3521},{},[3522,3538],{"type":45,"tag":1225,"props":3523,"children":3524},{},[3525],{"type":45,"tag":1229,"props":3526,"children":3527},{},[3528,3533],{"type":45,"tag":1233,"props":3529,"children":3530},{},[3531],{"type":59,"value":3532},"Issue",{"type":45,"tag":1233,"props":3534,"children":3535},{},[3536],{"type":59,"value":3537},"Solution",{"type":45,"tag":1244,"props":3539,"children":3540},{},[3541,3566,3592,3624,3663,3683,3701,3721,3748,3783,3811],{"type":45,"tag":1229,"props":3542,"children":3543},{},[3544,3549],{"type":45,"tag":1251,"props":3545,"children":3546},{},[3547],{"type":59,"value":3548},"Events not appearing",{"type":45,"tag":1251,"props":3550,"children":3551},{},[3552,3557,3559,3564],{"type":45,"tag":110,"props":3553,"children":3555},{"className":3554},[],[3556],{"type":59,"value":3339},{"type":59,"value":3558},"; verify DSN; ensure ",{"type":45,"tag":110,"props":3560,"children":3562},{"className":3561},[],[3563],{"type":59,"value":2349},{"type":59,"value":3565}," before first request",{"type":45,"tag":1229,"props":3567,"children":3568},{},[3569,3574],{"type":45,"tag":1251,"props":3570,"children":3571},{},[3572],{"type":59,"value":3573},"Rails exceptions missing",{"type":45,"tag":1251,"props":3575,"children":3576},{},[3577,3579,3584,3585,3590],{"type":59,"value":3578},"Must use ",{"type":45,"tag":110,"props":3580,"children":3582},{"className":3581},[],[3583],{"type":59,"value":123},{"type":59,"value":1318},{"type":45,"tag":110,"props":3586,"children":3588},{"className":3587},[],[3589],{"type":59,"value":115},{"type":59,"value":3591}," alone doesn't hook Rails error handlers",{"type":45,"tag":1229,"props":3593,"children":3594},{},[3595,3600],{"type":45,"tag":1251,"props":3596,"children":3597},{},[3598],{"type":59,"value":3599},"No traces (native)",{"type":45,"tag":1251,"props":3601,"children":3602},{},[3603,3605,3611,3613,3618,3619],{"type":59,"value":3604},"Set ",{"type":45,"tag":110,"props":3606,"children":3608},{"className":3607},[],[3609],{"type":59,"value":3610},"traces_sample_rate > 0",{"type":59,"value":3612},"; ensure ",{"type":45,"tag":110,"props":3614,"children":3616},{"className":3615},[],[3617],{"type":59,"value":123},{"type":59,"value":1360},{"type":45,"tag":110,"props":3620,"children":3622},{"className":3621},[],[3623],{"type":59,"value":1094},{"type":45,"tag":1229,"props":3625,"children":3626},{},[3627,3632],{"type":45,"tag":1251,"props":3628,"children":3629},{},[3630],{"type":59,"value":3631},"No traces (OTLP)",{"type":45,"tag":1251,"props":3633,"children":3634},{},[3635,3637,3643,3645,3649,3650,3655,3657],{"type":59,"value":3636},"Verify ",{"type":45,"tag":110,"props":3638,"children":3640},{"className":3639},[],[3641],{"type":59,"value":3642},"opentelemetry-exporter-otlp",{"type":59,"value":3644}," gem is installed; do ",{"type":45,"tag":143,"props":3646,"children":3647},{},[3648],{"type":59,"value":1195},{"type":59,"value":1197},{"type":45,"tag":110,"props":3651,"children":3653},{"className":3652},[],[3654],{"type":59,"value":1203},{"type":59,"value":3656}," when using ",{"type":45,"tag":110,"props":3658,"children":3660},{"className":3659},[],[3661],{"type":59,"value":3662},"otlp.enabled = true",{"type":45,"tag":1229,"props":3664,"children":3665},{},[3666,3671],{"type":45,"tag":1251,"props":3667,"children":3668},{},[3669],{"type":59,"value":3670},"Sidekiq jobs not traced",{"type":45,"tag":1251,"props":3672,"children":3673},{},[3674,3676,3681],{"type":59,"value":3675},"Add ",{"type":45,"tag":110,"props":3677,"children":3679},{"className":3678},[],[3680],{"type":59,"value":1112},{"type":59,"value":3682}," gem",{"type":45,"tag":1229,"props":3684,"children":3685},{},[3686,3691],{"type":45,"tag":1251,"props":3687,"children":3688},{},[3689],{"type":59,"value":3690},"Missing request context",{"type":45,"tag":1251,"props":3692,"children":3693},{},[3694,3695],{"type":59,"value":3604},{"type":45,"tag":110,"props":3696,"children":3698},{"className":3697},[],[3699],{"type":59,"value":3700},"config.send_default_pii = true",{"type":45,"tag":1229,"props":3702,"children":3703},{},[3704,3709],{"type":45,"tag":1251,"props":3705,"children":3706},{},[3707],{"type":59,"value":3708},"Logs not appearing",{"type":45,"tag":1251,"props":3710,"children":3711},{},[3712,3713,3719],{"type":59,"value":3604},{"type":45,"tag":110,"props":3714,"children":3716},{"className":3715},[],[3717],{"type":59,"value":3718},"config.enable_logs = true",{"type":59,"value":3720},"; sentry-ruby ≥ 5.27.0 required",{"type":45,"tag":1229,"props":3722,"children":3723},{},[3724,3729],{"type":45,"tag":1251,"props":3725,"children":3726},{},[3727],{"type":59,"value":3728},"Metrics not appearing",{"type":45,"tag":1251,"props":3730,"children":3731},{},[3732,3734,3739,3741,3746],{"type":59,"value":3733},"Check ",{"type":45,"tag":110,"props":3735,"children":3737},{"className":3736},[],[3738],{"type":59,"value":2715},{"type":59,"value":3740}," is not ",{"type":45,"tag":110,"props":3742,"children":3744},{"className":3743},[],[3745],{"type":59,"value":2527},{"type":59,"value":3747},"; verify DSN",{"type":45,"tag":1229,"props":3749,"children":3750},{},[3751,3756],{"type":45,"tag":1251,"props":3752,"children":3753},{},[3754],{"type":59,"value":3755},"Events lost on shutdown",{"type":45,"tag":1251,"props":3757,"children":3758},{},[3759,3765,3767,3773,3775,3781],{"type":45,"tag":110,"props":3760,"children":3762},{"className":3761},[],[3763],{"type":59,"value":3764},"Process.exit!",{"type":59,"value":3766}," skips ",{"type":45,"tag":110,"props":3768,"children":3770},{"className":3769},[],[3771],{"type":59,"value":3772},"at_exit",{"type":59,"value":3774}," hooks — call ",{"type":45,"tag":110,"props":3776,"children":3778},{"className":3777},[],[3779],{"type":59,"value":3780},"Sentry.flush",{"type":59,"value":3782}," explicitly before forced exits",{"type":45,"tag":1229,"props":3784,"children":3785},{},[3786,3791],{"type":45,"tag":1251,"props":3787,"children":3788},{},[3789],{"type":59,"value":3790},"Forking server loses events",{"type":45,"tag":1251,"props":3792,"children":3793},{},[3794,3796,3802,3803,3809],{"type":59,"value":3795},"Puma\u002FUnicorn fork workers — re-initialize in ",{"type":45,"tag":110,"props":3797,"children":3799},{"className":3798},[],[3800],{"type":59,"value":3801},"on_worker_boot",{"type":59,"value":1360},{"type":45,"tag":110,"props":3804,"children":3806},{"className":3805},[],[3807],{"type":59,"value":3808},"after_fork",{"type":59,"value":3810},"; without this, the background worker thread dies in child processes",{"type":45,"tag":1229,"props":3812,"children":3813},{},[3814,3819],{"type":45,"tag":1251,"props":3815,"children":3816},{},[3817],{"type":59,"value":3818},"DSN rejected \u002F events not delivered",{"type":45,"tag":1251,"props":3820,"children":3821},{},[3822,3824,3829,3831,3836],{"type":59,"value":3823},"Verify DSN format: ",{"type":45,"tag":110,"props":3825,"children":3827},{"className":3826},[],[3828],{"type":59,"value":3347},{"type":59,"value":3830},"; set ",{"type":45,"tag":110,"props":3832,"children":3834},{"className":3833},[],[3835],{"type":59,"value":3339},{"type":59,"value":3837}," to see transport errors",{"type":45,"tag":3839,"props":3840,"children":3841},"style",{},[3842],{"type":59,"value":3843},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3845,"total":4023},[3846,3871,3885,3900,3914,3931,3947,3961,3971,3982,3992,4010],{"slug":3847,"name":3847,"fn":3848,"description":3849,"org":3850,"tags":3851,"stars":3868,"repoUrl":3869,"updatedAt":3870},"xcodebuildmcp","build and test Apple apps with XcodeBuildMCP","Official skill for XcodeBuildMCP. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3852,3855,3858,3861,3862,3865],{"name":3853,"slug":3854,"type":16},"Debugging","debugging",{"name":3856,"slug":3857,"type":16},"iOS","ios",{"name":3859,"slug":3860,"type":16},"macOS","macos",{"name":9,"slug":8,"type":16},{"name":3863,"slug":3864,"type":16},"Testing","testing",{"name":3866,"slug":3867,"type":16},"Xcode","xcode",6176,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002FXcodeBuildMCP","2026-04-06T18:13:34.8719",{"slug":3872,"name":3872,"fn":3873,"description":3874,"org":3875,"tags":3876,"stars":3868,"repoUrl":3869,"updatedAt":3884},"xcodebuildmcp-cli","build and test Apple apps via CLI","Official skill for the XcodeBuildMCP CLI. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3877,3880,3881,3882,3883],{"name":3878,"slug":3879,"type":16},"CLI","cli",{"name":3856,"slug":3857,"type":16},{"name":3859,"slug":3860,"type":16},{"name":3863,"slug":3864,"type":16},{"name":3866,"slug":3867,"type":16},"2026-04-06T18:13:36.13414",{"slug":3886,"name":3886,"fn":3887,"description":3888,"org":3889,"tags":3890,"stars":3897,"repoUrl":3898,"updatedAt":3899},"agents-md","maintain project instruction files","Creates and maintains concise AGENTS.md and CLAUDE.md project instruction files. Use when asked to create AGENTS.md, update AGENTS.md, maintain agent docs, set up CLAUDE.md, document repository agent conventions, or keep coding-agent instructions minimal and reference-backed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3891,3894],{"name":3892,"slug":3893,"type":16},"Documentation","documentation",{"name":3895,"slug":3896,"type":16},"Engineering","engineering",861,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fskills","2026-05-15T06:16:29.695991",{"slug":3901,"name":3901,"fn":3902,"description":3903,"org":3904,"tags":3905,"stars":3897,"repoUrl":3898,"updatedAt":3913},"blog-writing-guide","write and review engineering blog posts","Write, review, and improve blog posts for the Sentry engineering blog following Sentry's specific writing standards, voice, and quality bar. Use this skill whenever someone asks to write a blog post, draft a technical article, review blog content, improve a draft, write a product announcement, create an engineering deep-dive, or produce any written content destined for the Sentry blog or developer audience. Also trigger when the user mentions \"blog post,\" \"blog draft,\" \"write-up,\" \"announcement post,\" \"engineering post,\" \"deep dive,\" \"postmortem,\" or asks for help with technical writing for Sentry. Even if the user just says \"help me write about [feature\u002Ftopic]\" — if it sounds like it could become a Sentry blog post, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3906,3909,3910],{"name":3907,"slug":3908,"type":16},"Communications","communications",{"name":9,"slug":8,"type":16},{"name":3911,"slug":3912,"type":16},"Technical Writing","technical-writing","2026-05-15T06:16:33.38217",{"slug":3915,"name":3915,"fn":3916,"description":3917,"org":3918,"tags":3919,"stars":3897,"repoUrl":3898,"updatedAt":3930},"brand-guidelines","write copy following Sentry brand guidelines","Write copy following Sentry brand guidelines. Use when writing UI text, error messages, empty states, onboarding flows, 404 pages, documentation, marketing copy, or any user-facing content. Covers both Plain Speech (default) and Sentry Voice tones.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3920,3923,3926,3927],{"name":3921,"slug":3922,"type":16},"Branding","branding",{"name":3924,"slug":3925,"type":16},"Content Creation","content-creation",{"name":9,"slug":8,"type":16},{"name":3928,"slug":3929,"type":16},"UX Copy","ux-copy","2026-05-15T06:16:22.395707",{"slug":3932,"name":3932,"fn":3933,"description":3934,"org":3935,"tags":3936,"stars":3897,"repoUrl":3898,"updatedAt":3946},"claude-settings-audit","generate Claude Code settings permissions","Analyze a repository to generate recommended Claude Code settings.json permissions. Use when setting up a new project, auditing existing settings, or determining which read-only bash commands to allow. Detects tech stack, build tools, and monorepo structure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3937,3940,3943],{"name":3938,"slug":3939,"type":16},"Claude Code","claude-code",{"name":3941,"slug":3942,"type":16},"Configuration","configuration",{"name":3944,"slug":3945,"type":16},"Security","security","2026-05-15T06:16:44.335977",{"slug":3948,"name":3948,"fn":3949,"description":3950,"org":3951,"tags":3952,"stars":3897,"repoUrl":3898,"updatedAt":3960},"code-review","perform code reviews for Sentry projects","Perform code reviews following Sentry engineering practices. Use when reviewing pull requests, examining code changes, or providing feedback on code quality. Covers security, performance, testing, and design review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3953,3955,3956,3959],{"name":3954,"slug":3948,"type":16},"Code Review",{"name":3895,"slug":3896,"type":16},{"name":3957,"slug":3958,"type":16},"Performance","performance",{"name":3944,"slug":3945,"type":16},"2026-05-15T06:16:35.824864",{"slug":3962,"name":3962,"fn":3963,"description":3964,"org":3965,"tags":3966,"stars":3897,"repoUrl":3898,"updatedAt":3970},"code-simplifier","simplify and refine source code","Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Use when asked to \"simplify code\", \"clean up code\", \"refactor for clarity\", \"improve readability\", or review recently modified code for elegance. Focuses on project-specific best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3967],{"name":3968,"slug":3969,"type":16},"Code Analysis","code-analysis","2026-05-15T06:16:32.127981",{"slug":3972,"name":3972,"fn":3973,"description":3974,"org":3975,"tags":3976,"stars":3897,"repoUrl":3898,"updatedAt":3981},"commit","create commits with Sentry conventions","Use for every request to commit changes or draft a commit message. Creates Sentry-style conventional commits with issue references.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3977,3980],{"name":3978,"slug":3979,"type":16},"Git","git",{"name":9,"slug":8,"type":16},"2026-07-18T05:15:10.723937",{"slug":3983,"name":3983,"fn":3984,"description":3985,"org":3986,"tags":3987,"stars":3897,"repoUrl":3898,"updatedAt":3991},"create-branch","create git branches for Sentry workflows","Create a git branch following Sentry naming conventions. Use when asked to \"create a branch\", \"new branch\", \"start a branch\", \"make a branch\", \"switch to a new branch\", or when starting new work on the default branch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3988,3989,3990],{"name":3895,"slug":3896,"type":16},{"name":3978,"slug":3979,"type":16},{"name":9,"slug":8,"type":16},"2026-05-15T06:16:39.458431",{"slug":3993,"name":3993,"fn":3994,"description":3995,"org":3996,"tags":3997,"stars":3897,"repoUrl":3898,"updatedAt":4009},"django-access-review","review Django access control and IDOR","Django access control and IDOR security review. Use when reviewing Django views, DRF viewsets, ORM queries, or any Python\u002FDjango code handling user authorization. Trigger keywords: \"IDOR\", \"access control\", \"authorization\", \"Django permissions\", \"object permissions\", \"tenant isolation\", \"broken access\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3998,4001,4002,4005,4008],{"name":3999,"slug":4000,"type":16},"Access Control","access-control",{"name":3968,"slug":3969,"type":16},{"name":4003,"slug":4004,"type":16},"Django","django",{"name":4006,"slug":4007,"type":16},"Python","python",{"name":3944,"slug":3945,"type":16},"2026-05-15T06:16:43.098698",{"slug":4011,"name":4011,"fn":4012,"description":4013,"org":4014,"tags":4015,"stars":3897,"repoUrl":3898,"updatedAt":4022},"django-perf-review","review and optimize Django performance","Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4016,4017,4020,4021],{"name":3954,"slug":3948,"type":16},{"name":4018,"slug":4019,"type":16},"Database","database",{"name":4003,"slug":4004,"type":16},{"name":3957,"slug":3958,"type":16},"2026-05-15T06:16:24.832813",88,{"items":4025,"total":777},[4026,4042,4055,4071,4083,4097,4112],{"slug":4027,"name":4027,"fn":4028,"description":4029,"org":4030,"tags":4031,"stars":24,"repoUrl":25,"updatedAt":4041},"sentry-android-sdk","setup Sentry SDK for Android","Full Sentry SDK setup for Android. Use when asked to \"add Sentry to Android\", \"install sentry-android\", \"setup Sentry in Android\", or configure error monitoring, tracing, profiling, session replay, or logging for Android applications. Supports Kotlin and Java codebases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4032,4035,4036,4037,4040],{"name":4033,"slug":4034,"type":16},"Android","android",{"name":3853,"slug":3854,"type":16},{"name":14,"slug":15,"type":16},{"name":4038,"slug":4039,"type":16},"SDK","sdk",{"name":9,"slug":8,"type":16},"2026-07-12T06:08:32.396344",{"slug":4043,"name":4043,"fn":4044,"description":4045,"org":4046,"tags":4047,"stars":24,"repoUrl":25,"updatedAt":4054},"sentry-browser-sdk","setup Sentry error monitoring for browser applications","Full Sentry SDK setup for browser JavaScript. Use when asked to \"add Sentry to a website\", \"install @sentry\u002Fbrowser\", or configure error monitoring, tracing, session replay, or logging for vanilla JavaScript, jQuery, static sites, or WordPress.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4048,4049,4052,4053],{"name":3853,"slug":3854,"type":16},{"name":4050,"slug":4051,"type":16},"JavaScript","javascript",{"name":18,"slug":19,"type":16},{"name":9,"slug":8,"type":16},"2026-07-18T05:47:44.437436",{"slug":4056,"name":4056,"fn":4057,"description":4058,"org":4059,"tags":4060,"stars":24,"repoUrl":25,"updatedAt":4070},"sentry-cloudflare-sdk","setup Sentry monitoring for Cloudflare","Full Sentry SDK setup for Cloudflare Workers and Pages. Use when asked to \"add Sentry to Cloudflare Workers\", \"install @sentry\u002Fcloudflare\", or configure error monitoring, tracing, logging, crons, or AI monitoring for Cloudflare Workers, Pages, Durable Objects, Queues, Workflows, or Hono on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4061,4064,4067,4068,4069],{"name":4062,"slug":4063,"type":16},"Cloudflare","cloudflare",{"name":4065,"slug":4066,"type":16},"Edge Functions","edge-functions",{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:53:25.361175",{"slug":4072,"name":4072,"fn":4073,"description":4074,"org":4075,"tags":4076,"stars":24,"repoUrl":25,"updatedAt":4082},"sentry-cocoa-sdk","integrate Sentry SDK into Apple applications","Full Sentry SDK setup for Apple platforms (iOS, macOS, tvOS, watchOS, visionOS). Use when asked to \"add Sentry to iOS\", \"add Sentry to Swift\", \"install sentry-cocoa\", or configure error monitoring, tracing, profiling, session replay, logging, or metrics for Apple applications. Supports SwiftUI and UIKit.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4077,4078,4079,4080,4081],{"name":3856,"slug":3857,"type":16},{"name":3859,"slug":3860,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:52:57.042493",{"slug":4084,"name":4084,"fn":4085,"description":4086,"org":4087,"tags":4088,"stars":24,"repoUrl":25,"updatedAt":4096},"sentry-dotnet-sdk","setup Sentry SDK for .NET","Full Sentry SDK setup for .NET. Use when asked to \"add Sentry to .NET\", \"install Sentry for C#\", or configure error monitoring, tracing, profiling, logging, or crons for ASP.NET Core, MAUI, WPF, WinForms, Blazor, Azure Functions, or any other .NET application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4089,4092,4093,4094,4095],{"name":4090,"slug":4091,"type":16},".NET","net",{"name":3853,"slug":3854,"type":16},{"name":14,"slug":15,"type":16},{"name":4038,"slug":4039,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T06:08:33.793148",{"slug":4098,"name":4098,"fn":4099,"description":4100,"org":4101,"tags":4102,"stars":24,"repoUrl":25,"updatedAt":4111},"sentry-elixir-sdk","setup Sentry SDK for Elixir","Full Sentry SDK setup for Elixir. Use when asked to \"add Sentry to Elixir\", \"install sentry for Elixir\", or configure error monitoring, tracing, logging, or crons for Elixir, Phoenix, or Plug applications. Supports Phoenix, Plug, LiveView, Oban, and Quantum.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4103,4106,4109,4110],{"name":4104,"slug":4105,"type":16},"Backend","backend",{"name":4107,"slug":4108,"type":16},"Elixir","elixir",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:53:11.69581",{"slug":4113,"name":4113,"fn":4114,"description":4115,"org":4116,"tags":4117,"stars":24,"repoUrl":25,"updatedAt":4124},"sentry-fix-issues","fix production issues with Sentry","Find and fix issues from Sentry using MCP. Use when asked to fix Sentry errors, debug production issues, investigate exceptions, or resolve bugs reported in Sentry. Methodically analyzes stack traces, breadcrumbs, traces, and context to identify root causes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4118,4119,4122,4123],{"name":3853,"slug":3854,"type":16},{"name":4120,"slug":4121,"type":16},"Incident Response","incident-response",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T06:08:35.550824"]