From f125b2acd4d03256294ee966a61cdfdf94e64a02 Mon Sep 17 00:00:00 2001
From: Patrick Bajao <ebajao@gitlab.com>
Date: Wed, 24 Feb 2021 20:02:44 +0800
Subject: [PATCH 1/2] Add tracking to merge request time estimate/spent changes

We need to track how many users change the time estimate and spent
for MRs.

To get that, whenever the time estimate and spent changes for
a merge request, we track the following events:
- i_code_review_user_time_estimate_changed
- i_code_review_user_time_spent_changed
---
 app/services/merge_requests/update_service.rb   |  7 +++++++
 .../unreleased/292824-track-mr-time-changes.yml |  5 +++++
 ...i_code_review_user_time_estimate_changed.yml |  8 ++++++++
 ...ta_i_code_review_user_time_spent_changed.yml |  8 ++++++++
 .../aggregated_metrics/code_review.yml          |  8 ++++++--
 .../known_events/code_review_events.yml         | 10 ++++++++++
 .../merge_request_activity_unique_counter.rb    | 10 ++++++++++
 ...erge_request_activity_unique_counter_spec.rb | 16 ++++++++++++++++
 .../merge_requests/update_service_spec.rb       | 17 +++++++++++++++++
 9 files changed, 87 insertions(+), 2 deletions(-)
 create mode 100644 changelogs/unreleased/292824-track-mr-time-changes.yml
 create mode 100644 config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml
 create mode 100644 config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml

diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 217679e733c354..4bc7823faaadcf 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -31,6 +31,7 @@ def handle_changes(merge_request, options)
       old_mentioned_users = old_associations.fetch(:mentioned_users, [])
       old_assignees = old_associations.fetch(:assignees, [])
       old_reviewers = old_associations.fetch(:reviewers, [])
+      old_timelogs = old_associations.fetch(:timelogs, [])
       changed_fields = merge_request.previous_changes.keys
 
       resolve_todos(merge_request, old_labels, old_assignees, old_reviewers)
@@ -48,6 +49,7 @@ def handle_changes(merge_request, options)
 
       track_title_and_desc_edits(changed_fields)
       track_discussion_lock_toggle(merge_request, changed_fields)
+      track_time_estimate_and_spend_edits(merge_request, old_timelogs, changed_fields)
 
       notify_if_labels_added(merge_request, old_labels)
       notify_if_mentions_added(merge_request, old_mentioned_users)
@@ -106,6 +108,11 @@ def track_discussion_lock_toggle(merge_request, changed_fields)
       end
     end
 
+    def track_time_estimate_and_spend_edits(merge_request, old_timelogs, changed_fields)
+      merge_request_activity_counter.track_time_estimate_changed_action(user: current_user) if changed_fields.include?('time_estimate')
+      merge_request_activity_counter.track_time_spent_changed_action(user: current_user) if old_timelogs != merge_request.timelogs
+    end
+
     def notify_if_labels_added(merge_request, old_labels)
       added_labels = merge_request.labels - old_labels
 
diff --git a/changelogs/unreleased/292824-track-mr-time-changes.yml b/changelogs/unreleased/292824-track-mr-time-changes.yml
new file mode 100644
index 00000000000000..89721e8f8c5c88
--- /dev/null
+++ b/changelogs/unreleased/292824-track-mr-time-changes.yml
@@ -0,0 +1,5 @@
+---
+title: Add tracking to merge request time estimate/spent changes
+merge_request: 55046
+author:
+type: other
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml
new file mode 100644
index 00000000000000..81096288a8de4d
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_time_estimate_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_time_estimate_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml b/config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml
new file mode 100644
index 00000000000000..56329f6b48b768
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_time_spent_changed.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_time_spent_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+rollout_issue_url:
+milestone: '13.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml b/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml
index c856d0a5eeebf7..f19de8504901d5 100644
--- a/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml
+++ b/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml
@@ -44,7 +44,9 @@
     'i_code_review_user_toggled_task_item_status',
     'i_code_review_user_create_mr_from_issue',
     'i_code_review_user_mr_discussion_locked',
-    'i_code_review_user_mr_discussion_unlocked'
+    'i_code_review_user_mr_discussion_unlocked',
+    'i_code_review_user_time_estimate_changed',
+    'i_code_review_user_time_spent_changed'
   ]
 - name: code_review_category_monthly_active_users
   operator: OR
@@ -82,7 +84,9 @@
     'i_code_review_user_toggled_task_item_status',
     'i_code_review_user_create_mr_from_issue',
     'i_code_review_user_mr_discussion_locked',
-    'i_code_review_user_mr_discussion_unlocked'
+    'i_code_review_user_mr_discussion_unlocked',
+    'i_code_review_user_time_estimate_changed',
+    'i_code_review_user_time_spent_changed'
   ]
 - name: code_review_extension_category_monthly_active_users
   operator: OR
diff --git a/lib/gitlab/usage_data_counters/known_events/code_review_events.yml b/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
index 21613740142ce2..83a932456f9348 100644
--- a/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
@@ -174,3 +174,13 @@
   category: code_review
   aggregation: weekly
   feature_flag: usage_data_i_code_review_user_mr_discussion_unlocked
+- name: i_code_review_user_time_estimate_changed
+  redis_slot: code_review
+  category: code_review
+  aggregation: weekly
+  feature_flag: usage_data_i_code_review_user_time_estimate_changed
+- name: i_code_review_user_time_spent_changed
+  redis_slot: code_review
+  category: code_review
+  aggregation: weekly
+  feature_flag: usage_data_i_code_review_user_time_spent_changed
diff --git a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
index b94caa32bf7f55..daa4c34ae1f6e9 100644
--- a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
@@ -37,6 +37,8 @@ module MergeRequestActivityUniqueCounter
       MR_CREATE_FROM_ISSUE_ACTION = 'i_code_review_user_create_mr_from_issue'
       MR_DISCUSSION_LOCKED_ACTION = 'i_code_review_user_mr_discussion_locked'
       MR_DISCUSSION_UNLOCKED_ACTION = 'i_code_review_user_mr_discussion_unlocked'
+      MR_TIME_ESTIMATE_CHANGED_ACTION = 'i_code_review_user_time_estimate_changed'
+      MR_TIME_SPENT_CHANGED_ACTION = 'i_code_review_user_time_spent_changed'
 
       class << self
         def track_mr_diffs_action(merge_request:)
@@ -163,6 +165,14 @@ def track_discussion_unlocked_action(user:)
           track_unique_action_by_user(MR_DISCUSSION_UNLOCKED_ACTION, user)
         end
 
+        def track_time_estimate_changed_action(user:)
+          track_unique_action_by_user(MR_TIME_ESTIMATE_CHANGED_ACTION, user)
+        end
+
+        def track_time_spent_changed_action(user:)
+          track_unique_action_by_user(MR_TIME_SPENT_CHANGED_ACTION, user)
+        end
+
         private
 
         def track_unique_action_by_merge_request(action, merge_request)
diff --git a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
index 6bc42430889883..d740e19ae7b81f 100644
--- a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
@@ -300,4 +300,20 @@
       let(:action) { described_class::MR_DISCUSSION_UNLOCKED_ACTION }
     end
   end
+
+  describe '.track_time_estimate_changed_action' do
+    subject { described_class.track_time_estimate_changed_action(user: user) }
+
+    it_behaves_like 'a tracked merge request unique event' do
+      let(:action) { described_class::MR_TIME_ESTIMATE_CHANGED_ACTION }
+    end
+  end
+
+  describe '.track_time_spent_changed_action' do
+    subject { described_class.track_time_spent_changed_action(user: user) }
+
+    it_behaves_like 'a tracked merge request unique event' do
+      let(:action) { described_class::MR_TIME_SPENT_CHANGED_ACTION }
+    end
+  end
 end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index e9ec3bccda3fd1..30d94a2e948e17 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -169,6 +169,23 @@ def update_merge_request(opts)
             end
           end
         end
+
+        it 'tracks time estimate and spend time changes' do
+          expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+            .to receive(:track_time_estimate_changed_action).once.with(user: user)
+
+          expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
+            .to receive(:track_time_spent_changed_action).once.with(user: user)
+
+          opts[:time_estimate] = 86400
+          opts[:spend_time] = {
+            duration: 3600,
+            user_id: user.id,
+            spent_at: Date.parse('2021-02-24')
+          }
+
+          MergeRequests::UpdateService.new(project, user, opts).execute(merge_request)
+        end
       end
 
       context 'updating milestone' do
-- 
GitLab


From ab9c269d339d7937624fdd776ec2a403b9ed23f6 Mon Sep 17 00:00:00 2001
From: Patrick Bajao <ebajao@gitlab.com>
Date: Tue, 2 Mar 2021 18:38:54 +0800
Subject: [PATCH 2/2] Update usage ping dictionary

Use the generators to generate the metric YAML files and to update
the dictionary.
---
 ...iew_user_time_estimate_changed_monthly.yml | 20 +++++
 ...review_user_time_spent_changed_monthly.yml | 20 +++++
 ...view_user_time_estimate_changed_weekly.yml | 20 +++++
 ..._review_user_time_spent_changed_weekly.yml | 20 +++++
 doc/development/usage_ping/dictionary.md      | 80 +++++++++++++++++++
 5 files changed, 160 insertions(+)
 create mode 100644 config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
 create mode 100644 config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
 create mode 100644 config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
 create mode 100644 config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml

diff --git a/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml b/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
new file mode 100644
index 00000000000000..69ad9237f0db6f
--- /dev/null
+++ b/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly
+description: Count of unique users per month who changed time estimate of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml b/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
new file mode 100644
index 00000000000000..36972b7e1681c7
--- /dev/null
+++ b/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly
+description: Count of unique users per month who changed time spent on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml b/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
new file mode 100644
index 00000000000000..fb47deaba92e3c
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly
+description: Count of unique users per week who changed time estimate of a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml b/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml
new file mode 100644
index 00000000000000..91c88c00af8906
--- /dev/null
+++ b/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly
+description: Count of unique users per week who changed time spent on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: implemented
+milestone: "13.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/doc/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md
index 93ce26fceb535a..c244ebb0057348 100644
--- a/doc/development/usage_ping/dictionary.md
+++ b/doc/development/usage_ping/dictionary.md
@@ -13730,6 +13730,86 @@ Count of unique users per week|month with diffs viewed file by file
 | `tier` |  |
 | `skip_validation` | true |
 
+## `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly`
+
+Count of unique users per month who changed time estimate of a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | implemented |
+| `milestone` | 13.10 |
+| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046) |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly`
+
+Count of unique users per week who changed time estimate of a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | implemented |
+| `milestone` | 13.10 |
+| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046) |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly`
+
+Count of unique users per month who changed time spent on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | implemented |
+| `milestone` | 13.10 |
+| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046) |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly`
+
+Count of unique users per week who changed time spent on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | implemented |
+| `milestone` | 13.10 |
+| `introduced_by_url` | [Introduced by](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55046) |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
 ## `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly`
 
 Missing description
-- 
GitLab