Commit 9b22d9bf authored by Etienne Baqué's avatar Etienne Baqué

Merge branch '329785-epic-metrics' into 'master'

Track checking epic tasks on usage data [RUN AS-IF-FOSS]

See merge request gitlab-org/gitlab!60846
parents 4e35fa87 c4300145
...@@ -1100,6 +1100,54 @@ Status: `data_available` ...@@ -1100,6 +1100,54 @@ Status: `data_available`
Tiers: `free` Tiers: `free`
### `counts.g_project_management_users_checking_epic_task_monthly`
Counts of MAU checking epic task
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210421080207_g_project_management_users_checking_epic_task_monthly.yml)
Group: `group::product planning`
Status: `implemented`
Tiers: `premium`, `ultimate`
### `counts.g_project_management_users_checking_epic_task_weekly`
Counts of WAU checking epic task
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210421075943_g_project_management_users_checking_epic_task_weekly.yml)
Group: `group::product planning`
Status: `implemented`
Tiers: `premium`, `ultimate`
### `counts.g_project_management_users_unchecking_epic_task_monthly`
Counts of MAU unchecking epic task
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210421102516_g_project_management_users_unchecking_epic_task_monthly.yml)
Group: `group::product planning`
Status: `implemented`
Tiers: `premium`, `ultimate`
### `counts.g_project_management_users_unchecking_epic_task_weekly`
Counts of WAU unchecking epic task
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210421102812_g_project_management_users_unchecking_epic_task_weekly.yml)
Group: `group::product planning`
Status: `implemented`
Tiers: `premium`, `ultimate`
### `counts.geo_event_log_max_id` ### `counts.geo_event_log_max_id`
Number of replication events on a Geo primary Number of replication events on a Geo primary
......
...@@ -135,6 +135,19 @@ module Epics ...@@ -135,6 +135,19 @@ module Epics
if epic.saved_change_to_attribute?(:description) if epic.saved_change_to_attribute?(:description)
::Gitlab::UsageDataCounters::EpicActivityUniqueCounter.track_epic_description_changed_action(author: current_user) ::Gitlab::UsageDataCounters::EpicActivityUniqueCounter.track_epic_description_changed_action(author: current_user)
track_task_changes(epic)
end
end
def track_task_changes(epic)
return if epic.updated_tasks.blank?
epic.updated_tasks.each do |task|
if task.complete?
Gitlab::UsageDataCounters::EpicActivityUniqueCounter.track_epic_task_checked(author: current_user)
else
Gitlab::UsageDataCounters::EpicActivityUniqueCounter.track_epic_task_unchecked(author: current_user)
end
end end
end end
end end
......
---
title: Track checking/unchecking tasks on epics
merge_request: 60846
author:
type: added
---
# Name of this metric contains g_project_management prefix
# because we are using the same slot from issue_tracking to
# allow data aggregation.
key_path: counts.g_project_management_users_checking_epic_task_monthly
description: Counts of MAU checking epic task
product_section: dev
product_stage: plan
product_group: group::product planning
product_category: epics
value_type: number
status: implemented
milestone: "13.12"
introduced_by_url:
time_frame: 28d
data_source: redis_hll
distribution:
- ee
tier:
- premium
- ultimate
\ No newline at end of file
---
# Name of this metric contains g_project_management prefix
# because we are using the same slot from issue_tracking to
# allow data aggregation.
key_path: counts.g_project_management_users_unchecking_epic_task_monthly
description: Counts of MAU unchecking epic task
product_section: dev
product_stage: plan
product_group: group::product planning
product_category: epics
value_type: number
status: implemented
milestone: "13.12"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59871
time_frame: 28d
data_source: redis_hll
distribution:
- ee
tier:
- premium
- ultimate
\ No newline at end of file
---
# Name of this metric contains g_project_management prefix
# because we are using the same slot from issue_tracking to
# allow data aggregation.
key_path: counts.g_project_management_users_checking_epic_task_weekly
description: Counts of WAU checking epic task
product_section: dev
product_stage: plan
product_group: group::product planning
product_category: epics
value_type: number
status: implemented
milestone: "13.12"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59871
time_frame: 7d
data_source: redis_hll
distribution:
- ee
tier:
- premium
- ultimate
\ No newline at end of file
---
# Name of this metric contains g_project_management prefix
# because we are using the same slot from issue_tracking to
# allow data aggregation.
key_path: counts.g_project_management_users_unchecking_epic_task_weekly
description: Counts of WAU unchecking epic task
product_section: dev
product_stage: plan
product_group: group::product planning
product_category: epics
value_type: number
status: implemented
milestone: "13.12"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59871
time_frame: 7d
data_source: redis_hll
distribution:
- ee
tier:
- premium
- ultimate
...@@ -29,6 +29,8 @@ module Gitlab ...@@ -29,6 +29,8 @@ module Gitlab
EPIC_VISIBLE = 'g_project_management_users_setting_epic_visible' EPIC_VISIBLE = 'g_project_management_users_setting_epic_visible'
EPIC_LABELS = 'g_project_management_epic_users_changing_labels' EPIC_LABELS = 'g_project_management_epic_users_changing_labels'
EPIC_DESTROYED = 'g_project_management_epic_destroyed' EPIC_DESTROYED = 'g_project_management_epic_destroyed'
EPIC_TASK_CHECKED = 'project_management_users_checking_epic_task'
EPIC_TASK_UNCHECKED = 'project_management_users_unchecking_epic_task'
class << self class << self
def track_epic_created_action(author:) def track_epic_created_action(author:)
...@@ -119,6 +121,14 @@ module Gitlab ...@@ -119,6 +121,14 @@ module Gitlab
track_unique_action(EPIC_DESTROYED, author) track_unique_action(EPIC_DESTROYED, author)
end end
def track_epic_task_checked(author:)
track_unique_action(EPIC_TASK_CHECKED, author)
end
def track_epic_task_unchecked(author:)
track_unique_action(EPIC_TASK_UNCHECKED, author)
end
private private
def track_unique_action(action, author) def track_unique_action(action, author)
......
...@@ -269,4 +269,28 @@ RSpec.describe Gitlab::UsageDataCounters::EpicActivityUniqueCounter, :clean_gitl ...@@ -269,4 +269,28 @@ RSpec.describe Gitlab::UsageDataCounters::EpicActivityUniqueCounter, :clean_gitl
it_behaves_like 'does not track when feature flag is disabled', :track_epics_activity it_behaves_like 'does not track when feature flag is disabled', :track_epics_activity
end end
context 'for margin epic task as checked' do
def track_action(params)
described_class.track_epic_task_checked(**params)
end
it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::EPIC_TASK_CHECKED }
end
it_behaves_like 'does not track when feature flag is disabled', :track_epics_activity
end
context 'for margin epic task as unchecked' do
def track_action(params)
described_class.track_epic_task_unchecked(**params)
end
it_behaves_like 'a daily tracked issuable event' do
let(:action) { described_class::EPIC_TASK_UNCHECKED }
end
it_behaves_like 'does not track when feature flag is disabled', :track_epics_activity
end
end end
...@@ -317,7 +317,7 @@ RSpec.describe Epics::UpdateService do ...@@ -317,7 +317,7 @@ RSpec.describe Epics::UpdateService do
context 'when Epic has tasks' do context 'when Epic has tasks' do
before do before do
update_epic({ description: "- [ ] Task 1\n- [ ] Task 2" }) update_epic(description: "- [ ] Task 1\n- [ ] Task 2")
end end
it { expect(epic.tasks?).to eq(true) } it { expect(epic.tasks?).to eq(true) }
...@@ -329,11 +329,9 @@ RSpec.describe Epics::UpdateService do ...@@ -329,11 +329,9 @@ RSpec.describe Epics::UpdateService do
end end
context 'when tasks are marked as completed' do context 'when tasks are marked as completed' do
before do
update_epic({ description: "- [x] Task 1\n- [X] Task 2" })
end
it 'creates system note about task status change' do it 'creates system note about task status change' do
update_epic(description: "- [x] Task 1\n- [X] Task 2")
note1 = find_note('marked the task **Task 1** as completed') note1 = find_note('marked the task **Task 1** as completed')
note2 = find_note('marked the task **Task 2** as completed') note2 = find_note('marked the task **Task 2** as completed')
...@@ -343,15 +341,23 @@ RSpec.describe Epics::UpdateService do ...@@ -343,15 +341,23 @@ RSpec.describe Epics::UpdateService do
description_notes = find_notes('description') description_notes = find_notes('description')
expect(description_notes.length).to eq(1) expect(description_notes.length).to eq(1)
end end
it 'counts the change correctly' do
expect(Gitlab::UsageDataCounters::EpicActivityUniqueCounter).to receive(:track_epic_task_checked)
.with(author: user).twice
update_epic(description: "- [x] Task 1\n- [X] Task 2")
end
end end
context 'when tasks are marked as incomplete' do context 'when tasks are marked as incomplete' do
before do before do
update_epic({ description: "- [x] Task 1\n- [X] Task 2" }) update_epic(description: "- [x] Task 1\n- [X] Task 2")
update_epic({ description: "- [ ] Task 1\n- [ ] Task 2" })
end end
it 'creates system note about task status change' do it 'creates system note about task status change' do
update_epic(description: "- [ ] Task 1\n- [ ] Task 2")
note1 = find_note('marked the task **Task 1** as incomplete') note1 = find_note('marked the task **Task 1** as incomplete')
note2 = find_note('marked the task **Task 2** as incomplete') note2 = find_note('marked the task **Task 2** as incomplete')
...@@ -361,6 +367,13 @@ RSpec.describe Epics::UpdateService do ...@@ -361,6 +367,13 @@ RSpec.describe Epics::UpdateService do
description_notes = find_notes('description') description_notes = find_notes('description')
expect(description_notes.length).to eq(1) expect(description_notes.length).to eq(1)
end end
it 'counts the change correctly' do
expect(Gitlab::UsageDataCounters::EpicActivityUniqueCounter).to receive(:track_epic_task_unchecked)
.with(author: user).twice
update_epic(description: "- [ ] Task 1\n- [ ] Task 2")
end
end end
end end
......
...@@ -9,6 +9,20 @@ ...@@ -9,6 +9,20 @@
aggregation: daily aggregation: daily
feature_flag: track_epics_activity feature_flag: track_epics_activity
# content change events
- name: project_management_users_unchecking_epic_task
category: epics_usage
redis_slot: project_management
aggregation: daily
feature_flag: track_epics_activity
- name: project_management_users_checking_epic_task
category: epics_usage
redis_slot: project_management
aggregation: daily
feature_flag: track_epics_activity
- name: g_project_management_users_updating_epic_titles - name: g_project_management_users_updating_epic_titles
category: epics_usage category: epics_usage
redis_slot: project_management redis_slot: project_management
......
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