Commit e27b92a0 authored by Nikolay Belokolodov's avatar Nikolay Belokolodov Committed by Sean McGivern

Add user to Snowplow context

For more detailed analysis we need to track user id.
As described at
https://gitlab.com/gitlab-org/gitlab/-/issues/336779#considered-data-for-pseudonymization
user_id should be pseudoanonymized. user_id emitting is disabled by
default by a feature flag.
parent 86541261
---
name: add_actor_based_user_to_snowplow_tracking
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71353
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338150
milestone: '14.4'
type: development
group: group::product intelligence
default_enabled: false
...@@ -30,7 +30,7 @@ module Security ...@@ -30,7 +30,7 @@ module Security
'scan', 'scan',
context: [context], context: [context],
idempotency_key: Digest::SHA256.hexdigest(idempotency_key), idempotency_key: Digest::SHA256.hexdigest(idempotency_key),
user: build.user_id, user: build.user,
project: build.project_id, project: build.project_id,
label: analyzer_id(report), label: analyzer_id(report),
property: scan_type(report, report_type)) property: scan_type(report, report_type))
......
...@@ -43,7 +43,7 @@ RSpec.describe Security::TrackScanService do ...@@ -43,7 +43,7 @@ RSpec.describe Security::TrackScanService do
} }
}], }],
idempotency_key: '82fc6391e4be61e03e51fa8c5c6bfc32b3d3f0065ad2fe0a01211606952b8d82', idempotency_key: '82fc6391e4be61e03e51fa8c5c6bfc32b3d3f0065ad2fe0a01211606952b8d82',
user: user.id, user: user,
project: project.id, project: project.id,
label: 'gitlab-dast', label: 'gitlab-dast',
property: 'dast') property: 'dast')
...@@ -81,7 +81,7 @@ RSpec.describe Security::TrackScanService do ...@@ -81,7 +81,7 @@ RSpec.describe Security::TrackScanService do
} }
}], }],
idempotency_key: '62bc6c62686b327dbf420f8891e1418406b60f49e574b6ff22f4d6a272dbc595', idempotency_key: '62bc6c62686b327dbf420f8891e1418406b60f49e574b6ff22f4d6a272dbc595',
user: user.id, user: user,
project: project.id, project: project.id,
label: nil, label: nil,
property: 'dast') property: 'dast')
......
...@@ -10,6 +10,7 @@ module Gitlab ...@@ -10,6 +10,7 @@ module Gitlab
@namespace = namespace @namespace = namespace
@plan = namespace&.actual_plan_name @plan = namespace&.actual_plan_name
@project = project @project = project
@user = user
@extra = extra @extra = extra
end end
...@@ -35,7 +36,7 @@ module Gitlab ...@@ -35,7 +36,7 @@ module Gitlab
private private
attr_accessor :namespace, :project, :extra, :plan attr_accessor :namespace, :project, :extra, :plan, :user
def to_h def to_h
{ {
...@@ -44,6 +45,7 @@ module Gitlab ...@@ -44,6 +45,7 @@ module Gitlab
plan: plan, plan: plan,
extra: extra extra: extra
}.merge(project_and_namespace) }.merge(project_and_namespace)
.merge(user_data)
end end
def project_and_namespace def project_and_namespace
...@@ -58,6 +60,10 @@ module Gitlab ...@@ -58,6 +60,10 @@ module Gitlab
def project_id def project_id
project.is_a?(Integer) ? project : project&.id project.is_a?(Integer) ? project : project&.id
end end
def user_data
::Feature.enabled?(:add_actor_based_user_to_snowplow_tracking, user) ? { user_id: user&.id } : {}
end
end end
end end
end end
...@@ -5,6 +5,7 @@ require 'spec_helper' ...@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Tracking::StandardContext do RSpec.describe Gitlab::Tracking::StandardContext do
let_it_be(:project) { create(:project) } let_it_be(:project) { create(:project) }
let_it_be(:namespace) { create(:namespace) } let_it_be(:namespace) { create(:namespace) }
let_it_be(:user) { create(:user) }
let(:snowplow_context) { subject.to_context } let(:snowplow_context) { subject.to_context }
...@@ -87,8 +88,8 @@ RSpec.describe Gitlab::Tracking::StandardContext do ...@@ -87,8 +88,8 @@ RSpec.describe Gitlab::Tracking::StandardContext do
end end
end end
it 'does not contain user id' do it 'contains user id' do
expect(snowplow_context.to_json[:data].keys).not_to include(:user_id) expect(snowplow_context.to_json[:data].keys).to include(:user_id)
end end
it 'contains namespace and project ids' do it 'contains namespace and project ids' do
...@@ -104,8 +105,18 @@ RSpec.describe Gitlab::Tracking::StandardContext do ...@@ -104,8 +105,18 @@ RSpec.describe Gitlab::Tracking::StandardContext do
stub_feature_flags(add_namespace_and_project_to_snowplow_tracking: false) stub_feature_flags(add_namespace_and_project_to_snowplow_tracking: false)
end end
it 'does not contain any ids' do it 'does not contain project or namespace ids' do
expect(snowplow_context.to_json[:data].keys).not_to include(:user_id, :project_id, :namespace_id) expect(snowplow_context.to_json[:data].keys).not_to include(:project_id, :namespace_id)
end
end
context 'without add_actor_based_user_to_snowplow_tracking feature' do
before do
stub_feature_flags(add_actor_based_user_to_snowplow_tracking: false)
end
it 'does not contain user_id' do
expect(snowplow_context.to_json[:data].keys).not_to include(:user_id)
end end
end end
end end
......
...@@ -48,7 +48,7 @@ RSpec.describe Gitlab::Tracking do ...@@ -48,7 +48,7 @@ RSpec.describe Gitlab::Tracking do
other_context = double(:context) other_context = double(:context)
project = build_stubbed(:project) project = build_stubbed(:project)
user = double(:user) user = build_stubbed(:user)
expect(Gitlab::Tracking::StandardContext) expect(Gitlab::Tracking::StandardContext)
.to receive(:new) .to receive(:new)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment