From b8c80678af5e57d359b5568cfe829fb711df7691 Mon Sep 17 00:00:00 2001
From: Piotr Skorupa <pskorupa@gitlab.com>
Date: Tue, 10 Jan 2023 20:54:05 +0100
Subject: [PATCH] Migrate commit_comment metric to Snowplow

---
 app/services/notes/create_service.rb          | 14 +++++++++
 ...s__CreateService_create_commit_comment.yml | 26 +++++++++++++++++
 spec/services/notes/create_service_spec.rb    | 29 +++++++++++++++++++
 .../snowplow_event_tracking_examples.rb       |  9 ++++++
 4 files changed, 78 insertions(+)
 create mode 100644 config/events/1671588492_Notes__CreateService_create_commit_comment.yml

diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index 5f05b61328826..49817be4f6528 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -167,6 +167,20 @@ def track_event(note, user)
       if Feature.enabled?(:notes_create_service_tracking, project)
         Gitlab::Tracking.event('Notes::CreateService', 'execute', **tracking_data_for(note))
       end
+
+      if Feature.enabled?(:route_hll_to_snowplow_phase4, project&.namespace) && note.for_commit?
+        metric_key_path = 'counts.commit_comment'
+
+        Gitlab::Tracking.event(
+          'Notes::CreateService',
+          'create_commit_comment',
+          project: project,
+          namespace: project&.namespace,
+          user: user,
+          label: metric_key_path,
+          context: [Gitlab::Tracking::ServicePingContext.new(data_source: :redis, key_path: metric_key_path).to_context]
+        )
+      end
     end
 
     def tracking_data_for(note)
diff --git a/config/events/1671588492_Notes__CreateService_create_commit_comment.yml b/config/events/1671588492_Notes__CreateService_create_commit_comment.yml
new file mode 100644
index 0000000000000..cf2cc2c5b1cbb
--- /dev/null
+++ b/config/events/1671588492_Notes__CreateService_create_commit_comment.yml
@@ -0,0 +1,26 @@
+---
+description: Mirrored `counts.commit_comment` Service Ping metric as a Snowplow event. Emitted when a note for a commit is created.
+category: Notes::CreateService
+action: create_commit_comment
+label_description: Mirrored Service Ping metric key path
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section:
+product_stage:
+product_group:
+product_category:
+milestone: "15.8"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105148
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
+
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index 22606cc2461d2..17ef8a85c2b20 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -116,6 +116,35 @@
         end
       end
 
+      context 'in a commit', :snowplow do
+        let_it_be(:commit) { create(:commit, project: project) }
+        let(:opts) { { note: 'Awesome comment', noteable_type: 'Commit', commit_id: commit.id } }
+
+        let(:counter) { Gitlab::UsageDataCounters::NoteCounter }
+
+        let(:execute_create_service) { described_class.new(project, user, opts).execute }
+
+        before do
+          stub_feature_flags(notes_create_service_tracking: false)
+        end
+
+        it 'tracks commit comment usage data', :clean_gitlab_redis_shared_state do
+          expect(counter).to receive(:count).with(:create, 'Commit').and_call_original
+
+          expect do
+            execute_create_service
+          end.to change { counter.read(:create, 'Commit') }.by(1)
+        end
+
+        it_behaves_like 'Snowplow event tracking with Redis context' do
+          let(:category) { described_class.name }
+          let(:action) { 'create_commit_comment' }
+          let(:label) { 'counts.commit_comment' }
+          let(:namespace) { project.namespace }
+          let(:feature_flag_name) { :route_hll_to_snowplow_phase4 }
+        end
+      end
+
       describe 'event tracking', :snowplow do
         let(:event) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_COMMENT_ADDED }
         let(:execute_create_service) { described_class.new(project, user, opts).execute }
diff --git a/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
index 7e99066110d51..ba00e3e06105f 100644
--- a/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
+++ b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
@@ -52,3 +52,12 @@
     end
   end
 end
+
+RSpec.shared_examples 'Snowplow event tracking with Redis context' do |overrides: {}|
+  it_behaves_like 'Snowplow event tracking', overrides: overrides do
+    let(:context) do
+      key_path = try(:label) || action
+      [Gitlab::Tracking::ServicePingContext.new(data_source: :redis, key_path: key_path).to_context.to_json]
+    end
+  end
+end
-- 
GitLab