Skip to content

Commit b0e18dd

Browse files
committed
feat(data-collection): Guard user collection under data_collection.user_info
1 parent 2672657 commit b0e18dd

6 files changed

Lines changed: 92 additions & 8 deletions

File tree

sentry-rails/lib/sentry/rails/active_job.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def serialize
3737
sentry_data["trace_propagation_headers"] = headers if headers && !headers.empty?
3838
end
3939

40-
if Sentry.configuration.send_default_pii
40+
if Sentry.configuration.data_collection.user_info
4141
user = Sentry.get_current_scope.user
4242
allowed = user.transform_keys(&:to_s).slice(*USER_FIELDS_ALLOWLIST)
4343
sentry_data["user"] = allowed unless allowed.empty?

sentry-rails/spec/active_job/shared_examples/tracing/user_propagation.rb

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,52 @@ def perform
113113
expect(consumer_transaction.user).to eq({})
114114
end
115115
end
116+
117+
context "data collection" do
118+
context "when user_info is enabled" do
119+
let(:configure_sentry) do
120+
proc do |config|
121+
config.traces_sample_rate = 1.0
122+
config.data_collection.user_info = true
123+
end
124+
end
125+
126+
it "propagates user context to the consumer transaction" do
127+
Sentry.set_user(full_user)
128+
129+
successful_job.perform_later
130+
Sentry.set_user({})
131+
132+
drain
133+
134+
expect(consumer_transaction).not_to be_nil
135+
expect(consumer_transaction.user).to eq(
136+
id: "u1",
137+
email: "alice@example.com",
138+
username: "alice"
139+
)
140+
end
141+
end
142+
143+
context "when user_info is disabled" do
144+
let(:configure_sentry) do
145+
proc do |config|
146+
config.traces_sample_rate = 1.0
147+
config.data_collection.user_info = false
148+
end
149+
end
150+
151+
it "does not propagate user context to the consumer transaction" do
152+
Sentry.set_user(full_user)
153+
154+
successful_job.perform_later
155+
Sentry.set_user({})
156+
157+
drain
158+
159+
expect(consumer_transaction).not_to be_nil
160+
expect(consumer_transaction.user).to eq({})
161+
end
162+
end
163+
end
116164
end

sentry-ruby/lib/sentry/event.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class Event
2828

2929
MAX_MESSAGE_SIZE_IN_BYTES = 1024 * 8
3030

31-
SKIP_INSPECTION_ATTRIBUTES = [:@modules, :@stacktrace_builder, :@send_default_pii, :@trusted_proxies, :@rack_env_whitelist]
31+
SKIP_INSPECTION_ATTRIBUTES = [:@modules, :@stacktrace_builder, :@send_default_pii, :@data_collection, :@trusted_proxies, :@rack_env_whitelist]
3232

3333
include CustomInspection
3434

@@ -74,6 +74,7 @@ def initialize(configuration:, integration_meta: nil, message: nil)
7474

7575
# configuration options to help events process data
7676
@send_default_pii = configuration.send_default_pii
77+
@data_collection = configuration.data_collection
7778
@trusted_proxies = configuration.trusted_proxies
7879
@stacktrace_builder = configuration.stacktrace_builder
7980
@rack_env_whitelist = configuration.rack_env_whitelist
@@ -103,7 +104,7 @@ def rack_env=(env)
103104
unless request || env.empty?
104105
add_request_interface(env)
105106

106-
user[:ip_address] ||= calculate_real_ip_from_rack(env) if @send_default_pii
107+
user[:ip_address] ||= calculate_real_ip_from_rack(env) if @data_collection.user_info
107108

108109
if request_id = Utils::RequestId.read_from(env)
109110
tags[:request_id] = request_id

sentry-ruby/spec/sentry/event_spec.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,30 @@
170170
end
171171
end
172172
end
173+
174+
context "data collection" do
175+
it "does not auto-populate user information when user_info is disabled" do
176+
Sentry.configuration.data_collection.user_info = false
177+
Sentry.get_current_scope.apply_to_event(event)
178+
179+
expect(event.to_h[:user][:ip_address]).to be_nil
180+
end
181+
182+
it "auto-populates user information when user_info is enabled" do
183+
Sentry.configuration.data_collection.user_info = true
184+
Sentry.get_current_scope.apply_to_event(event)
185+
186+
expect(event.to_h[:user][:ip_address]).to eq("2.2.2.2")
187+
end
188+
189+
it "preserves explicitly set user data set on the scope even when user_info is disabled" do
190+
Sentry.configuration.data_collection.user_info = false
191+
Sentry.set_user(id: "user-1", username: "alice")
192+
Sentry.get_current_scope.apply_to_event(event)
193+
194+
expect(event.to_h[:user]).to include(id: "user-1", username: "alice")
195+
end
196+
end
173197
end
174198

175199
describe '#to_json_compatible' do

sentry-sidekiq/lib/sentry/sidekiq/sentry_context_middleware.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,10 @@ class SentryContextClientMiddleware
108108
def call(worker_class, job, queue, _redis_pool)
109109
return yield unless Sentry.initialized?
110110

111-
user = Sentry.get_current_scope.user
112-
job["sentry_user"] = user unless user.empty?
111+
if Sentry.configuration.data_collection.user_info
112+
user = Sentry.get_current_scope.user
113+
job["sentry_user"] = user unless user.empty?
114+
end
113115

114116
if Sentry.configuration.sidekiq.propagate_traces
115117
job["trace_propagation_headers"] ||= Sentry.get_trace_propagation_headers

sentry-sidekiq/spec/sentry/sidekiq/sentry_context_middleware_spec.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,17 +168,26 @@ def ensure_queue_empty(queue, timeout: 0.1)
168168
expect(queue.first["sentry_user"]).to be_nil
169169
end
170170

171-
describe "with user" do
171+
context "user data collection" do
172172
before do
173173
Sentry.set_user(user)
174174
end
175175

176-
it "sets user of the current scope to the job" do
176+
it "propagates user information when user_info is enabled" do
177+
Sentry.configuration.data_collection.user_info = true
178+
177179
client.push('queue' => 'default', 'class' => HappyWorker, 'args' => [])
178180

179-
expect(queue.size).to be(1)
180181
expect(queue.first["sentry_user"]).to eq(user)
181182
end
183+
184+
it "does not propagate user information when user_info is disabled" do
185+
Sentry.configuration.data_collection.user_info = false
186+
187+
client.push('queue' => 'default', 'class' => HappyWorker, 'args' => [])
188+
189+
expect(queue.first["sentry_user"]).to be_nil
190+
end
182191
end
183192

184193
describe "with transaction" do

0 commit comments

Comments
 (0)