Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-08-29 06:09:26 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-08-29 06:09:26 +0300
commit676bd22b8df8e1ed169fd6cb03a2ac18946bebde (patch)
treed77d37a58990d081ee9504bd47266b7a417340c7
parent96e582ee80deeb4bd2b4f3a3cf48d1f9260f25aa (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--app/assets/javascripts/work_items/components/shared/work_item_token_input.vue145
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue91
-rw-r--r--config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20230105222225_g_project_management_issue_design_comments_removed_monthly.yml3
-rw-r--r--config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20230105222224_g_project_management_issue_design_comments_removed_weekly.yml3
-rw-r--r--doc/user/compliance/license_scanning_of_cyclonedx_files/index.md2
-rw-r--r--lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb108
-rw-r--r--locale/gitlab.pot3
-rw-r--r--spec/frontend/work_items/components/shared/work_item_token_input_spec.js81
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js50
-rw-r--r--spec/frontend/work_items/mock_data.js21
-rw-r--r--spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb186
-rw-r--r--spec/models/resource_state_event_spec.rb16
-rw-r--r--spec/services/design_management/delete_designs_service_spec.rb8
-rw-r--r--spec/services/design_management/save_designs_service_spec.rb10
-rw-r--r--spec/services/notes/create_service_spec.rb5
-rw-r--r--spec/services/notes/destroy_service_spec.rb7
-rw-r--r--spec/services/notes/update_service_spec.rb12
-rw-r--r--spec/services/resource_events/change_labels_service_spec.rb6
-rw-r--r--spec/services/system_notes/issuables_service_spec.rb5
-rw-r--r--spec/services/system_notes/time_tracking_service_spec.rb21
-rw-r--r--spec/services/work_items/update_service_spec.rb5
-rw-r--r--spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb87
-rw-r--r--workhorse/go.mod2
-rw-r--r--workhorse/go.sum6
79 files changed, 603 insertions, 442 deletions
diff --git a/app/assets/javascripts/work_items/components/shared/work_item_token_input.vue b/app/assets/javascripts/work_items/components/shared/work_item_token_input.vue
new file mode 100644
index 00000000000..7b38e838033
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/shared/work_item_token_input.vue
@@ -0,0 +1,145 @@
+<script>
+import { GlTokenSelector } from '@gitlab/ui';
+import { debounce } from 'lodash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
+
+import projectWorkItemsQuery from '../../graphql/project_work_items.query.graphql';
+import {
+ WORK_ITEMS_TYPE_MAP,
+ WORK_ITEM_TYPE_ENUM_TASK,
+ I18N_WORK_ITEM_SEARCH_INPUT_PLACEHOLDER,
+ sprintfWorkItem,
+} from '../../constants';
+
+export default {
+ components: {
+ GlTokenSelector,
+ },
+ props: {
+ value: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ fullPath: {
+ type: String,
+ required: true,
+ },
+ childrenType: {
+ type: String,
+ required: false,
+ default: WORK_ITEM_TYPE_ENUM_TASK,
+ },
+ childrenIds: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ parentWorkItemId: {
+ type: String,
+ required: true,
+ },
+ areWorkItemsToAddValid: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ apollo: {
+ availableWorkItems: {
+ query: projectWorkItemsQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ searchTerm: this.search?.title || this.search,
+ types: [this.childrenType],
+ in: this.search ? 'TITLE' : undefined,
+ };
+ },
+ skip() {
+ return !this.searchStarted;
+ },
+ update(data) {
+ return data.workspace.workItems.nodes.filter(
+ (wi) => !this.childrenIds.includes(wi.id) && this.parentWorkItemId !== wi.id,
+ );
+ },
+ },
+ },
+ data() {
+ return {
+ availableWorkItems: [],
+ search: '',
+ searchStarted: false,
+ };
+ },
+ computed: {
+ workItemsToAdd: {
+ get() {
+ return this.value;
+ },
+ set(workItemsToAdd) {
+ this.$emit('input', workItemsToAdd);
+ },
+ },
+ isLoading() {
+ return this.$apollo.queries.availableWorkItems.loading;
+ },
+ addInputPlaceholder() {
+ return sprintfWorkItem(I18N_WORK_ITEM_SEARCH_INPUT_PLACEHOLDER, this.childrenTypeName);
+ },
+ childrenTypeName() {
+ return WORK_ITEMS_TYPE_MAP[this.childrenType]?.name;
+ },
+ tokenSelectorContainerClass() {
+ return !this.areWorkItemsToAddValid ? 'gl-inset-border-1-red-500!' : '';
+ },
+ },
+ created() {
+ this.debouncedSearchKeyUpdate = debounce(this.setSearchKey, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ },
+ methods: {
+ getIdFromGraphQLId,
+ setSearchKey(value) {
+ this.search = value;
+ },
+ handleFocus() {
+ this.searchStarted = true;
+ },
+ handleMouseOver() {
+ this.timeout = setTimeout(() => {
+ this.searchStarted = true;
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
+ },
+ handleMouseOut() {
+ clearTimeout(this.timeout);
+ },
+ },
+};
+</script>
+<template>
+ <gl-token-selector
+ v-model="workItemsToAdd"
+ :dropdown-items="availableWorkItems"
+ :loading="isLoading"
+ :placeholder="addInputPlaceholder"
+ menu-class="gl-dropdown-menu-wide dropdown-reduced-height gl-min-h-7!"
+ :container-class="tokenSelectorContainerClass"
+ data-testid="work-item-token-select-input"
+ @text-input="debouncedSearchKeyUpdate"
+ @focus="handleFocus"
+ @mouseover.native="handleMouseOver"
+ @mouseout.native="handleMouseOut"
+ >
+ <template #token-content="{ token }">
+ {{ token.title }}
+ </template>
+ <template #dropdown-item-content="{ dropdownItem }">
+ <div class="gl-display-flex">
+ <div class="gl-text-secondary gl-mr-4">{{ getIdFromGraphQLId(dropdownItem.id) }}</div>
+ <div class="gl-text-truncate">{{ dropdownItem.title }}</div>
+ </div>
+ </template>
+ </gl-token-selector>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
index 4960189fb48..a58752a861a 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
@@ -3,19 +3,15 @@ import {
GlAlert,
GlFormGroup,
GlForm,
- GlTokenSelector,
GlButton,
GlFormInput,
GlFormCheckbox,
GlTooltip,
} from '@gitlab/ui';
-import { debounce } from 'lodash';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { __, s__, sprintf } from '~/locale';
+import WorkItemTokenInput from '../shared/work_item_token_input.vue';
import { addHierarchyChild } from '../../graphql/cache_utils';
import projectWorkItemTypesQuery from '../../graphql/project_work_item_types.query.graphql';
-import projectWorkItemsQuery from '../../graphql/project_work_items.query.graphql';
import updateWorkItemMutation from '../../graphql/update_work_item.mutation.graphql';
import createWorkItemMutation from '../../graphql/create_work_item.mutation.graphql';
import {
@@ -23,7 +19,6 @@ import {
WORK_ITEMS_TYPE_MAP,
WORK_ITEM_TYPE_ENUM_TASK,
I18N_WORK_ITEM_CREATE_BUTTON_LABEL,
- I18N_WORK_ITEM_SEARCH_INPUT_PLACEHOLDER,
I18N_WORK_ITEM_ADD_BUTTON_LABEL,
I18N_WORK_ITEM_ADD_MULTIPLE_BUTTON_LABEL,
I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_LABEL,
@@ -35,12 +30,12 @@ export default {
components: {
GlAlert,
GlForm,
- GlTokenSelector,
GlButton,
GlFormGroup,
GlFormInput,
GlFormCheckbox,
GlTooltip,
+ WorkItemTokenInput,
},
inject: ['fullPath', 'hasIterationsFeature'],
props: {
@@ -101,35 +96,14 @@ export default {
return data.workspace?.workItemTypes?.nodes;
},
},
- availableWorkItems: {
- query: projectWorkItemsQuery,
- variables() {
- return {
- fullPath: this.fullPath,
- searchTerm: this.search?.title || this.search,
- types: [this.childrenType],
- in: this.search ? 'TITLE' : undefined,
- };
- },
- skip() {
- return !this.searchStarted;
- },
- update(data) {
- return data.workspace.workItems.nodes.filter(
- (wi) => !this.childrenIds.includes(wi.id) && this.issuableGid !== wi.id,
- );
- },
- },
},
data() {
return {
workItemTypes: [],
- availableWorkItems: [],
- search: '',
- searchStarted: false,
+ workItemsToAdd: [],
error: null,
+ search: '',
childToCreateTitle: null,
- workItemsToAdd: [],
confidential: this.parentConfidential,
};
},
@@ -216,15 +190,6 @@ export default {
}
return this.workItemsToAdd.length === 0 || !this.areWorkItemsToAddValid;
},
- isLoading() {
- return this.$apollo.queries.availableWorkItems.loading;
- },
- addInputPlaceholder() {
- return sprintfWorkItem(I18N_WORK_ITEM_SEARCH_INPUT_PLACEHOLDER, this.childrenTypeName);
- },
- tokenSelectorContainerClass() {
- return !this.areWorkItemsToAddValid ? 'gl-inset-border-1-red-500!' : '';
- },
invalidWorkItemsToAdd() {
return this.parentConfidential
? this.workItemsToAdd.filter((workItem) => !workItem.confidential)
@@ -249,11 +214,7 @@ export default {
);
},
},
- created() {
- this.debouncedSearchKeyUpdate = debounce(this.setSearchKey, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
- },
methods: {
- getIdFromGraphQLId,
getConfidentialityTooltipTarget() {
// We want tooltip to be anchored to `input` within checkbox component
// but `$el.querySelector('input')` doesn't work. 🤷‍♂️
@@ -317,20 +278,6 @@ export default {
this.childToCreateTitle = null;
});
},
- setSearchKey(value) {
- this.search = value;
- },
- handleFocus() {
- this.searchStarted = true;
- },
- handleMouseOver() {
- this.timeout = setTimeout(() => {
- this.searchStarted = true;
- }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
- },
- handleMouseOut() {
- clearTimeout(this.timeout);
- },
},
i18n: {
inputLabel: __('Title'),
@@ -385,30 +332,16 @@ export default {
>{{ confidentialityCheckboxTooltip }}</gl-tooltip
>
<div class="gl-mb-4">
- <gl-token-selector
+ <work-item-token-input
v-if="!isCreateForm"
v-model="workItemsToAdd"
- :dropdown-items="availableWorkItems"
- :loading="isLoading"
- :placeholder="addInputPlaceholder"
- menu-class="gl-dropdown-menu-wide dropdown-reduced-height gl-min-h-7!"
- :container-class="tokenSelectorContainerClass"
- data-testid="work-item-token-select-input"
- @text-input="debouncedSearchKeyUpdate"
- @focus="handleFocus"
- @mouseover.native="handleMouseOver"
- @mouseout.native="handleMouseOut"
- >
- <template #token-content="{ token }">
- {{ token.title }}
- </template>
- <template #dropdown-item-content="{ dropdownItem }">
- <div class="gl-display-flex">
- <div class="gl-text-secondary gl-mr-4">{{ getIdFromGraphQLId(dropdownItem.id) }}</div>
- <div class="gl-text-truncate">{{ dropdownItem.title }}</div>
- </div>
- </template>
- </gl-token-selector>
+ :is-create-form="isCreateForm"
+ :parent-work-item-id="issuableGid"
+ :children-type="childrenType"
+ :children-ids="childrenIds"
+ :are-work-items-to-add-valid="areWorkItemsToAddValid"
+ :full-path="fullPath"
+ />
<div
v-if="showWorkItemsToAddInvalidMessage"
class="gl-text-red-500"
diff --git a/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
index ae28eb8e057..3eb1fbc1f74 100644
--- a/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_title_changed
+events:
+ - name: g_project_management_issue_title_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
index e00b7c18176..c3391dc8ebf 100644
--- a/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_description_changed
+events:
+ - name: g_project_management_issue_description_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml b/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml
index a548cf8ede7..81c50904413 100644
--- a/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_assignee_changed
+events:
+ - name: g_project_management_issue_assignee_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
index 0ff91cc6f9e..f9890fb429f 100644
--- a/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
+++ b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_made_confidential
+events:
+ - name: g_project_management_issue_made_confidential
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
index 764acfd1720..4a235adab16 100644
--- a/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
+++ b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_made_visible
+events:
+ - name: g_project_management_issue_made_visible
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
index 962c8d85417..35287221771 100644
--- a/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_closed
+events:
+ - name: g_project_management_issue_closed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
index 6e1690afaba..da769d167b0 100644
--- a/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
+++ b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_reopened
+events:
+ - name: g_project_management_issue_reopened
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
index cbf3795eb4e..9763bf8140f 100644
--- a/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_label_changed
+events:
+ - name: g_project_management_issue_label_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
index a653df04b24..ea3c3afd070 100644
--- a/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_milestone_changed
+events:
+ - name: g_project_management_issue_milestone_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
index c476a738721..2d3bdcaab40 100644
--- a/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
+++ b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_cross_referenced
+events:
+ - name: g_project_management_issue_cross_referenced
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
index d7d432060d3..21eb12883b6 100644
--- a/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
+++ b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_moved
+events:
+ - name: g_project_management_issue_moved
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
index 62d58bb6da1..8aea29208c2 100644
--- a/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
+++ b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_related
+events:
+ - name: g_project_management_issue_related
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
index 39b482d859b..1b1c5daa84b 100644
--- a/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
+++ b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_unrelated
+events:
+ - name: g_project_management_issue_unrelated
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
index 8d6bb063089..6e92afbc939 100644
--- a/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_marked_as_duplicate
+events:
+ - name: g_project_management_issue_marked_as_duplicate
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
index 290aa31ee18..55a65461f0f 100644
--- a/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
+++ b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_locked
+events:
+ - name: g_project_management_issue_locked
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
index 0f990ee8dcd..3f2ffc10cca 100644
--- a/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
+++ b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_unlocked
+events:
+ - name: g_project_management_issue_unlocked
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
index d7958ab29fe..66d4921537f 100644
--- a/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
+++ b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_designs_added
+events:
+ - name: g_project_management_issue_designs_added
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
index 953dbd9f7f0..d0b31108662 100644
--- a/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
+++ b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_designs_modified
+events:
+ - name: g_project_management_issue_designs_modified
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
index 565f819fedb..7388ebf289c 100644
--- a/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_designs_removed
+events:
+ - name: g_project_management_issue_designs_removed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
index cfdecbf45e2..54b45035d7b 100644
--- a/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_due_date_changed
+events:
+ - name: g_project_management_issue_due_date_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
index 0e4892865e1..bbc9904ecd2 100644
--- a/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_time_estimate_changed
+events:
+ - name: g_project_management_issue_time_estimate_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
index c49dc9a076c..e753e6b6495 100644
--- a/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_time_spent_changed
+events:
+ - name: g_project_management_issue_time_spent_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
index 28850b5285b..2c7fc57d6c0 100644
--- a/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
+++ b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_comment_added
+events:
+ - name: g_project_management_issue_comment_added
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
index cdf12de3a38..e4068feafdd 100644
--- a/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
+++ b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_comment_edited
+events:
+ - name: g_project_management_issue_comment_edited
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
index 4327a7e60d7..f9ce6566c61 100644
--- a/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_comment_removed
+events:
+ - name: g_project_management_issue_comment_removed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
index de4fc157b43..1a04bc77c63 100644
--- a/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
+++ b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_cloned
+events:
+ - name: g_project_management_issue_cloned
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20230105222225_g_project_management_issue_design_comments_removed_monthly.yml b/config/metrics/counts_28d/20230105222225_g_project_management_issue_design_comments_removed_monthly.yml
index dc62055774b..06da71ecb6c 100644
--- a/config/metrics/counts_28d/20230105222225_g_project_management_issue_design_comments_removed_monthly.yml
+++ b/config/metrics/counts_28d/20230105222225_g_project_management_issue_design_comments_removed_monthly.yml
@@ -16,6 +16,9 @@ performance_indicator_type: []
options:
events:
- g_project_management_issue_design_comments_removed
+events:
+ - name: g_project_management_issue_design_comments_removed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
index a283ced7da8..7e37a4e0cf7 100644
--- a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
@@ -15,6 +15,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_title_changed
+events:
+ - name: g_project_management_issue_title_changed
+ unique: user.id
distribution:
- ee
- ce
diff --git a/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml b/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml
index 2af4e6523f1..7957eea3b46 100644
--- a/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_description_changed
+events:
+ - name: g_project_management_issue_description_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml b/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml
index 933f1bf3e3b..4194d0d52bd 100644
--- a/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_assignee_changed
+events:
+ - name: g_project_management_issue_assignee_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml b/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml
index 352c5e44d47..48e62361896 100644
--- a/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml
+++ b/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_made_confidential
+events:
+ - name: g_project_management_issue_made_confidential
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml b/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml
index 41ba3cc3f79..97bbc0959a6 100644
--- a/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml
+++ b/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_made_visible
+events:
+ - name: g_project_management_issue_made_visible
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml b/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml
index 0349cc014be..9d06da85a68 100644
--- a/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_closed
+events:
+ - name: g_project_management_issue_closed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml b/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml
index 3d7bd3888f7..97bd6edc467 100644
--- a/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml
+++ b/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_reopened
+events:
+ - name: g_project_management_issue_reopened
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml b/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml
index cb2f31a2c26..3b4f8b437d9 100644
--- a/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_label_changed
+events:
+ - name: g_project_management_issue_label_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml b/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml
index bbe4d122847..58f12b7f563 100644
--- a/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_milestone_changed
+events:
+ - name: g_project_management_issue_milestone_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml b/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml
index b1c13ef367c..aef222ce913 100644
--- a/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml
+++ b/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_cross_referenced
+events:
+ - name: g_project_management_issue_cross_referenced
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml b/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml
index f72c83ab3df..8035d873767 100644
--- a/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml
+++ b/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_moved
+events:
+ - name: g_project_management_issue_moved
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml b/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml
index f42e99b4514..f804e2cee9b 100644
--- a/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml
+++ b/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_related
+events:
+ - name: g_project_management_issue_related
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml b/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml
index e8b06010a17..67ff8fb3f3c 100644
--- a/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml
+++ b/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_unrelated
+events:
+ - name: g_project_management_issue_unrelated
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml b/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml
index 13c783fd07f..7997b87a9da 100644
--- a/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_marked_as_duplicate
+events:
+ - name: g_project_management_issue_marked_as_duplicate
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml b/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml
index 6a07d05d9ec..9759de7869a 100644
--- a/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml
+++ b/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_locked
+events:
+ - name: g_project_management_issue_locked
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml b/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml
index 69550cb65d1..104e14cd440 100644
--- a/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml
+++ b/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_unlocked
+events:
+ - name: g_project_management_issue_unlocked
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml b/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml
index 1b686f6c0d4..6c12976875e 100644
--- a/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml
+++ b/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_designs_added
+events:
+ - name: g_project_management_issue_designs_added
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml b/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml
index 06f3416d58e..39301cf68e9 100644
--- a/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml
+++ b/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_designs_modified
+events:
+ - name: g_project_management_issue_designs_modified
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml b/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml
index 9c573914f88..30a4cfe82de 100644
--- a/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_designs_removed
+events:
+ - name: g_project_management_issue_designs_removed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml b/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml
index 89e331307bc..e523c500b63 100644
--- a/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_due_date_changed
+events:
+ - name: g_project_management_issue_due_date_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml b/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml
index c1e2d542cdc..1e5a584d96c 100644
--- a/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_time_estimate_changed
+events:
+ - name: g_project_management_issue_time_estimate_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml b/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml
index 48f4175f084..e6d15478d81 100644
--- a/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_time_spent_changed
+events:
+ - name: g_project_management_issue_time_spent_changed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml b/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml
index 9303f4e69ff..afadbbaec4a 100644
--- a/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml
+++ b/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_comment_added
+events:
+ - name: g_project_management_issue_comment_added
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml b/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml
index 4bba82b80f6..d4482507825 100644
--- a/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml
+++ b/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_comment_edited
+events:
+ - name: g_project_management_issue_comment_edited
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml b/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml
index 6bbfe60613e..d9592a1255a 100644
--- a/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_comment_removed
+events:
+ - name: g_project_management_issue_comment_removed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml b/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml
index 66b1fc7fb46..7352a9d4e51 100644
--- a/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml
+++ b/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml
@@ -13,6 +13,9 @@ instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_cloned
+events:
+ - name: g_project_management_issue_cloned
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20230105222224_g_project_management_issue_design_comments_removed_weekly.yml b/config/metrics/counts_7d/20230105222224_g_project_management_issue_design_comments_removed_weekly.yml
index e1d899d5193..8b3129ab470 100644
--- a/config/metrics/counts_7d/20230105222224_g_project_management_issue_design_comments_removed_weekly.yml
+++ b/config/metrics/counts_7d/20230105222224_g_project_management_issue_design_comments_removed_weekly.yml
@@ -16,6 +16,9 @@ performance_indicator_type: []
options:
events:
- g_project_management_issue_design_comments_removed
+events:
+ - name: g_project_management_issue_design_comments_removed
+ unique: user.id
distribution:
- ce
- ee
diff --git a/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md b/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md
index 97f9f277776..dd73cc7dec3 100644
--- a/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md
+++ b/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md
@@ -13,7 +13,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Enabled](https://gitlab.com/gitlab-org/gitlab/-/issues/385173) in GitLab 15.11 for self-managed GitLab.
FLAG:
-The legacy License Compliance analyzer was deprecated in GitLab 15.9 and removed in GitLab 16.3. To continue using GitLab for License Compliance, remove the License Compliance template from your CI/CD pipeline and add the [Dependency Scanning template](../../application_security/dependency_scanning/index.md#configuration). The Dependency Scanning template is now capable of gathering the required license information so it is no longer necessary to run a separate License Compliance job. The License Compliance CI/CD template should not be removed prior to verifying that the `license_scanning_sbom_scanner` and `package_metadata_synchronization` flags are enabled for the instance and that the instance has been upgraded to a version that supports the new method of license scanning. To begin using the Dependency Scanner quickly at scale, you may set up a [scan execution policy](../../application_security/policies/scan-execution-policies.md) at the group level to enforce the SBOM-based license scan for all projects in the group. Then, you may remove the inclusion of the `Jobs/License-Scanning.gitlab-ci.yml` template from your CI/CD configuration. If you wish to continue using the legacy License Compliance feature, you can do so by setting the `LICENSE_MANAGEMENT_VERSION CI` variable to `4`. This variable can be set at the [project](../../../ci/variables/index.md#for-a-project), [group](../../../ci/variables/index.md#for-a-group) or [instance](../../../ci/variables/index.md#for-an-instance) level. This configuration change will allow you to continue using an existing version of the License Compliance without having to adopt the new approach. **Bugs and vulnerabilities in this legacy analyzer will no longer be fixed.**
+The legacy License Compliance analyzer was deprecated in GitLab 15.9 and removed in GitLab 16.3. To continue using GitLab for License Compliance, remove the License Compliance template from your CI/CD pipeline and add the [Dependency Scanning template](../../application_security/dependency_scanning/index.md#configuration). The Dependency Scanning template is now capable of gathering the required license information so it is no longer necessary to run a separate License Compliance job. The License Compliance CI/CD template should not be removed prior to verifying that the `license_scanning_sbom_scanner` and `package_metadata_synchronization` flags are enabled for the instance and that the instance has been upgraded to a version that supports the new method of license scanning. To begin using the Dependency Scanner quickly at scale, you may set up a [scan execution policy](../../application_security/policies/scan-execution-policies.md) at the group level to enforce the SBOM-based license scan for all projects in the group. Then, you may remove the inclusion of the `Jobs/License-Scanning.gitlab-ci.yml` template from your CI/CD configuration. If you wish to continue using the legacy License Compliance feature, you can do so by setting the `LICENSE_MANAGEMENT_VERSION CI` variable to `4`. This variable can be set at the [project](../../../ci/variables/index.md#for-a-project), [group](../../../ci/variables/index.md#for-a-group) or [instance](../../../ci/variables/index.md#for-an-instance) level. This configuration change will allow you to continue using the existing version of License Compliance to generate [license scanning report](../../../ci/yaml/artifacts_reports.md#artifactsreportslicense_scanning) artifacts in your pipelines. However, since legacy license scanning support is being removed from our codebase, switching back to this legacy analyzer prevents other License Compliance features from working as expected, so this approach is not recommended. In addition to this, **bugs and vulnerabilities in this legacy analyzer will no longer be fixed.**
To detect the licenses in use, License Compliance relies on running the
[Dependency Scanning CI Jobs](../../application_security/dependency_scanning/index.md),
diff --git a/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
index c737da7a579..77528082069 100644
--- a/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.54.0'
+ DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.55.0'
.dast-auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
index 9b37d8774d9..65f3e259c3c 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_DEPLOY_IMAGE_VERSION: 'v2.54.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.55.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
index 54ce5f06ad0..0211b296b22 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_DEPLOY_IMAGE_VERSION: 'v2.54.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.55.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
index 54464b63fce..39d9560c0fb 100644
--- a/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
@@ -38,170 +38,120 @@ module Gitlab
class << self
def track_issue_created_action(author:, namespace:)
- track_internal_action(ISSUE_CREATED, author, namespace)
+ track_internal_event(ISSUE_CREATED, author, namespace)
end
def track_issue_title_changed_action(author:, project:)
- track_snowplow_action(ISSUE_TITLE_CHANGED, author, project)
- track_unique_action(ISSUE_TITLE_CHANGED, author)
+ track_internal_event(ISSUE_TITLE_CHANGED, author, project)
end
def track_issue_description_changed_action(author:, project:)
- track_snowplow_action(ISSUE_DESCRIPTION_CHANGED, author, project)
- track_unique_action(ISSUE_DESCRIPTION_CHANGED, author)
+ track_internal_event(ISSUE_DESCRIPTION_CHANGED, author, project)
end
def track_issue_assignee_changed_action(author:, project:)
- track_snowplow_action(ISSUE_ASSIGNEE_CHANGED, author, project)
- track_unique_action(ISSUE_ASSIGNEE_CHANGED, author)
+ track_internal_event(ISSUE_ASSIGNEE_CHANGED, author, project)
end
def track_issue_made_confidential_action(author:, project:)
- track_snowplow_action(ISSUE_MADE_CONFIDENTIAL, author, project)
- track_unique_action(ISSUE_MADE_CONFIDENTIAL, author)
+ track_internal_event(ISSUE_MADE_CONFIDENTIAL, author, project)
end
def track_issue_made_visible_action(author:, project:)
- track_snowplow_action(ISSUE_MADE_VISIBLE, author, project)
- track_unique_action(ISSUE_MADE_VISIBLE, author)
+ track_internal_event(ISSUE_MADE_VISIBLE, author, project)
end
def track_issue_closed_action(author:, project:)
- track_snowplow_action(ISSUE_CLOSED, author, project)
- track_unique_action(ISSUE_CLOSED, author)
+ track_internal_event(ISSUE_CLOSED, author, project)
end
def track_issue_reopened_action(author:, project:)
- track_snowplow_action(ISSUE_REOPENED, author, project)
- track_unique_action(ISSUE_REOPENED, author)
+ track_internal_event(ISSUE_REOPENED, author, project)
end
def track_issue_label_changed_action(author:, project:)
- track_snowplow_action(ISSUE_LABEL_CHANGED, author, project)
- track_unique_action(ISSUE_LABEL_CHANGED, author)
+ track_internal_event(ISSUE_LABEL_CHANGED, author, project)
end
def track_issue_milestone_changed_action(author:, project:)
- track_snowplow_action(ISSUE_MILESTONE_CHANGED, author, project)
- track_unique_action(ISSUE_MILESTONE_CHANGED, author)
+ track_internal_event(ISSUE_MILESTONE_CHANGED, author, project)
end
def track_issue_cross_referenced_action(author:, project:)
- track_snowplow_action(ISSUE_CROSS_REFERENCED, author, project)
- track_unique_action(ISSUE_CROSS_REFERENCED, author)
+ track_internal_event(ISSUE_CROSS_REFERENCED, author, project)
end
def track_issue_moved_action(author:, project:)
- track_snowplow_action(ISSUE_MOVED, author, project)
- track_unique_action(ISSUE_MOVED, author)
+ track_internal_event(ISSUE_MOVED, author, project)
end
def track_issue_related_action(author:, project:)
- track_snowplow_action(ISSUE_RELATED, author, project)
- track_unique_action(ISSUE_RELATED, author)
+ track_internal_event(ISSUE_RELATED, author, project)
end
def track_issue_unrelated_action(author:, project:)
- track_snowplow_action(ISSUE_UNRELATED, author, project)
- track_unique_action(ISSUE_UNRELATED, author)
+ track_internal_event(ISSUE_UNRELATED, author, project)
end
def track_issue_marked_as_duplicate_action(author:, project:)
- track_snowplow_action(ISSUE_MARKED_AS_DUPLICATE, author, project)
- track_unique_action(ISSUE_MARKED_AS_DUPLICATE, author)
+ track_internal_event(ISSUE_MARKED_AS_DUPLICATE, author, project)
end
def track_issue_locked_action(author:, project:)
- track_snowplow_action(ISSUE_LOCKED, author, project)
- track_unique_action(ISSUE_LOCKED, author)
+ track_internal_event(ISSUE_LOCKED, author, project)
end
def track_issue_unlocked_action(author:, project:)
- track_snowplow_action(ISSUE_UNLOCKED, author, project)
- track_unique_action(ISSUE_UNLOCKED, author)
+ track_internal_event(ISSUE_UNLOCKED, author, project)
end
def track_issue_designs_added_action(author:, project:)
- track_snowplow_action(ISSUE_DESIGNS_ADDED, author, project)
- track_unique_action(ISSUE_DESIGNS_ADDED, author)
+ track_internal_event(ISSUE_DESIGNS_ADDED, author, project)
end
def track_issue_designs_modified_action(author:, project:)
- track_snowplow_action(ISSUE_DESIGNS_MODIFIED, author, project)
- track_unique_action(ISSUE_DESIGNS_MODIFIED, author)
+ track_internal_event(ISSUE_DESIGNS_MODIFIED, author, project)
end
def track_issue_designs_removed_action(author:, project:)
- track_snowplow_action(ISSUE_DESIGNS_REMOVED, author, project)
- track_unique_action(ISSUE_DESIGNS_REMOVED, author)
+ track_internal_event(ISSUE_DESIGNS_REMOVED, author, project)
end
def track_issue_due_date_changed_action(author:, project:)
- track_snowplow_action(ISSUE_DUE_DATE_CHANGED, author, project)
- track_unique_action(ISSUE_DUE_DATE_CHANGED, author)
+ track_internal_event(ISSUE_DUE_DATE_CHANGED, author, project)
end
def track_issue_time_estimate_changed_action(author:, project:)
- track_snowplow_action(ISSUE_TIME_ESTIMATE_CHANGED, author, project)
- track_unique_action(ISSUE_TIME_ESTIMATE_CHANGED, author)
+ track_internal_event(ISSUE_TIME_ESTIMATE_CHANGED, author, project)
end
def track_issue_time_spent_changed_action(author:, project:)
- track_snowplow_action(ISSUE_TIME_SPENT_CHANGED, author, project)
- track_unique_action(ISSUE_TIME_SPENT_CHANGED, author)
+ track_internal_event(ISSUE_TIME_SPENT_CHANGED, author, project)
end
def track_issue_comment_added_action(author:, project:)
- track_snowplow_action(ISSUE_COMMENT_ADDED, author, project)
- track_unique_action(ISSUE_COMMENT_ADDED, author)
+ track_internal_event(ISSUE_COMMENT_ADDED, author, project)
end
def track_issue_comment_edited_action(author:, project:)
- track_snowplow_action(ISSUE_COMMENT_EDITED, author, project)
- track_unique_action(ISSUE_COMMENT_EDITED, author)
+ track_internal_event(ISSUE_COMMENT_EDITED, author, project)
end
def track_issue_comment_removed_action(author:, project:)
- track_snowplow_action(ISSUE_COMMENT_REMOVED, author, project)
- track_unique_action(ISSUE_COMMENT_REMOVED, author)
+ track_internal_event(ISSUE_COMMENT_REMOVED, author, project)
end
def track_issue_cloned_action(author:, project:)
- track_snowplow_action(ISSUE_CLONED, author, project)
- track_unique_action(ISSUE_CLONED, author)
+ track_internal_event(ISSUE_CLONED, author, project)
end
def track_issue_design_comment_removed_action(author:, project:)
- track_snowplow_action(ISSUE_DESIGN_COMMENT_REMOVED, author, project)
- track_unique_action(ISSUE_DESIGN_COMMENT_REMOVED, author)
+ track_internal_event(ISSUE_DESIGN_COMMENT_REMOVED, author, project)
end
private
- def track_snowplow_action(event_name, author, container)
- namespace, project = get_params_from_container(container)
-
- return unless author
-
- Gitlab::Tracking.event(
- ISSUE_CATEGORY,
- ISSUE_ACTION,
- label: ISSUE_LABEL,
- property: event_name,
- project: project,
- namespace: namespace,
- user: author,
- context: [Gitlab::Tracking::ServicePingContext.new(data_source: :redis_hll, event: event_name).to_context]
- )
- end
-
- def track_unique_action(event_name, author)
- return unless author
-
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: author.id)
- end
-
- def track_internal_action(event_name, author, container)
+ def track_internal_event(event_name, author, container)
return unless author
namespace, project = get_params_from_container(container)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 22cc0e33cc3..f170d34e437 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -7991,9 +7991,6 @@ msgstr ""
msgid "BoardScope|Select milestone"
msgstr ""
-msgid "BoardScope|Select weight"
-msgstr ""
-
msgid "BoardScope|Started"
msgstr ""
diff --git a/spec/frontend/work_items/components/shared/work_item_token_input_spec.js b/spec/frontend/work_items/components/shared/work_item_token_input_spec.js
new file mode 100644
index 00000000000..075b69415cf
--- /dev/null
+++ b/spec/frontend/work_items/components/shared/work_item_token_input_spec.js
@@ -0,0 +1,81 @@
+import Vue from 'vue';
+import { GlTokenSelector } from '@gitlab/ui';
+import VueApollo from 'vue-apollo';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import WorkItemTokenInput from '~/work_items/components/shared/work_item_token_input.vue';
+import { WORK_ITEM_TYPE_ENUM_TASK } from '~/work_items/constants';
+import projectWorkItemsQuery from '~/work_items/graphql/project_work_items.query.graphql';
+import { availableWorkItemsResponse, searchedWorkItemsResponse } from '../../mock_data';
+
+Vue.use(VueApollo);
+
+describe('WorkItemTokenInput', () => {
+ let wrapper;
+
+ const availableWorkItemsResolver = jest.fn().mockResolvedValue(availableWorkItemsResponse);
+ const searchedWorkItemResolver = jest.fn().mockResolvedValue(searchedWorkItemsResponse);
+
+ const createComponent = async ({
+ workItemsToAdd = [],
+ parentConfidential = false,
+ childrenType = WORK_ITEM_TYPE_ENUM_TASK,
+ areWorkItemsToAddValid = true,
+ workItemsResolver = searchedWorkItemResolver,
+ } = {}) => {
+ wrapper = shallowMountExtended(WorkItemTokenInput, {
+ apolloProvider: createMockApollo([[projectWorkItemsQuery, workItemsResolver]]),
+ propsData: {
+ value: workItemsToAdd,
+ childrenType,
+ childrenIds: [],
+ fullPath: 'test-project-path',
+ parentWorkItemId: 'gid://gitlab/WorkItem/1',
+ parentConfidential,
+ areWorkItemsToAddValid,
+ },
+ });
+
+ await waitForPromises();
+ };
+
+ const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
+
+ it('searches for available work items on focus', async () => {
+ createComponent({ workItemsResolver: availableWorkItemsResolver });
+ findTokenSelector().vm.$emit('focus');
+ await waitForPromises();
+
+ expect(availableWorkItemsResolver).toHaveBeenCalledWith({
+ fullPath: 'test-project-path',
+ searchTerm: '',
+ types: [WORK_ITEM_TYPE_ENUM_TASK],
+ in: undefined,
+ });
+ expect(findTokenSelector().props('dropdownItems')).toHaveLength(3);
+ });
+
+ it('searches for available work items when typing in input', async () => {
+ createComponent({ workItemsResolver: searchedWorkItemResolver });
+ findTokenSelector().vm.$emit('focus');
+ findTokenSelector().vm.$emit('text-input', 'Task 2');
+ await waitForPromises();
+
+ expect(searchedWorkItemResolver).toHaveBeenCalledWith({
+ fullPath: 'test-project-path',
+ searchTerm: 'Task 2',
+ types: [WORK_ITEM_TYPE_ENUM_TASK],
+ in: 'TITLE',
+ });
+ expect(findTokenSelector().props('dropdownItems')).toHaveLength(1);
+ });
+
+ it('renders red border around token selector input when work item is not valid', () => {
+ createComponent({
+ areWorkItemsToAddValid: false,
+ });
+
+ expect(findTokenSelector().props('containerClass')).toBe('gl-inset-border-1-red-500!');
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
index 8caacc2dc97..aaab22fd18d 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_links_form_spec.js
@@ -1,11 +1,12 @@
import Vue from 'vue';
-import { GlForm, GlFormInput, GlFormCheckbox, GlTooltip, GlTokenSelector } from '@gitlab/ui';
+import { GlForm, GlFormInput, GlFormCheckbox, GlTooltip } from '@gitlab/ui';
import VueApollo from 'vue-apollo';
import { sprintf, s__ } from '~/locale';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import WorkItemLinksForm from '~/work_items/components/work_item_links/work_item_links_form.vue';
+import WorkItemTokenInput from '~/work_items/components/shared/work_item_token_input.vue';
import {
FORM_TYPES,
WORK_ITEM_TYPE_ENUM_TASK,
@@ -70,10 +71,12 @@ describe('WorkItemLinksForm', () => {
};
const findForm = () => wrapper.findComponent(GlForm);
- const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
+ const findWorkItemTokenInput = () => wrapper.findComponent(WorkItemTokenInput);
const findInput = () => wrapper.findComponent(GlFormInput);
const findConfidentialCheckbox = () => wrapper.findComponent(GlFormCheckbox);
+ const findTooltip = () => wrapper.findComponent(GlTooltip);
const findAddChildButton = () => wrapper.findByTestId('add-child-button');
+ const findValidationElement = () => wrapper.findByTestId('work-items-invalid');
describe('creating a new work item', () => {
beforeEach(async () => {
@@ -84,7 +87,7 @@ describe('WorkItemLinksForm', () => {
expect(findForm().exists()).toBe(true);
expect(findInput().exists()).toBe(true);
expect(findAddChildButton().text()).toBe('Create task');
- expect(findTokenSelector().exists()).toBe(false);
+ expect(findWorkItemTokenInput().exists()).toBe(false);
});
it('creates child task in non confidential parent', async () => {
@@ -137,7 +140,7 @@ describe('WorkItemLinksForm', () => {
const confidentialCheckbox = findConfidentialCheckbox();
expect(confidentialCheckbox.exists()).toBe(true);
- expect(wrapper.findComponent(GlTooltip).exists()).toBe(false);
+ expect(findTooltip().exists()).toBe(false);
expect(confidentialCheckbox.text()).toBe(
sprintf(I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_LABEL, {
workItemType: WORK_ITEM_TYPE_ENUM_TASK.toLocaleLowerCase(),
@@ -149,12 +152,11 @@ describe('WorkItemLinksForm', () => {
createComponent({ parentConfidential: true });
const confidentialCheckbox = findConfidentialCheckbox();
- const confidentialTooltip = wrapper.findComponent(GlTooltip);
expect(confidentialCheckbox.attributes('disabled')).toBeDefined();
expect(confidentialCheckbox.attributes('checked')).toBe('true');
- expect(confidentialTooltip.exists()).toBe(true);
- expect(confidentialTooltip.text()).toBe(
+ expect(findTooltip().exists()).toBe(true);
+ expect(findTooltip().text()).toBe(
sprintf(I18N_WORK_ITEM_CONFIDENTIALITY_CHECKBOX_TOOLTIP, {
workItemType: WORK_ITEM_TYPE_ENUM_TASK.toLocaleLowerCase(),
parentWorkItemType: WORK_ITEM_TYPE_VALUE_ISSUE.toLocaleLowerCase(),
@@ -165,14 +167,11 @@ describe('WorkItemLinksForm', () => {
});
describe('adding an existing work item', () => {
- const selectAvailableWorkItemTokens = async () => {
- findTokenSelector().vm.$emit(
+ const selectAvailableWorkItemTokens = () => {
+ findWorkItemTokenInput().vm.$emit(
'input',
availableWorkItemsResponse.data.workspace.workItems.nodes,
);
- findTokenSelector().vm.$emit('blur', new FocusEvent({ relatedTarget: null }));
-
- await waitForPromises();
};
beforeEach(async () => {
@@ -181,24 +180,31 @@ describe('WorkItemLinksForm', () => {
it('renders add form', () => {
expect(findForm().exists()).toBe(true);
- expect(findTokenSelector().exists()).toBe(true);
+ expect(findWorkItemTokenInput().exists()).toBe(true);
expect(findAddChildButton().text()).toBe('Add task');
expect(findInput().exists()).toBe(false);
expect(findConfidentialCheckbox().exists()).toBe(false);
});
- it('searches for available work items as prop when typing in input', async () => {
- findTokenSelector().vm.$emit('focus');
- findTokenSelector().vm.$emit('text-input', 'Task');
- await waitForPromises();
-
- expect(availableWorkItemsResolver).toHaveBeenCalled();
+ it('renders work item token input with default props', () => {
+ expect(findWorkItemTokenInput().props()).toMatchObject({
+ value: [],
+ fullPath: 'project/path',
+ childrenType: WORK_ITEM_TYPE_ENUM_TASK,
+ childrenIds: [],
+ parentWorkItemId: 'gid://gitlab/WorkItem/1',
+ areWorkItemsToAddValid: true,
+ });
});
it('selects and adds children', async () => {
await selectAvailableWorkItemTokens();
expect(findAddChildButton().text()).toBe('Add tasks');
+ expect(findWorkItemTokenInput().props('areWorkItemsToAddValid')).toBe(true);
+ expect(findWorkItemTokenInput().props('value')).toBe(
+ availableWorkItemsResponse.data.workspace.workItems.nodes,
+ );
findForm().vm.$emit('submit', {
preventDefault: jest.fn(),
});
@@ -211,9 +217,9 @@ describe('WorkItemLinksForm', () => {
await selectAvailableWorkItemTokens();
- const validationEl = wrapper.findByTestId('work-items-invalid');
- expect(validationEl.exists()).toBe(true);
- expect(validationEl.text().trim()).toBe(
+ expect(findWorkItemTokenInput().props('areWorkItemsToAddValid')).toBe(false);
+ expect(findValidationElement().exists()).toBe(true);
+ expect(findValidationElement().text().trim()).toBe(
sprintf(
s__(
'WorkItem|%{invalidWorkItemsList} cannot be added: Cannot assign a non-confidential %{childWorkItemType} to a confidential parent %{parentWorkItemType}. Make the selected %{childWorkItemType} confidential and try again.',
diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js
index 05e83c0df3d..ea4115f178f 100644
--- a/spec/frontend/work_items/mock_data.js
+++ b/spec/frontend/work_items/mock_data.js
@@ -1471,6 +1471,27 @@ export const availableWorkItemsResponse = {
},
};
+export const searchedWorkItemsResponse = {
+ data: {
+ workspace: {
+ __typename: 'Project',
+ id: 'gid://gitlab/Project/2',
+ workItems: {
+ nodes: [
+ {
+ id: 'gid://gitlab/WorkItem/459',
+ title: 'Task 2',
+ state: 'OPEN',
+ createdAt: '2022-08-03T12:41:54Z',
+ confidential: false,
+ __typename: 'WorkItem',
+ },
+ ],
+ },
+ },
+ },
+};
+
export const projectMembersResponseWithCurrentUser = {
data: {
workspace: {
diff --git a/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
index 50e20e4fbcf..21a820deaa4 100644
--- a/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
@@ -3,304 +3,244 @@
require 'spec_helper'
RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_gitlab_redis_shared_state do
- let_it_be(:user1) { build(:user, id: 1) }
+ let_it_be(:user) { build(:user, id: 1) }
let_it_be(:user2) { build(:user, id: 2) }
let_it_be(:user3) { build(:user, id: 3) }
let_it_be(:project) { create(:project) }
- let_it_be(:category) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CATEGORY }
- let_it_be(:event_action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_ACTION }
- let_it_be(:event_label) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_LABEL }
- let(:original_params) { nil }
- let(:event_property) { action }
let(:time) { Time.zone.now }
+ let(:namespace) { project&.namespace }
context 'for Issue title edit actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_TITLE_CHANGED }
- def track_action(params)
- described_class.track_issue_title_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_title_changed_action(author: user, project: project) }
end
end
context 'for Issue description edit actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_DESCRIPTION_CHANGED }
- def track_action(params)
- described_class.track_issue_description_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_description_changed_action(author: user, project: project) }
end
end
context 'for Issue assignee edit actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_ASSIGNEE_CHANGED }
- def track_action(params)
- described_class.track_issue_assignee_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_assignee_changed_action(author: user, project: project) }
end
end
context 'for Issue make confidential actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_MADE_CONFIDENTIAL }
- def track_action(params)
- described_class.track_issue_made_confidential_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_made_confidential_action(author: user, project: project) }
end
end
context 'for Issue make visible actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_MADE_VISIBLE }
- def track_action(params)
- described_class.track_issue_made_visible_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_made_visible_action(author: user, project: project) }
end
end
context 'for Issue created actions' do
- it_behaves_like 'tracked issuable internal event with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_CREATED }
- let(:original_params) { { namespace: project.project_namespace.reload } }
+ let(:project) { nil }
- def track_action(params)
- described_class.track_issue_created_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_created_action(author: user, namespace: namespace) }
end
end
context 'for Issue closed actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_CLOSED }
- def track_action(params)
- described_class.track_issue_closed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_closed_action(author: user, project: project) }
end
end
context 'for Issue reopened actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_REOPENED }
- def track_action(params)
- described_class.track_issue_reopened_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_reopened_action(author: user, project: project) }
end
end
context 'for Issue label changed actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_LABEL_CHANGED }
- def track_action(params)
- described_class.track_issue_label_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_label_changed_action(author: user, project: project) }
end
end
context 'for Issue label milestone actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_MILESTONE_CHANGED }
- def track_action(params)
- described_class.track_issue_milestone_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_milestone_changed_action(author: user, project: project) }
end
end
context 'for Issue cross-referenced actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_CROSS_REFERENCED }
- def track_action(params)
- described_class.track_issue_cross_referenced_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_cross_referenced_action(author: user, project: project) }
end
end
context 'for Issue moved actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_MOVED }
- def track_action(params)
- described_class.track_issue_moved_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_moved_action(author: user, project: project) }
end
end
context 'for Issue cloned actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
- let_it_be(:action) { described_class::ISSUE_CLONED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { described_class::ISSUE_CLONED }
- def track_action(params)
- described_class.track_issue_cloned_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_cloned_action(author: user, project: project) }
end
end
context 'for Issue relate actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_RELATED }
- def track_action(params)
- described_class.track_issue_related_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_related_action(author: user, project: project) }
end
end
context 'for Issue unrelate actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_UNRELATED }
- def track_action(params)
- described_class.track_issue_unrelated_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_unrelated_action(author: user, project: project) }
end
end
context 'for Issue marked as duplicate actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_MARKED_AS_DUPLICATE }
- def track_action(params)
- described_class.track_issue_marked_as_duplicate_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_marked_as_duplicate_action(author: user, project: project) }
end
end
context 'for Issue locked actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_LOCKED }
- def track_action(params)
- described_class.track_issue_locked_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_locked_action(author: user, project: project) }
end
end
context 'for Issue unlocked actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_UNLOCKED }
- def track_action(params)
- described_class.track_issue_unlocked_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_unlocked_action(author: user, project: project) }
end
end
context 'for Issue designs added actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_DESIGNS_ADDED }
- def track_action(params)
- described_class.track_issue_designs_added_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_designs_added_action(author: user, project: project) }
end
end
context 'for Issue designs modified actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_DESIGNS_MODIFIED }
- def track_action(params)
- described_class.track_issue_designs_modified_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_designs_modified_action(author: user, project: project) }
end
end
context 'for Issue designs removed actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_DESIGNS_REMOVED }
- def track_action(params)
- described_class.track_issue_designs_removed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_designs_removed_action(author: user, project: project) }
end
end
context 'for Issue due date changed actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_DUE_DATE_CHANGED }
- def track_action(params)
- described_class.track_issue_due_date_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_due_date_changed_action(author: user, project: project) }
end
end
context 'for Issue time estimate changed actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_TIME_ESTIMATE_CHANGED }
- def track_action(params)
- described_class.track_issue_time_estimate_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_time_estimate_changed_action(author: user, project: project) }
end
end
context 'for Issue time spent changed actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_TIME_SPENT_CHANGED }
- def track_action(params)
- described_class.track_issue_time_spent_changed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_time_spent_changed_action(author: user, project: project) }
end
end
context 'for Issue comment added actions', :snowplow do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_COMMENT_ADDED }
- def track_action(params)
- described_class.track_issue_comment_added_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_comment_added_action(author: user, project: project) }
end
end
context 'for Issue comment edited actions', :snowplow do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_COMMENT_EDITED }
- def track_action(params)
- described_class.track_issue_comment_edited_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_comment_edited_action(author: user, project: project) }
end
end
context 'for Issue comment removed actions', :snowplow do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_COMMENT_REMOVED }
- def track_action(params)
- described_class.track_issue_comment_removed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_comment_removed_action(author: user, project: project) }
end
end
context 'for Issue design comment removed actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'internal event tracking' do
let(:action) { described_class::ISSUE_DESIGN_COMMENT_REMOVED }
- def track_action(params)
- described_class.track_issue_design_comment_removed_action(**params)
- end
+ subject(:track_event) { described_class.track_issue_design_comment_removed_action(author: user, project: project) }
end
end
it 'can return the count of actions per user deduplicated' do
travel_to(Date.today.beginning_of_week) do # because events aggregated by week we need to emit events in the same week
- described_class.track_issue_title_changed_action(author: user1, project: project)
- described_class.track_issue_description_changed_action(author: user1, project: project)
- described_class.track_issue_assignee_changed_action(author: user1, project: project)
+ described_class.track_issue_title_changed_action(author: user, project: project)
+ described_class.track_issue_description_changed_action(author: user, project: project)
+ described_class.track_issue_assignee_changed_action(author: user, project: project)
end
travel_to(Date.today.beginning_of_week + 2.days) do
diff --git a/spec/models/resource_state_event_spec.rb b/spec/models/resource_state_event_spec.rb
index de101107268..5bd8b664d23 100644
--- a/spec/models/resource_state_event_spec.rb
+++ b/spec/models/resource_state_event_spec.rb
@@ -58,11 +58,13 @@ RSpec.describe ResourceStateEvent, feature_category: :team_planning, type: :mode
close_issue
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CLOSED }
+ it_behaves_like 'internal event tracking' do
+ subject(:service_action) { close_issue }
+
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CLOSED }
let(:project) { issue.project }
+ let(:namespace) { issue.project.namespace }
let(:user) { issue.author }
- subject(:service_action) { close_issue }
end
end
@@ -81,11 +83,13 @@ RSpec.describe ResourceStateEvent, feature_category: :team_planning, type: :mode
reopen_issue
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_REOPENED }
+ it_behaves_like 'internal event tracking' do
+ subject(:service_action) { reopen_issue }
+
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_REOPENED }
let(:project) { issue.project }
let(:user) { issue.author }
- subject(:service_action) { reopen_issue }
+ let(:namespace) { issue.project.namespace }
end
end
diff --git a/spec/services/design_management/delete_designs_service_spec.rb b/spec/services/design_management/delete_designs_service_spec.rb
index 22570a14443..b6a80cf26cc 100644
--- a/spec/services/design_management/delete_designs_service_spec.rb
+++ b/spec/services/design_management/delete_designs_service_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe DesignManagement::DeleteDesignsService, feature_category: :design
subject(:service) { described_class.new(project, user, issue: issue, designs: designs) }
- # Defined as a method so that the reponse is not cached. We also construct
+ # Defined as a method so that the response is not cached. We also construct
# a new service executor each time to avoid the intermediate cached values
# it constructs during its execution.
def run_service(delenda = nil)
@@ -173,8 +173,10 @@ RSpec.describe DesignManagement::DeleteDesignsService, feature_category: :design
run_service
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DESIGNS_REMOVED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DESIGNS_REMOVED }
+ let(:namespace) { project.namespace }
+
subject(:service_action) { run_service }
end
end
diff --git a/spec/services/design_management/save_designs_service_spec.rb b/spec/services/design_management/save_designs_service_spec.rb
index 7ce99fdd71f..24e37f2a840 100644
--- a/spec/services/design_management/save_designs_service_spec.rb
+++ b/spec/services/design_management/save_designs_service_spec.rb
@@ -121,8 +121,9 @@ RSpec.describe DesignManagement::SaveDesignsService, feature_category: :design_m
)
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DESIGNS_ADDED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DESIGNS_ADDED }
+ let(:namespace) { project.namespace }
subject(:service_action) { run_service }
end
@@ -219,8 +220,9 @@ RSpec.describe DesignManagement::SaveDesignsService, feature_category: :design_m
run_service
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DESIGNS_MODIFIED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DESIGNS_MODIFIED }
+ let(:namespace) { project.namespace }
subject(:service_action) { run_service }
end
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index 22509885c92..b5eb5f8037a 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -180,8 +180,9 @@ RSpec.describe Notes::CreateService, feature_category: :team_planning do
execute_create_service
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_COMMENT_ADDED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_COMMENT_ADDED }
+ let(:namespace) { project.namespace }
subject(:service_action) { execute_create_service }
end
end
diff --git a/spec/services/notes/destroy_service_spec.rb b/spec/services/notes/destroy_service_spec.rb
index 396e23351c9..54782774b4e 100644
--- a/spec/services/notes/destroy_service_spec.rb
+++ b/spec/services/notes/destroy_service_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe Notes::DestroyService, feature_category: :team_planning do
end
describe 'comment removed event tracking', :snowplow do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_COMMENT_REMOVED }
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_COMMENT_REMOVED }
let(:note) { create(:note, project: project, noteable: issue) }
let(:service_action) { described_class.new(project, user).execute(note) }
@@ -39,11 +39,12 @@ RSpec.describe Notes::DestroyService, feature_category: :team_planning do
expect do
service_action
end.to change {
- counter.unique_events(event_names: property, start_date: Date.today.beginning_of_week, end_date: 1.week.from_now)
+ counter.unique_events(event_names: action, start_date: Date.today.beginning_of_week, end_date: 1.week.from_now)
}.by(1)
end
- it_behaves_like 'issue_edit snowplow tracking' do
+ it_behaves_like 'internal event tracking' do
+ let(:namespace) { project.namespace }
subject(:execute_service_action) { service_action }
end
end
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
index e109bfbcd0b..8389db000b8 100644
--- a/spec/services/notes/update_service_spec.rb
+++ b/spec/services/notes/update_service_spec.rb
@@ -75,6 +75,13 @@ RSpec.describe Notes::UpdateService, feature_category: :team_planning do
update_note({})
end
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_COMMENT_EDITED }
+ let(:namespace) { project.namespace }
+
+ subject(:service_action) { update_note(note: 'new text') }
+ end
+
it 'tracks issue usage data', :clean_gitlab_redis_shared_state do
counter = Gitlab::UsageDataCounters::HLLRedisCounter
@@ -85,11 +92,6 @@ RSpec.describe Notes::UpdateService, feature_category: :team_planning do
update_note(note: 'new text')
end.to change { counter.unique_events(event_names: event, start_date: Date.today.beginning_of_week, end_date: 1.week.from_now) }.by(1)
end
-
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_COMMENT_EDITED }
- subject(:service_action) { update_note(note: 'new text') }
- end
end
context 'when note text was changed' do
diff --git a/spec/services/resource_events/change_labels_service_spec.rb b/spec/services/resource_events/change_labels_service_spec.rb
index 8393ce78df8..41aeafccf10 100644
--- a/spec/services/resource_events/change_labels_service_spec.rb
+++ b/spec/services/resource_events/change_labels_service_spec.rb
@@ -126,9 +126,11 @@ RSpec.describe ResourceEvents::ChangeLabelsService, feature_category: :team_plan
change_labels
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_LABEL_CHANGED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_LABEL_CHANGED }
let(:user) { author }
+ let(:namespace) { project.namespace }
+
subject(:service_action) { change_labels }
end
end
diff --git a/spec/services/system_notes/issuables_service_spec.rb b/spec/services/system_notes/issuables_service_spec.rb
index c6d5f3fa385..4a795f2db20 100644
--- a/spec/services/system_notes/issuables_service_spec.rb
+++ b/spec/services/system_notes/issuables_service_spec.rb
@@ -694,9 +694,10 @@ RSpec.describe ::SystemNotes::IssuablesService, feature_category: :team_planning
subject
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CLONED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CLONED }
let(:user) { author }
+ let(:namespace) { project.namespace }
end
end
end
diff --git a/spec/services/system_notes/time_tracking_service_spec.rb b/spec/services/system_notes/time_tracking_service_spec.rb
index a3793880ff1..52b99a6976d 100644
--- a/spec/services/system_notes/time_tracking_service_spec.rb
+++ b/spec/services/system_notes/time_tracking_service_spec.rb
@@ -118,10 +118,10 @@ RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_plann
subject
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DUE_DATE_CHANGED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_DUE_DATE_CHANGED }
let(:user) { author }
- subject(:service_action) { note }
+ let(:namespace) { project.namespace }
end
context 'when only start_date is added' do
@@ -231,10 +231,10 @@ RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_plann
subject
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_TIME_ESTIMATE_CHANGED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_TIME_ESTIMATE_CHANGED }
let(:user) { author }
- let(:service_action) { subject }
+ let(:namespace) { project.namespace }
end
end
@@ -363,13 +363,10 @@ RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_plann
subject
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_TIME_SPENT_CHANGED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_TIME_SPENT_CHANGED }
let(:user) { author }
- let(:service_action) do
- spend_time!(277200)
- subject
- end
+ let(:namespace) { project.namespace }
end
end
diff --git a/spec/services/work_items/update_service_spec.rb b/spec/services/work_items/update_service_spec.rb
index 8e19650d980..38e5d4dc153 100644
--- a/spec/services/work_items/update_service_spec.rb
+++ b/spec/services/work_items/update_service_spec.rb
@@ -76,9 +76,10 @@ RSpec.describe WorkItems::UpdateService, feature_category: :team_planning do
expect(update_work_item[:status]).to eq(:success)
end
- it_behaves_like 'issue_edit snowplow tracking' do
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_TITLE_CHANGED }
+ it_behaves_like 'internal event tracking' do
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_TITLE_CHANGED }
let(:user) { current_user }
+ let(:namespace) { project.namespace }
subject(:service_action) { update_work_item[:status] }
end
diff --git a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
deleted file mode 100644
index 9dc18555340..00000000000
--- a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'tracked issuable events' do
- before do
- stub_application_setting(usage_ping_enabled: true)
- end
-
- def count_unique(date_from: Date.today.beginning_of_week, date_to: 1.week.from_now)
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: action, start_date: date_from, end_date: date_to)
- end
-
- specify do
- aggregate_failures do
- expect(track_action({ author: user1 }.merge(track_params))).to be_truthy
- expect(track_action({ author: user1 }.merge(track_params))).to be_truthy
- expect(track_action({ author: user2 }.merge(track_params))).to be_truthy
- expect(count_unique).to eq(2)
- end
- end
-
- it 'does not track edit actions if author is not present' do
- expect(track_action({ author: nil }.merge(track_params))).to be_nil
- end
-end
-
-RSpec.shared_examples 'tracked issuable snowplow and service ping events for given event params' do
- it_behaves_like 'tracked issuable events'
-
- it 'emits snowplow event' do
- track_action({ author: user1 }.merge(track_params))
-
- expect_snowplow_event(**{ category: category, action: event_action, user: user1 }.merge(event_params))
- end
-end
-
-RSpec.shared_examples 'tracked issuable internal event for given event params' do
- it_behaves_like 'tracked issuable events'
-
- it_behaves_like 'internal event tracking' do
- subject(:track_event) { track_action({ author: user1 }.merge(track_params)) }
-
- let(:user) { user1 }
- let(:namespace) { project&.namespace }
- end
-end
-
-RSpec.shared_examples 'tracked issuable internal event with project' do
- it_behaves_like 'tracked issuable internal event for given event params' do
- let(:track_params) { original_params || { project: project } }
- end
-end
-
-RSpec.shared_examples 'tracked issuable snowplow and service ping events with project' do
- it_behaves_like 'tracked issuable snowplow and service ping events for given event params' do
- let(:context) do
- Gitlab::Tracking::ServicePingContext
- .new(data_source: :redis_hll, event: event_property)
- .to_h
- end
-
- let(:track_params) { original_params || { project: project } }
- let(:event_params) { { project: project }.merge(label: event_label, property: event_property, namespace: project.namespace, context: [context]) }
- end
-end
-
-RSpec.shared_examples 'tracked issuable snowplow and service ping events with namespace' do
- it_behaves_like 'tracked issuable snowplow and service ping events for given event params' do
- let(:context) do
- Gitlab::Tracking::ServicePingContext
- .new(data_source: :redis_hll, event: event_property)
- .to_h
- end
-
- let(:track_params) { { namespace: namespace } }
- let(:event_params) { track_params.merge(label: event_label, property: event_property, context: [context]) }
- end
-end
-
-RSpec.shared_examples 'does not track with namespace when feature flag is disabled' do |feature_flag|
- context "when feature flag #{feature_flag} is disabled" do
- it 'does not track action' do
- stub_feature_flags(feature_flag => false)
-
- expect(track_action(author: user1, namespace: namespace)).to be_nil
- end
- end
-end
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 966657152ec..3f7c86b2b11 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -22,7 +22,7 @@ require (
github.com/mitchellh/copystructure v1.2.0
github.com/prometheus/client_golang v1.16.0
github.com/rafaeljusto/redigomock/v3 v3.1.2
- github.com/redis/go-redis/v9 v9.0.5
+ github.com/redis/go-redis/v9 v9.1.0
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a
github.com/sirupsen/logrus v1.9.3
github.com/smartystreets/goconvey v1.7.2
diff --git a/workhorse/go.sum b/workhorse/go.sum
index ecdd5814887..5163d055187 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -869,7 +869,7 @@ github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
-github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=
+github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0=
github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
@@ -2051,8 +2051,8 @@ github.com/rafaeljusto/redigomock/v3 v3.1.2 h1:B4Y0XJQiPjpwYmkH55aratKX1VfR+JRqz
github.com/rafaeljusto/redigomock/v3 v3.1.2/go.mod h1:F9zPqz8rMriScZkPtUiLJoLruYcpGo/XXREpeyasREM=
github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=
-github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
+github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY=
+github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=