diff --git a/app/assets/javascripts/tracking.js b/app/assets/javascripts/tracking.js index 7c0097fbe371e774d9ac396d51f8b054ba206b51..2566c0fb273006d639c43c051ba936c7b782a1b3 100644 --- a/app/assets/javascripts/tracking.js +++ b/app/assets/javascripts/tracking.js @@ -102,6 +102,7 @@ export function initUserTracking() { window.snowplow('enableActivityTracking', 30, 30); window.snowplow('trackPageView'); // must be after enableActivityTracking + if (opts.userId) window.snowplow('setUserId', opts.userId); if (opts.formTracking) window.snowplow('enableFormTracking'); if (opts.linkClickTracking) window.snowplow('enableLinkClickTracking'); diff --git a/app/views/layouts/_snowplow.html.haml b/app/views/layouts/_snowplow.html.haml index d7ff5ad109411964e57cc4c988bbe11d8a1c1e56..3c06bca0f95c2f1fd86ca76598339225b9b23821 100644 --- a/app/views/layouts/_snowplow.html.haml +++ b/app/views/layouts/_snowplow.html.haml @@ -7,4 +7,4 @@ };p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1; n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,"script","#{asset_url('snowplow/sp.js')}","snowplow")); - window.snowplowOptions = #{Gitlab::Tracking.snowplow_options(@group).to_json} + window.snowplowOptions = #{Gitlab::Tracking.snowplow_options(@group, current_user).to_json} diff --git a/lib/gitlab/tracking.rb b/lib/gitlab/tracking.rb index 2470685bc00ac3857552d1a8f2a616aee658fb8e..d254d64dad2eafae21805fc027ea78d77955d614 100644 --- a/lib/gitlab/tracking.rb +++ b/lib/gitlab/tracking.rb @@ -39,7 +39,7 @@ def self_describing_event(schema_url, event_data_json, context: nil) snowplow.track_self_describing_event(event_json, context, Time.now.to_i) end - def snowplow_options(group) + def snowplow_options(group, user) additional_features = Feature.enabled?(:additional_snowplow_tracking, group) { namespace: SNOWPLOW_NAMESPACE, @@ -47,7 +47,8 @@ def snowplow_options(group) cookie_domain: Gitlab::CurrentSettings.snowplow_cookie_domain, app_id: Gitlab::CurrentSettings.snowplow_site_id, form_tracking: additional_features, - link_click_tracking: additional_features + link_click_tracking: additional_features, + user_id: user&.id }.transform_keys! { |key| key.to_s.camelize(:lower).to_sym } end diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js index 964f8b8787e08e85ec86870e19aa33ba5077e355..d9cc71041394d9dd766f52de3e908707d3dfc154 100644 --- a/spec/frontend/tracking_spec.js +++ b/spec/frontend/tracking_spec.js @@ -11,6 +11,7 @@ describe('Tracking', () => { namespace: '_namespace_', hostname: 'app.gitfoo.com', cookieDomain: '.gitfoo.com', + userId: null, }; snowplowSpy = jest.spyOn(window, 'snowplow'); }); @@ -34,6 +35,7 @@ describe('Tracking', () => { contexts: { webPage: true }, formTracking: false, linkClickTracking: false, + userId: null, }); }); @@ -41,15 +43,18 @@ describe('Tracking', () => { initUserTracking(); expect(snowplowSpy).toHaveBeenCalledWith('enableActivityTracking', 30, 30); expect(snowplowSpy).toHaveBeenCalledWith('trackPageView'); + expect(snowplowSpy).not.toHaveBeenCalledWith('setUserId'); expect(snowplowSpy).not.toHaveBeenCalledWith('enableFormTracking'); expect(snowplowSpy).not.toHaveBeenCalledWith('enableLinkClickTracking'); window.snowplowOptions = Object.assign({}, window.snowplowOptions, { formTracking: true, linkClickTracking: true, + userId: '1', }); initUserTracking(); + expect(snowplowSpy).toHaveBeenCalledWith('setUserId', '1'); expect(snowplowSpy).toHaveBeenCalledWith('enableFormTracking'); expect(snowplowSpy).toHaveBeenCalledWith('enableLinkClickTracking'); }); diff --git a/spec/lib/gitlab/tracking_spec.rb b/spec/lib/gitlab/tracking_spec.rb index 50488dba48c82d6d4c12522efacbfa84736510a2..4615599be7e70170640af1bf370f915f0b5da3a3 100644 --- a/spec/lib/gitlab/tracking_spec.rb +++ b/spec/lib/gitlab/tracking_spec.rb @@ -13,14 +13,17 @@ describe '.snowplow_options' do it 'returns useful client options' do - expect(described_class.snowplow_options(nil)).to eq( + expected_fields = { namespace: 'gl', hostname: 'gitfoo.com', cookieDomain: '.gitfoo.com', appId: '_abc123_', formTracking: true, - linkClickTracking: true - ) + linkClickTracking: true, + userId: nil + } + + expect(subject.snowplow_options(nil, nil)).to match(expected_fields) end it 'enables features using feature flags' do @@ -29,11 +32,12 @@ :additional_snowplow_tracking, '_group_' ).and_return(false) - - expect(described_class.snowplow_options('_group_')).to include( + addition_feature_fields = { formTracking: false, linkClickTracking: false - ) + } + + expect(subject.snowplow_options('_group_', nil)).to include(addition_feature_fields) end end