From ff8b85e1221246eec22ab2f61b34298f71826c82 Mon Sep 17 00:00:00 2001 From: Peter Solnica Date: Tue, 28 Oct 2025 10:53:49 +0000 Subject: [PATCH 1/6] fix(sidekiq): disable :redis patch in specs --- sentry-sidekiq/spec/spec_helper.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sentry-sidekiq/spec/spec_helper.rb b/sentry-sidekiq/spec/spec_helper.rb index 6aaf3c765..bc222f243 100644 --- a/sentry-sidekiq/spec/spec_helper.rb +++ b/sentry-sidekiq/spec/spec_helper.rb @@ -344,6 +344,12 @@ def perform_basic_setup config.sdk_logger = ::Logger.new(nil) config.background_worker_threads = 0 config.transport.transport_class = Sentry::DummyTransport + + # This causes failures in Sidekiq < 7.0 + # + # TODO: why is redis patch enabled by default? + config.enabled_patches.delete(:redis) + yield config if block_given? end end From a7c2827e69eb0dcadee0e477878c029631811767 Mon Sep 17 00:00:00 2001 From: Peter Solnica Date: Thu, 25 Sep 2025 09:59:22 +0000 Subject: [PATCH 2/6] chore(sidekiq): add spec:isolated rake task --- sentry-sidekiq/Rakefile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/sentry-sidekiq/Rakefile b/sentry-sidekiq/Rakefile index 13afab191..9207ea5fe 100644 --- a/sentry-sidekiq/Rakefile +++ b/sentry-sidekiq/Rakefile @@ -1,10 +1,13 @@ # frozen_string_literal: true require "bundler/gem_tasks" -require "rspec/core/rake_task" +require_relative "../lib/sentry/test/rake_tasks" -RSpec::Core::RakeTask.new(:spec).tap do |task| - task.rspec_opts = "--order rand" -end +Sentry::Test::RakeTasks.define_spec_tasks( + spec_pattern: "spec/sentry/**/*_spec.rb", + spec_rspec_opts: "--order rand --format progress", + isolated_specs_pattern: "spec/isolated/**/*_spec.rb", + isolated_rspec_opts: "--format progress" +) -task default: :spec +task default: [:spec, :"spec:isolated"] From 2982859a3f75345f1733725a96bda1424c789c3e Mon Sep 17 00:00:00 2001 From: Peter Solnica Date: Tue, 28 Oct 2025 11:09:05 +0000 Subject: [PATCH 3/6] chore(sidekiq): move rails_spec to spec:isolated group --- .../spec/{sentry => isolated}/rails_spec.rb | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) rename sentry-sidekiq/spec/{sentry => isolated}/rails_spec.rb (59%) diff --git a/sentry-sidekiq/spec/sentry/rails_spec.rb b/sentry-sidekiq/spec/isolated/rails_spec.rb similarity index 59% rename from sentry-sidekiq/spec/sentry/rails_spec.rb rename to sentry-sidekiq/spec/isolated/rails_spec.rb index 4026ed4d6..1a64c376b 100644 --- a/sentry-sidekiq/spec/sentry/rails_spec.rb +++ b/sentry-sidekiq/spec/isolated/rails_spec.rb @@ -1,14 +1,16 @@ # frozen_string_literal: true -return unless ENV["WITH_SENTRY_RAILS"] - -require "logger" +begin + require "simplecov" + SimpleCov.command_name "SidekiqRails" +rescue LoadError +end -require "rails" require "sentry-rails" -require "spec_helper" -require "action_controller/railtie" +# This MUST be required after sentry-rails because it requires sentry-sidekiq +# which checks if Railtie is defined to properly set things up +require_relative "../spec_helper" class TestApp < Rails::Application end @@ -23,15 +25,9 @@ def self.name app.config.hosts = nil app.config.secret_key_base = "test" app.config.eager_load = false + app.initializer :configure_sentry do - Sentry.init do |config| - config.release = 'beta' - config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" - config.transport.transport_class = Sentry::DummyTransport - # for sending events synchronously - config.background_worker_threads = 0 - yield(config, app) if block_given? - end + perform_basic_setup end app.initialize! From 41f22e0a22b85d3cde471a3964851079ccbfa56d Mon Sep 17 00:00:00 2001 From: Peter Solnica Date: Thu, 25 Sep 2025 10:00:51 +0000 Subject: [PATCH 4/6] chore(ci): remove usage of obsolete env var Now rails spec for sidekiq runs always as an isolated spec. --- .github/workflows/sentry_sidekiq_test.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/sentry_sidekiq_test.yml b/.github/workflows/sentry_sidekiq_test.yml index 692007f49..650c35077 100644 --- a/.github/workflows/sentry_sidekiq_test.yml +++ b/.github/workflows/sentry_sidekiq_test.yml @@ -71,8 +71,6 @@ jobs: redis-version: ${{ (contains(matrix.sidekiq_version, '7.0') || contains(matrix.sidekiq_version, '8.0')) && 6 || 5 }} - name: Run specs with Sidekiq ${{ matrix.sidekiq_version }} - env: - WITH_SENTRY_RAILS: 1 run: bundle exec rake - name: Upload Coverage From 7efa6bcb6333dfae8a1492d1a70614a729553f5d Mon Sep 17 00:00:00 2001 From: Peter Solnica Date: Tue, 4 Nov 2025 15:06:43 +0000 Subject: [PATCH 5/6] Restore redis patch --- sentry-sidekiq/spec/spec_helper.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sentry-sidekiq/spec/spec_helper.rb b/sentry-sidekiq/spec/spec_helper.rb index bc222f243..35454aac9 100644 --- a/sentry-sidekiq/spec/spec_helper.rb +++ b/sentry-sidekiq/spec/spec_helper.rb @@ -345,11 +345,6 @@ def perform_basic_setup config.background_worker_threads = 0 config.transport.transport_class = Sentry::DummyTransport - # This causes failures in Sidekiq < 7.0 - # - # TODO: why is redis patch enabled by default? - config.enabled_patches.delete(:redis) - yield config if block_given? end end From d54d9b53ebf7782e9a9b850f7d2417a4d7ec8c6f Mon Sep 17 00:00:00 2001 From: Peter Solnica Date: Tue, 4 Nov 2025 15:17:32 +0000 Subject: [PATCH 6/6] Fix specs after restoring redis patch --- .../spec/sentry/sidekiq/cron/job_spec.rb | 24 +++++++++++-------- .../sidekiq/sentry_context_middleware_spec.rb | 11 +++++---- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/sentry-sidekiq/spec/sentry/sidekiq/cron/job_spec.rb b/sentry-sidekiq/spec/sentry/sidekiq/cron/job_spec.rb index 087810f3e..9a0b3384d 100644 --- a/sentry-sidekiq/spec/sentry/sidekiq/cron/job_spec.rb +++ b/sentry-sidekiq/spec/sentry/sidekiq/cron/job_spec.rb @@ -109,10 +109,10 @@ expect(::Sidekiq::Queue.new.size).to eq(1) expect(transport.events.count).to eq(1) - event = transport.events.last - expect(event.spans.count).to eq(1) - expect(event.spans[0][:op]).to eq("queue.publish") - expect(event.spans[0][:data]['messaging.destination.name']).to eq('default') + + span = transport.events.last.spans.detect { |span| span[:op] == "queue.publish" } + expect(span[:op]).to eq("queue.publish") + expect(span[:data]['messaging.destination.name']).to eq('default') end it 'adds job to sidekiq within transaction' do @@ -124,12 +124,16 @@ expect(::Sidekiq::Queue.new.size).to eq(2) expect(transport.events.count).to eq(2) events = transport.events - expect(events[0].spans.count).to eq(1) - expect(events[0].spans[0][:op]).to eq("queue.publish") - expect(events[0].spans[0][:data]['messaging.destination.name']).to eq('default') - expect(events[1].spans.count).to eq(1) - expect(events[1].spans[0][:op]).to eq("queue.publish") - expect(events[1].spans[0][:data]['messaging.destination.name']).to eq('default') + + span = events[0].spans.detect { |span| span[:op] == "queue.publish" } + expect(span).not_to be_nil + expect(span[:op]).to eq("queue.publish") + expect(span[:data]['messaging.destination.name']).to eq('default') + + span = events[1].spans.detect { |span| span[:op] == "queue.publish" } + expect(span).not_to be_nil + expect(span[:op]).to eq("queue.publish") + expect(span[:data]['messaging.destination.name']).to eq('default') expect(events[0].dynamic_sampling_context['trace_id']).to_not eq(events[1].dynamic_sampling_context['trace_id']) end diff --git a/sentry-sidekiq/spec/sentry/sidekiq/sentry_context_middleware_spec.rb b/sentry-sidekiq/spec/sentry/sidekiq/sentry_context_middleware_spec.rb index c37580d57..edc4f941a 100644 --- a/sentry-sidekiq/spec/sentry/sidekiq/sentry_context_middleware_spec.rb +++ b/sentry-sidekiq/spec/sentry/sidekiq/sentry_context_middleware_spec.rb @@ -222,11 +222,12 @@ def ensure_queue_empty(queue, timeout: 0.1) transaction.finish expect(transport.events.count).to eq(1) - event = transport.events.last - expect(event.spans.count).to eq(1) - expect(event.spans[0][:op]).to eq("queue.publish") - expect(event.spans[0][:data]['messaging.message.id']).to eq(message_id) - expect(event.spans[0][:data]['messaging.destination.name']).to eq('default') + + span = transport.events.last.spans.detect { |span| span[:op] == "queue.publish" } + expect(span).not_to be_nil + expect(span[:op]).to eq("queue.publish") + expect(span[:data]['messaging.message.id']).to eq(message_id) + expect(span[:data]['messaging.destination.name']).to eq('default') end it "does not propagate headers with propagate_traces = false" do