Skip to content

Commit 773f81f

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

4 files changed

Lines changed: 76 additions & 3 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

0 commit comments

Comments
 (0)