From 02a5e26a6d65264293751d0608a0dab9f924bf76 Mon Sep 17 00:00:00 2001 From: Neel Shah Date: Wed, 19 Mar 2025 14:53:38 +0100 Subject: [PATCH] Add sidekiq config propagate_traces to control trace header injection --- CHANGELOG.md | 8 ++++++++ sentry-sidekiq/lib/sentry/sidekiq/configuration.rb | 4 ++++ .../sentry/sidekiq/sentry_context_middleware.rb | 5 ++++- .../spec/sentry/sidekiq/configuration_spec.rb | 12 ++++++++++++ .../sidekiq/sentry_context_middleware_spec.rb | 14 ++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 228dce77e..16b127447 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ - Add new sidekiq config `report_only_dead_jobs` ([#2581](https://github.com/getsentry/sentry-ruby/pull/2581)) - Add `max_nesting` of 10 to breadcrumbs data serialization ([#2583](https://github.com/getsentry/sentry-ruby/pull/2583)) +- Add sidekiq config `propagate_traces` to control trace header injection ([#2588](https://github.com/getsentry/sentry-ruby/pull/2588)) + + If you use schedulers you can get one large trace with all your jobs which is undesirable. + We recommend using the following to propagate traces only from the Rails server and not elsewhere. + + ```ruby + config.sidekiq.propagate_traces = false unless Rails.const_defined?('Server') + ``` ### Bug Fixes diff --git a/sentry-sidekiq/lib/sentry/sidekiq/configuration.rb b/sentry-sidekiq/lib/sentry/sidekiq/configuration.rb index bec202651..fba2dfc18 100644 --- a/sentry-sidekiq/lib/sentry/sidekiq/configuration.rb +++ b/sentry-sidekiq/lib/sentry/sidekiq/configuration.rb @@ -24,9 +24,13 @@ class Configuration # Only report jobs that don't have `dead: false` set in the job's `sidekiq_options` attr_accessor :report_only_dead_jobs + # Whether we should inject headers while enqueuing the job in order to have a connected trace + attr_accessor :propagate_traces + def initialize @report_after_job_retries = false @report_only_dead_jobs = false + @propagate_traces = true end end end diff --git a/sentry-sidekiq/lib/sentry/sidekiq/sentry_context_middleware.rb b/sentry-sidekiq/lib/sentry/sidekiq/sentry_context_middleware.rb index 85c115e93..bae97b9e6 100644 --- a/sentry-sidekiq/lib/sentry/sidekiq/sentry_context_middleware.rb +++ b/sentry-sidekiq/lib/sentry/sidekiq/sentry_context_middleware.rb @@ -95,7 +95,10 @@ def call(worker_class, job, queue, _redis_pool) user = Sentry.get_current_scope.user job["sentry_user"] = user unless user.empty? - job["trace_propagation_headers"] ||= Sentry.get_trace_propagation_headers + + if Sentry.configuration.sidekiq.propagate_traces + job["trace_propagation_headers"] ||= Sentry.get_trace_propagation_headers + end Sentry.with_child_span(op: "queue.publish", description: worker_class.to_s) do |span| set_span_data(span, id: job["jid"], queue: queue) diff --git a/sentry-sidekiq/spec/sentry/sidekiq/configuration_spec.rb b/sentry-sidekiq/spec/sentry/sidekiq/configuration_spec.rb index 2bcab6c58..3fa83a217 100644 --- a/sentry-sidekiq/spec/sentry/sidekiq/configuration_spec.rb +++ b/sentry-sidekiq/spec/sentry/sidekiq/configuration_spec.rb @@ -26,4 +26,16 @@ expect(subject.report_after_job_retries).to eq(false) end end + + describe "#report_only_dead_jobs" do + it "has correct default value" do + expect(subject.report_only_dead_jobs).to eq(false) + end + end + + describe "#propagate_traces" do + it "has correct default value" do + expect(subject.propagate_traces).to eq(true) + end + end 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 45907adb4..b12a786c1 100644 --- a/sentry-sidekiq/spec/sentry/sidekiq/sentry_context_middleware_spec.rb +++ b/sentry-sidekiq/spec/sentry/sidekiq/sentry_context_middleware_spec.rb @@ -222,5 +222,19 @@ expect(event.spans[0][:data]['messaging.message.id']).to eq(message_id) expect(event.spans[0][:data]['messaging.destination.name']).to eq('default') end + + it "does not propagate headers with propagate_traces = false" do + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + config.sidekiq.propagate_traces = false + end + + Sentry.get_current_scope.set_span(transaction) + + client.push('queue' => 'default', 'class' => HappyWorker, 'args' => []) + + expect(queue.size).to be(1) + expect(queue.first["trace_propagation_headers"]).to be_nil + end end end