diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb index 2ab4bb47462497dac780c190491d62a53d721df7..019246dfc9f36afe687620c9258ef41e899ef6e4 100644 --- a/app/services/event_create_service.rb +++ b/app/services/event_create_service.rb @@ -25,14 +25,18 @@ def reopen_issue(issue, current_user) def open_mr(merge_request, current_user) create_record_event(merge_request, current_user, :created).tap do track_event(event_action: :created, event_target: MergeRequest, author_id: current_user.id) - track_mr_snowplow_event(merge_request, current_user, :create) + track_snowplow_event(merge_request, current_user, + Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION, + :create, 'merge_requests_users') end end def close_mr(merge_request, current_user) create_record_event(merge_request, current_user, :closed).tap do track_event(event_action: :closed, event_target: MergeRequest, author_id: current_user.id) - track_mr_snowplow_event(merge_request, current_user, :close) + track_snowplow_event(merge_request, current_user, + Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION, + :close, 'merge_requests_users') end end @@ -43,7 +47,9 @@ def reopen_mr(merge_request, current_user) def merge_mr(merge_request, current_user) create_record_event(merge_request, current_user, :merged).tap do track_event(event_action: :merged, event_target: MergeRequest, author_id: current_user.id) - track_mr_snowplow_event(merge_request, current_user, :merge) + track_snowplow_event(merge_request, current_user, + Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION, + :merge, 'merge_requests_users') end end @@ -67,7 +73,9 @@ def leave_note(note, current_user) create_record_event(note, current_user, :commented).tap do if note.is_a?(DiffNote) && note.for_merge_request? track_event(event_action: :commented, event_target: MergeRequest, author_id: current_user.id) - track_mr_snowplow_event(note, current_user, :comment) + track_snowplow_event(note, current_user, + Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION, + :comment, 'merge_requests_users') end end end @@ -100,12 +108,27 @@ def save_designs(current_user, create: [], update: []) records = create.zip([:created].cycle) + update.zip([:updated].cycle) return [] if records.empty? + if create.any? + track_snowplow_event(create.first, current_user, + Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION, + :create, 'design_users') + end + + if update.any? + track_snowplow_event(update.first, current_user, + Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION, + :update, 'design_users') + end + create_record_events(records, current_user) end def destroy_designs(designs, current_user) return [] unless designs.present? + track_snowplow_event(designs.first, current_user, + Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION, + :destroy, 'design_users') create_record_events(designs.zip([:destroyed].cycle), current_user) end @@ -230,14 +253,14 @@ def track_event(**params) Gitlab::UsageDataCounters::TrackUniqueEvents.track_event(**params) end - def track_mr_snowplow_event(record, current_user, action) + def track_snowplow_event(record, current_user, category, action, label) return unless Feature.enabled?(:route_hll_to_snowplow_phase2) project = record.project Gitlab::Tracking.event( - Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION.to_s, + category.to_s, action.to_s, - label: 'merge_requests_users', + label: label, project: project, namespace: project.namespace, user: current_user diff --git a/config/events/1655179428_design_actions_create_.yml b/config/events/1655179428_design_actions_create_.yml new file mode 100644 index 0000000000000000000000000000000000000000..25e03a08a7a9bf89cab68d291801fd454cc7f3d1 --- /dev/null +++ b/config/events/1655179428_design_actions_create_.yml @@ -0,0 +1,25 @@ +--- +description: Triggered from backend layer when design is created +category: design_actions +action: create +label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management +property_description: +value_description: +extra_properties: +identifiers: +- project +- user +- namespace +product_section: dev +product_stage: plan +product_group: group::product_planning +product_category: design_management +milestone: "15.1" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/config/events/1655179485_design_actions_update_.yml b/config/events/1655179485_design_actions_update_.yml new file mode 100644 index 0000000000000000000000000000000000000000..7648e51f0ae676ef6878f013f6829dee5ddea25b --- /dev/null +++ b/config/events/1655179485_design_actions_update_.yml @@ -0,0 +1,25 @@ +--- +description: Triggered from backend layer when design is updated +category: design_actions +action: update +label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management +property_description: +value_description: +extra_properties: +identifiers: +- project +- user +- namespace +product_section: dev +product_stage: plan +product_group: group::product_planning +product_category: design_management +milestone: "15.1" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/config/events/1655179517_design_actions_destroy_.yml b/config/events/1655179517_design_actions_destroy_.yml new file mode 100644 index 0000000000000000000000000000000000000000..fd75f698e5e7ade7c5dbb6ff7b878ebd234617d7 --- /dev/null +++ b/config/events/1655179517_design_actions_destroy_.yml @@ -0,0 +1,25 @@ +--- +description: Triggered from backend layer when design is deleted +category: design_actions +action: destroy +label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management +property_description: +value_description: +extra_properties: +identifiers: +- project +- user +- namespace +product_section: dev +product_stage: plan +product_group: group::product_planning +product_category: design_management +milestone: "15.1" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/spec/graphql/mutations/design_management/delete_spec.rb b/spec/graphql/mutations/design_management/delete_spec.rb index 93fff5e5103a402ce9066fe9f7d3918dbadd65fc..79196d4965d6af7177cc64ddf3471fd7c9d0a407 100644 --- a/spec/graphql/mutations/design_management/delete_spec.rb +++ b/spec/graphql/mutations/design_management/delete_spec.rb @@ -86,9 +86,11 @@ def run_mutation end end - it 'runs no more than 29 queries' do + it 'runs no more than 30 queries' do + allow(Gitlab::Tracking).to receive(:event) # rubocop:disable RSpec/ExpectGitlabTracking + filenames.each(&:present?) # ignore setup - # Queries: as of 2021-07-22 + # Queries: as of 2022-06-15 # ------------- # 01. routing query # 02. find project by id @@ -106,20 +108,21 @@ def run_mutation # 15. current designs by filename and issue # 16, 17 project.authorizations for user (same query as 5) # 18. find route by id and source_type + # 19. find plan for standard context # ------------- our queries are below: - # 19. start transaction 1 - # 20. start transaction 2 - # 21. find version by sha and issue - # 22. exists version with sha and issue? - # 23. leave transaction 2 - # 24. create version with sha and issue - # 25. create design-version links - # 26. validate version.actions.present? - # 27. validate version.issue.present? - # 28. validate version.sha is unique - # 29. leave transaction 1 + # 20. start transaction 1 + # 21. start transaction 2 + # 22. find version by sha and issue + # 23. exists version with sha and issue? + # 24. leave transaction 2 + # 25. create version with sha and issue + # 26. create design-version links + # 27. validate version.actions.present? + # 28. validate version.issue.present? + # 29. validate version.sha is unique + # 30. leave transaction 1 # - expect { run_mutation }.not_to exceed_query_limit(29) + expect { run_mutation }.not_to exceed_query_limit(30) end end diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb index 56da85cc4a0b3daeb4395c50a1fa2da487ebedcb..e66b413a5c9517e5a3a2e6e28f889caf837e72b4 100644 --- a/spec/services/event_create_service_spec.rb +++ b/spec/services/event_create_service_spec.rb @@ -379,10 +379,14 @@ def create_event end end - describe 'design events' do + describe 'design events', :snowplow do let_it_be(:design) { create(:design, project: project) } let_it_be(:author) { user } + before do + allow(Gitlab::Tracking).to receive(:event) # rubocop:disable RSpec/ExpectGitlabTracking + end + describe '#save_designs' do let_it_be(:updated) { create_list(:design, 5) } let_it_be(:created) { create_list(:design, 3) } @@ -411,6 +415,44 @@ def create_event it_behaves_like "it records the event in the event counter" do let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION } end + + it 'records correct create payload with Snowplow event' do + service.save_designs(author, create: [design]) + + expect_snowplow_event( + category: Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s, + action: 'create', + namespace: design.project.namespace, + user: author, + project: design.project, + label: 'design_users' + ) + end + + it 'records correct update payload with Snowplow event' do + service.save_designs(author, update: [design]) + + expect_snowplow_event( + category: Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s, + action: 'update', + namespace: design.project.namespace, + user: author, + project: design.project, + label: 'design_users' + ) + end + + context 'when FF is disabled' do + before do + stub_feature_flags(route_hll_to_snowplow_phase2: false) + end + + it 'doesnt emit snowwplow events', :snowplow do + subject + + expect_no_snowplow_event + end + end end describe '#destroy_designs' do @@ -434,6 +476,31 @@ def create_event it_behaves_like "it records the event in the event counter" do let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION } end + + it 'records correct payload with Snowplow event' do + service.destroy_designs([design], author) + + expect_snowplow_event( + category: Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s, + action: 'destroy', + namespace: design.project.namespace, + user: author, + project: design.project, + label: 'design_users' + ) + end + + context 'when FF is disabled' do + before do + stub_feature_flags(route_hll_to_snowplow_phase2: false) + end + + it 'doesnt emit snowwplow events', :snowplow do + subject + + expect_no_snowplow_event + end + end end end