From ad694a4246844b85c3f0cb97aad597403960fcf0 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 20 Jul 2023 11:41:27 -0600 Subject: [PATCH 1/7] Track when users create new saved replies / comment templates --- app/assets/javascripts/comment_templates/components/form.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/javascripts/comment_templates/components/form.vue b/app/assets/javascripts/comment_templates/components/form.vue index 334c67ca339d7a..0dadec7a5c553c 100644 --- a/app/assets/javascripts/comment_templates/components/form.vue +++ b/app/assets/javascripts/comment_templates/components/form.vue @@ -5,6 +5,7 @@ import MarkdownField from '~/vue_shared/components/markdown/field.vue'; import { helpPagePath } from '~/helpers/help_page_helper'; import { logError } from '~/lib/logger'; import { __ } from '~/locale'; +import { InternalEvents } from '~/tracking'; import createSavedReplyMutation from '../queries/create_saved_reply.mutation.graphql'; import updateSavedReplyMutation from '../queries/update_saved_reply.mutation.graphql'; @@ -17,6 +18,7 @@ export default { GlAlert, MarkdownField, }, + mixins: [InternalEvents.mixin()], props: { id: { type: String, @@ -91,6 +93,7 @@ export default { this.$emit('saved'); this.updateCommentTemplate = { name: '', content: '' }; this.showValidation = false; + this.track_event('i_code_review_saved_replies_create'); } }, }) -- GitLab From 9debc90b167a6431799ead7f8798ec124c005370 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Mon, 24 Jul 2023 08:13:04 -0600 Subject: [PATCH 2/7] Add metric definitions for unique users who create comment templates --- ...de_review_saved_replies_create_monthly.yml | 25 +++++++++++++++++++ ...ode_review_saved_replies_create_weekly.yml | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 config/metrics/counts_28d/20230724140653_i_code_review_saved_replies_create_monthly.yml create mode 100644 config/metrics/counts_7d/20230724140652_i_code_review_saved_replies_create_weekly.yml diff --git a/config/metrics/counts_28d/20230724140653_i_code_review_saved_replies_create_monthly.yml b/config/metrics/counts_28d/20230724140653_i_code_review_saved_replies_create_monthly.yml new file mode 100644 index 00000000000000..ac891dcc18c117 --- /dev/null +++ b/config/metrics/counts_28d/20230724140653_i_code_review_saved_replies_create_monthly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.code_review.i_code_review_saved_replies_create_monthly +description: Monthly count of unique users who create a saved comment reply +product_section: dev +product_stage: create +product_group: code_review +value_type: number +status: active +milestone: "16.3" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126884 +time_frame: 28d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - i_code_review_saved_replies_create diff --git a/config/metrics/counts_7d/20230724140652_i_code_review_saved_replies_create_weekly.yml b/config/metrics/counts_7d/20230724140652_i_code_review_saved_replies_create_weekly.yml new file mode 100644 index 00000000000000..565b9292c017c6 --- /dev/null +++ b/config/metrics/counts_7d/20230724140652_i_code_review_saved_replies_create_weekly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.code_review.i_code_review_saved_replies_create_weekly +description: Weekly count of unique users who create a saved comment reply +product_section: dev +product_stage: create +product_group: code_review +value_type: number +status: active +milestone: "16.3" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126884 +time_frame: 7d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - i_code_review_saved_replies_create -- GitLab From a42aaf84c3d420e8bde7ae010aa78006a487cd23 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Mon, 24 Jul 2023 19:56:36 -0600 Subject: [PATCH 3/7] Test that tracking is called when the mutation saves the template --- .../comment_templates/components/form_spec.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spec/frontend/comment_templates/components/form_spec.js b/spec/frontend/comment_templates/components/form_spec.js index 053a5099c37b33..508701b79844fd 100644 --- a/spec/frontend/comment_templates/components/form_spec.js +++ b/spec/frontend/comment_templates/components/form_spec.js @@ -6,10 +6,26 @@ import createdSavedReplyResponse from 'test_fixtures/graphql/comment_templates/c import createdSavedReplyErrorResponse from 'test_fixtures/graphql/comment_templates/create_saved_reply_with_errors.mutation.graphql.json'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; +import { InternalEvents } from '~/tracking'; import Form from '~/comment_templates/components/form.vue'; import createSavedReplyMutation from '~/comment_templates/queries/create_saved_reply.mutation.graphql'; import updateSavedReplyMutation from '~/comment_templates/queries/update_saved_reply.mutation.graphql'; +jest.mock('~/tracking', () => { + const track_event = jest.fn(); /* eslint-disable-line camelcase */ + + return { + InternalEvents: { + track_event, + mixin() { + return { + methods: { track_event }, + }; + }, + }, + }; +}); + let wrapper; let createSavedReplyResponseSpy; let updateSavedReplyResponseSpy; @@ -66,6 +82,7 @@ describe('Comment templates form component', () => { content: 'Test content', name: 'Test', }); + expect(InternalEvents.track_event).toHaveBeenCalledWith('i_code_review_saved_replies_create'); }); it('does not submit when form validation fails', async () => { -- GitLab From df70646e0812e89bb56824f48f5c86a0bb9488cb Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Tue, 25 Jul 2023 12:10:56 -0600 Subject: [PATCH 4/7] Switch to using the tracking mock helper --- .../comment_templates/components/form_spec.js | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/spec/frontend/comment_templates/components/form_spec.js b/spec/frontend/comment_templates/components/form_spec.js index 508701b79844fd..b48feba5290d4b 100644 --- a/spec/frontend/comment_templates/components/form_spec.js +++ b/spec/frontend/comment_templates/components/form_spec.js @@ -5,27 +5,12 @@ import VueApollo from 'vue-apollo'; import createdSavedReplyResponse from 'test_fixtures/graphql/comment_templates/create_saved_reply.mutation.graphql.json'; import createdSavedReplyErrorResponse from 'test_fixtures/graphql/comment_templates/create_saved_reply_with_errors.mutation.graphql.json'; import createMockApollo from 'helpers/mock_apollo_helper'; +import { mockTracking } from 'helpers/tracking_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { InternalEvents } from '~/tracking'; import Form from '~/comment_templates/components/form.vue'; import createSavedReplyMutation from '~/comment_templates/queries/create_saved_reply.mutation.graphql'; import updateSavedReplyMutation from '~/comment_templates/queries/update_saved_reply.mutation.graphql'; -jest.mock('~/tracking', () => { - const track_event = jest.fn(); /* eslint-disable-line camelcase */ - - return { - InternalEvents: { - track_event, - mixin() { - return { - methods: { track_event }, - }; - }, - }, - }; -}); - let wrapper; let createSavedReplyResponseSpy; let updateSavedReplyResponseSpy; @@ -68,6 +53,12 @@ const findSubmitBtn = () => wrapper.find('[data-testid="comment-template-form-su describe('Comment templates form component', () => { describe('creates comment template', () => { + let trackingSpy; + + beforeEach(() => { + trackingSpy = mockTracking(undefined, window.document, jest.spyOn); + }); + it('calls apollo mutation', async () => { wrapper = createComponent(); @@ -82,7 +73,11 @@ describe('Comment templates form component', () => { content: 'Test content', name: 'Test', }); - expect(InternalEvents.track_event).toHaveBeenCalledWith('i_code_review_saved_replies_create'); + expect(trackingSpy).toHaveBeenCalledWith( + expect.any(String), + 'i_code_review_saved_replies_create', + expect.any(Object), + ); }); it('does not submit when form validation fails', async () => { -- GitLab From d0b3f1a4e3d9de5a162ae56cb06bac1f1ba3c3fa Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Tue, 25 Jul 2023 14:03:41 -0600 Subject: [PATCH 5/7] Add total counter for creating a saved reply --- ...code_review_saved_replies_count_create.yml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml diff --git a/config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml b/config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml new file mode 100644 index 00000000000000..cf836e75462678 --- /dev/null +++ b/config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml @@ -0,0 +1,25 @@ +--- +key_path: counts.i_code_review_saved_replies_count_create +description: Total number of times a saved reply was created +product_section: dev +product_stage: create +product_group: code_review +value_type: number +status: active +milestone: "16.3" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126884 +time_frame: all +data_source: redis +data_category: optional +instrumentation_class: AggregatedMetric +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - i_code_review_saved_replies_create -- GitLab From 8e71bd4b4a6f2415fcc05b2f4add827d77dc5148 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Tue, 25 Jul 2023 14:35:00 -0600 Subject: [PATCH 6/7] Add the create event to the known code review events --- .../20210427102618_code_review_category_monthly_active_users.yml | 1 + .../20210427103119_code_review_group_monthly_active_users.yml | 1 + .../20210427103328_code_review_group_monthly_active_users.yml | 1 + .../20210427103407_code_review_category_monthly_active_users.yml | 1 + 4 files changed, 4 insertions(+) diff --git a/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml b/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml index 51a688a5806f2e..b8c5169e93a0ca 100644 --- a/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml +++ b/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml @@ -139,3 +139,4 @@ options: - 'i_code_review_merge_request_widget_security_reports_expand_success' - 'i_code_review_merge_request_widget_security_reports_expand_warning' - 'i_code_review_merge_request_widget_security_reports_expand_failed' + - 'i_code_review_saved_replies_create' diff --git a/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml b/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml index 9140ab4cc5f901..3ec0903e363eed 100644 --- a/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml +++ b/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml @@ -144,3 +144,4 @@ options: - 'i_code_review_merge_request_widget_security_reports_expand_success' - 'i_code_review_merge_request_widget_security_reports_expand_warning' - 'i_code_review_merge_request_widget_security_reports_expand_failed' + - 'i_code_review_saved_replies_create' diff --git a/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml b/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml index 7e209470ac9115..6a0a14bdc26820 100644 --- a/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml +++ b/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml @@ -142,3 +142,4 @@ options: - 'i_code_review_merge_request_widget_security_reports_expand_success' - 'i_code_review_merge_request_widget_security_reports_expand_warning' - 'i_code_review_merge_request_widget_security_reports_expand_failed' + - 'i_code_review_saved_replies_create' diff --git a/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml b/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml index 343e0105bf7dc8..18d69d8e2f7ef0 100644 --- a/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml +++ b/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml @@ -137,3 +137,4 @@ options: - 'i_code_review_merge_request_widget_security_reports_expand_success' - 'i_code_review_merge_request_widget_security_reports_expand_warning' - 'i_code_review_merge_request_widget_security_reports_expand_failed' + - 'i_code_review_saved_replies_create' -- GitLab From 8c4bd761d6fd2dbd12d610070b151457e2e68cc0 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 3 Aug 2023 14:57:50 -0600 Subject: [PATCH 7/7] Fix Ruby class name and constructor arguments --- ...30725200123_i_code_review_saved_replies_count_create.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml b/config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml index cf836e75462678..64cfcee0ef4037 100644 --- a/config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml +++ b/config/metrics/counts_all/20230725200123_i_code_review_saved_replies_count_create.yml @@ -11,7 +11,7 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126884 time_frame: all data_source: redis data_category: optional -instrumentation_class: AggregatedMetric +instrumentation_class: RedisMetric performance_indicator_type: [] distribution: - ce @@ -21,5 +21,5 @@ tier: - premium - ultimate options: - events: - - i_code_review_saved_replies_create + event: create + prefix: i_code_review_saved_replies -- GitLab