Labsco
getsentry logo

sentry-ruby-sdk

โ˜… 233

by getsentry ยท part of getsentry/sentry-for-claude

Full Sentry SDK setup for Ruby. Use when asked to add Sentry to Ruby, install sentry-ruby, setup Sentry in Rails/Sinatra/Rack, 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.

๐Ÿ”Œ This skill ships inside the sentry plugin โ€” install the plugin and you also get 1 slash commands, an MCP server.

This is the playbook your agent receives when the skill activates โ€” you don't need to read it to use the skill, but it's here to audit before installing.

All Skills > SDK Setup > Ruby SDK

Sentry Ruby SDK

Opinionated wizard that scans the project and guides through complete Sentry setup.

Invoke This Skill When

  • User asks to "add Sentry to Ruby" or "set up Sentry" in a Ruby app
  • User wants error monitoring, tracing, logging, metrics, profiling, or crons in Ruby
  • User mentions sentry-ruby, sentry-rails, or the Ruby Sentry SDK
  • User is migrating from AppSignal, Honeybadger, Bugsnag, Rollbar, or Airbrake to Sentry
  • User wants to monitor exceptions, HTTP requests, or background jobs in Rails/Sinatra

Note: SDK APIs below reflect sentry-ruby v6.6.2. Always verify against docs.sentry.io/platforms/ruby/ before implementing.


Phase 1: Detect

# Existing Sentry gems
grep -i sentry Gemfile 2>/dev/null

# Framework
grep -iE '\brails\b|\bsinatra\b' Gemfile 2>/dev/null

# Web server โ€” Puma triggers queue time guidance
grep -iE '\bpuma\b' Gemfile 2>/dev/null

# Background jobs
grep -iE '\bsidekiq\b|\bresque\b|\bdelayed_job\b' Gemfile 2>/dev/null

# Yabeda metrics framework
grep -iE '\byabeda\b' Gemfile 2>/dev/null

# Competitor monitoring tools โ€” triggers migration path if found
grep -iE '\bappsignal\b|\bhoneybadger\b|\bbugsnag\b|\brollbar\b|\bairbrake\b' Gemfile 2>/dev/null

# Scheduled jobs โ€” triggers Crons recommendation
grep -iE '\bsidekiq-cron\b|\bclockwork\b|\bwhenever\b|\brufus-scheduler\b' Gemfile 2>/dev/null
grep -rn "Sidekiq::Cron\|Clockwork\|every.*do" config/ lib/ --include="*.rb" 2>/dev/null | head -10

# OpenTelemetry tracing โ€” check for SDK + instrumentations
grep -iE '\bopentelemetry-sdk\b|\bopentelemetry-instrumentation\b' Gemfile 2>/dev/null
grep -rn "OpenTelemetry::SDK\.configure\|\.use_all\|\.in_span" config/ lib/ app/ --include="*.rb" 2>/dev/null | head -5

# Existing metric patterns (StatsD, Datadog, Prometheus)
grep -rE "(statsd|dogstatsd|prometheus|\.gauge|\.histogram|\.increment|\.timing)" \
  app/ lib/ --include="*.rb" 2>/dev/null | grep -v "_spec\|_test" | head -20

# Companion frontend
cat package.json frontend/package.json web/package.json 2>/dev/null | grep -E '"@sentry|"sentry-'

Route from what you find:

  • Competitor detected (appsignal, honeybadger, bugsnag, rollbar, airbrake) โ†’ load ${SKILL_ROOT}/references/migration.md first; delete the competitor initializer as part of migration
  • Sentry already present โ†’ skip to Phase 2 to configure features
  • Rails โ†’ use sentry-rails + config/initializers/sentry.rb
  • Rack/Sinatra โ†’ sentry-ruby + Sentry::Rack::CaptureExceptions middleware
  • Sidekiq โ†’ add sentry-sidekiq; recommend Metrics if existing metric patterns found
  • Yabeda detected โ†’ add sentry-yabeda; routes Yabeda metrics to Sentry metrics
  • Puma detected โ†’ queue time capture is automatic (v6.4.0+), but the reverse proxy must set X-Request-Start header; see ${SKILL_ROOT}/references/tracing.md โ†’ "Request Queue Time"
  • 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

Phase 2: Recommend

Lead with a concrete proposal โ€” don't ask open-ended questions:

FeatureRecommend when...
Error MonitoringAlways
OTLP IntegrationOTel tracing detected โ€” replaces native Tracing
TracingRails / Sinatra / Rack / any HTTP framework; skip if OTel tracing detected
LoggingAlways โ€” enable_logs: true costs nothing
MetricsSidekiq present; existing metric lib (StatsD, Prometheus) detected
Profilingโš ๏ธ Beta โ€” performance profiling requested; requires stackprof or vernier gem; skip if OTel tracing detected (requires traces_sample_rate, incompatible with OTLP)
CronsScheduled jobs detected (ActiveJob, Sidekiq-Cron, Clockwork, Whenever)

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/Crons if applicable]. Shall I proceed?"

No OTel: "I recommend Error Monitoring + Tracing + Logging [+ Metrics if applicable]. Shall I proceed?"


Phase 3: Guide

Install

Rails:

# Gemfile
gem "sentry-ruby"
gem "sentry-rails"
gem "sentry-sidekiq"      # if using Sidekiq
gem "sentry-resque"       # if using Resque
gem "sentry-delayed_job"  # if using DelayedJob
gem "sentry-yabeda"       # if using Yabeda metrics framework

Rack / Sinatra / plain Ruby:

gem "sentry-ruby"

Run bundle install.

Framework Integration

Framework / RuntimeGemInit locationAuto-instruments
Railssentry-railsconfig/initializers/sentry.rbControllers, ActiveRecord, ActiveJob, ActionMailer
Rack / Sinatrasentry-rubyTop of config.ruRequests (via Sentry::Rack::CaptureExceptions middleware)
Sidekiqsentry-sidekiqSentry initializer or Sidekiq configWorker execution โ†’ transactions
Resquesentry-resqueSentry initializerWorker execution โ†’ transactions
DelayedJobsentry-delayed_jobSentry initializerJob execution โ†’ transactions
Yabeda metricssentry-yabedaSentry initializerYabeda metric events โ†’ Sentry metrics

Init โ€” Rails (config/initializers/sentry.rb)

Sentry.init do |config|
  config.dsn = ENV["SENTRY_DSN"]
  config.spotlight = Rails.env.development?  # local Spotlight UI; no DSN needed in dev
  config.breadcrumbs_logger = [:active_support_logger, :http_logger]
  config.send_default_pii = true
  config.traces_sample_rate = 1.0  # lower to 0.05โ€“0.2 in production
  config.enable_logs = true
  # Metrics on by default; disable with: config.enable_metrics = false
end

sentry-rails auto-instruments ActionController, ActiveRecord, ActiveJob, ActionMailer.

Init โ€” Rack / Sinatra

require "sentry-ruby"

Sentry.init do |config|
  config.dsn = ENV["SENTRY_DSN"]
  config.spotlight = ENV["RACK_ENV"] == "development"
  config.breadcrumbs_logger = [:sentry_logger, :http_logger]
  config.send_default_pii = true
  config.traces_sample_rate = 1.0
  config.enable_logs = true
end

use Sentry::Rack::CaptureExceptions  # in config.ru, before app middleware

Init โ€” Sidekiq standalone

require "sentry-ruby"
require "sentry-sidekiq"

Sentry.init do |config|
  config.dsn = ENV["SENTRY_DSN"]
  config.spotlight = ENV.fetch("RAILS_ENV", "development") == "development"
  config.breadcrumbs_logger = [:sentry_logger]
  config.traces_sample_rate = 1.0
  config.enable_logs = true
end

Environment variables

SENTRY_DSN=https://xxx@oYYY.ingest.sentry.io/ZZZ
SENTRY_ENVIRONMENT=production   # overrides RAILS_ENV / RACK_ENV
SENTRY_RELEASE=my-app@1.0.0

Feature reference files

Walk through features one at a time. Load the reference file for each, follow its steps, and verify before moving to the next:

FeatureReference fileLoad when...
Migration${SKILL_ROOT}/references/migration.mdCompetitor gem found โ€” load before installing Sentry
Error Monitoring${SKILL_ROOT}/references/error-monitoring.mdAlways
Tracing${SKILL_ROOT}/references/tracing.mdHTTP handlers / distributed tracing
Logging${SKILL_ROOT}/references/logging.mdStructured log capture
Metrics${SKILL_ROOT}/references/metrics.mdSidekiq present; existing metric patterns
Profiling${SKILL_ROOT}/references/profiling.mdPerformance profiling requested (beta)
Crons${SKILL_ROOT}/references/crons.mdScheduled jobs detected or requested

For each feature: Read ${SKILL_ROOT}/references/<feature>.md, follow steps exactly, verify it works.


Verification

Local dev (no DSN needed) โ€” Spotlight:

npx @spotlightjs/spotlight          # browser UI at http://localhost:8969
# or stream events to terminal:
npx @spotlightjs/spotlight tail traces --format json

config.spotlight = Rails.env.development? (already in the init block above) routes events to the local sidecar automatically.

With a real DSN:

Sentry.capture_message("Sentry Ruby SDK test")

Nothing appears? Set config.debug = true and check stdout. Verify DSN format: https://<key>@o<org>.ingest.sentry.io/<project>.


cat package.json frontend/package.json web/package.json 2>/dev/null | grep -E '"@sentry|"sentry-'
Frontend detectedSuggest
React / Next.jssentry-react-sdk
Svelte / SvelteKitsentry-svelte-sdk
Vue@sentry/vue โ€” docs.sentry.io/platforms/javascript/guides/vue/

For trace stitching between Ruby backend and JS frontend, see references/tracing.md โ†’ "Frontend trace stitching".