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>2021-01-08 03:10:44 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-01-08 03:10:44 +0300
commitd06b4740da9267bdfd42ab14c9893e3dd581f50d (patch)
tree5012bc99ccb8ab92ed321bb33a0b51858594ce84
parentfd320d0858df108b47ebadaa546a3c99f0e44cf1 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--app/assets/javascripts/performance_bar/components/detailed_metric.vue2
-rw-r--r--app/controllers/concerns/redis_tracking.rb2
-rw-r--r--app/graphql/types/board_type.rb8
-rw-r--r--app/models/concerns/issuable.rb3
-rw-r--r--app/presenters/board_presenter.rb5
-rw-r--r--app/services/packages/create_event_service.rb2
-rw-r--r--changelogs/unreleased/280535-fix-mr-analytics-query-error.yml5
-rw-r--r--changelogs/unreleased/292603-compliance-aggregated-usage-ping-metric.yml5
-rw-r--r--changelogs/unreleased/add_boards_url.yml5
-rw-r--r--config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/customize_homepage_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/default_to_issues_board_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/invite_members_empty_group_version_a_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/invite_members_empty_project_version_a_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/invite_members_new_dropdown_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/invite_members_version_b_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/jobs_empty_state_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/onboarding_issues_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/pipelines_empty_state_experiment_percentage.yml8
-rw-r--r--data/whats_new/202012160001_13_07.yml50
-rw-r--r--doc/api/graphql/reference/gitlab_schema.graphql10
-rw-r--r--doc/api/graphql/reference/gitlab_schema.json36
-rw-r--r--doc/api/graphql/reference/index.md2
-rw-r--r--doc/development/product_analytics/usage_ping.md14
-rw-r--r--doc/user/application_security/dast/index.md4
-rw-r--r--lib/api/helpers.rb2
-rw-r--r--lib/feature/shared.rb4
-rw-r--r--lib/gitlab/analytics/unique_visits.rb2
-rw-r--r--lib/gitlab/experimentation/experiment.rb20
-rw-r--r--lib/gitlab/url_builder.rb10
-rw-r--r--lib/gitlab/usage_data_counters/aggregated_metrics/common.yml3
-rw-r--r--lib/gitlab/usage_data_counters/editor_unique_counter.rb2
-rw-r--r--lib/gitlab/usage_data_counters/hll_redis_counter.rb29
-rw-r--r--lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb2
-rw-r--r--lib/gitlab/usage_data_counters/track_unique_events.rb4
-rw-r--r--lib/gitlab/utils/usage_data.rb2
-rw-r--r--lib/gitlab/webpack/manifest.rb4
-rw-r--r--spec/controllers/concerns/redis_tracking_spec.rb2
-rw-r--r--spec/factories/boards.rb4
-rw-r--r--spec/graphql/resolvers/merge_requests_resolver_spec.rb10
-rw-r--r--spec/graphql/types/board_type_spec.rb2
-rw-r--r--spec/lib/api/helpers_spec.rb2
-rw-r--r--spec/lib/gitlab/experimentation/experiment_spec.rb6
-rw-r--r--spec/lib/gitlab/experimentation_spec.rb2
-rw-r--r--spec/lib/gitlab/url_builder_spec.rb2
-rw-r--r--spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb138
-rw-r--r--spec/lib/gitlab/utils/usage_data_spec.rb2
-rw-r--r--spec/services/packages/create_event_service_spec.rb2
-rw-r--r--spec/support/helpers/stub_experiments.rb8
-rw-r--r--spec/support/helpers/stub_feature_flags.rb4
-rw-r--r--spec/support/shared_examples/controllers/unique_hll_events_examples.rb2
-rw-r--r--spec/support/shared_examples/lib/gitlab/usage_data_counters/incident_management_activity_shared_examples.rb2
54 files changed, 411 insertions, 104 deletions
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 10a1ac6c3a2..59470434801 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-1b2467043dfe265bc4091d2d6e93140d7614898b
+b1516d21d7a46991c77eff2acefe042bce89ebd8
diff --git a/app/assets/javascripts/performance_bar/components/detailed_metric.vue b/app/assets/javascripts/performance_bar/components/detailed_metric.vue
index d9fe09958e5..930c5e50511 100644
--- a/app/assets/javascripts/performance_bar/components/detailed_metric.vue
+++ b/app/assets/javascripts/performance_bar/components/detailed_metric.vue
@@ -141,7 +141,7 @@ export default {
</template>
</table>
- <template #footer>
+ <template #modal-footer>
<div></div>
</template>
</gl-modal>
diff --git a/app/controllers/concerns/redis_tracking.rb b/app/controllers/concerns/redis_tracking.rb
index d81bd10d5bb..d71935356b8 100644
--- a/app/controllers/concerns/redis_tracking.rb
+++ b/app/controllers/concerns/redis_tracking.rb
@@ -33,7 +33,7 @@ module RedisTracking
return unless metric_feature_enabled?(feature, feature_default_enabled)
return unless visitor_id
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(visitor_id, event_name)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: visitor_id)
end
def trackable_request?
diff --git a/app/graphql/types/board_type.rb b/app/graphql/types/board_type.rb
index f47c744d1bb..f576fd83840 100644
--- a/app/graphql/types/board_type.rb
+++ b/app/graphql/types/board_type.rb
@@ -7,6 +7,8 @@ module Types
accepts ::Board
authorize :read_board
+ present_using BoardPresenter
+
field :id, type: GraphQL::ID_TYPE, null: false,
description: 'ID (global ID) of the board'
field :name, type: GraphQL::STRING_TYPE, null: true,
@@ -24,6 +26,12 @@ module Types
description: 'Lists of the board',
resolver: Resolvers::BoardListsResolver,
extras: [:lookahead]
+
+ field :web_path, GraphQL::STRING_TYPE, null: false,
+ description: 'Web path of the board.'
+
+ field :web_url, GraphQL::STRING_TYPE, null: false,
+ description: 'Web URL of the board.'
end
end
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 2868e3ac80a..83ff5b16efe 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -352,12 +352,15 @@ module Issuable
#
# Returns an array of arel columns
def grouping_columns(sort)
+ sort = sort.to_s
grouping_columns = [arel_table[:id]]
if %w(milestone_due_desc milestone_due_asc milestone).include?(sort)
milestone_table = Milestone.arel_table
grouping_columns << milestone_table[:id]
grouping_columns << milestone_table[:due_date]
+ elsif %w(merged_at_desc merged_at_asc).include?(sort)
+ grouping_columns << MergeRequest::Metrics.arel_table[:merged_at]
end
grouping_columns
diff --git a/app/presenters/board_presenter.rb b/app/presenters/board_presenter.rb
new file mode 100644
index 00000000000..d7cecd44dd7
--- /dev/null
+++ b/app/presenters/board_presenter.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class BoardPresenter < Gitlab::View::Presenter::Delegated
+ presents :board
+end
diff --git a/app/services/packages/create_event_service.rb b/app/services/packages/create_event_service.rb
index 72662f93c05..fa0f0dbfab5 100644
--- a/app/services/packages/create_event_service.rb
+++ b/app/services/packages/create_event_service.rb
@@ -5,7 +5,7 @@ module Packages
def execute
if Feature.enabled?(:collect_package_events_redis)
::Packages::Event.unique_counters_for(event_scope, event_name, originator_type).each do |event_name|
- ::Gitlab::UsageDataCounters::HLLRedisCounter.track_event(current_user.id, event_name)
+ ::Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: current_user.id)
end
::Packages::Event.counters_for(event_scope, event_name, originator_type).each do |event_name|
diff --git a/changelogs/unreleased/280535-fix-mr-analytics-query-error.yml b/changelogs/unreleased/280535-fix-mr-analytics-query-error.yml
new file mode 100644
index 00000000000..28a8ecea268
--- /dev/null
+++ b/changelogs/unreleased/280535-fix-mr-analytics-query-error.yml
@@ -0,0 +1,5 @@
+---
+title: Fix merge request analytics page filtering when multiple labels are given
+merge_request: 51060
+author:
+type: fixed
diff --git a/changelogs/unreleased/292603-compliance-aggregated-usage-ping-metric.yml b/changelogs/unreleased/292603-compliance-aggregated-usage-ping-metric.yml
new file mode 100644
index 00000000000..a8519308f24
--- /dev/null
+++ b/changelogs/unreleased/292603-compliance-aggregated-usage-ping-metric.yml
@@ -0,0 +1,5 @@
+---
+title: Add aggregate/union visit tracking for Compliance features
+merge_request: 50978
+author:
+type: added
diff --git a/changelogs/unreleased/add_boards_url.yml b/changelogs/unreleased/add_boards_url.yml
new file mode 100644
index 00000000000..1342192ded2
--- /dev/null
+++ b/changelogs/unreleased/add_boards_url.yml
@@ -0,0 +1,5 @@
+---
+title: Exposed web_path and web_url fields in Board's GraphQL API
+merge_request: 50947
+author:
+type: added
diff --git a/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml b/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml
new file mode 100644
index 00000000000..3ed457acce8
--- /dev/null
+++ b/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: ci_syntax_templates_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48141
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/281057
+milestone: '13.8'
+type: experiment
+group: group::activation
+default_enabled: false
diff --git a/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml b/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml
new file mode 100644
index 00000000000..eff0d2785eb
--- /dev/null
+++ b/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: customize_homepage_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39348
+rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/187
+milestone: '13.4'
+type: experiment
+group: group::expansion
+default_enabled: false
diff --git a/config/feature_flags/experiment/default_to_issues_board_experiment_percentage.yml b/config/feature_flags/experiment/default_to_issues_board_experiment_percentage.yml
new file mode 100644
index 00000000000..d4a695502f9
--- /dev/null
+++ b/config/feature_flags/experiment/default_to_issues_board_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: default_to_issues_board_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43939
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/268298
+milestone: '13.5'
+type: experiment
+group: group::conversion
+default_enabled: true
diff --git a/config/feature_flags/experiment/invite_members_empty_group_version_a_experiment_percentage.yml b/config/feature_flags/experiment/invite_members_empty_group_version_a_experiment_percentage.yml
new file mode 100644
index 00000000000..6f8186a6888
--- /dev/null
+++ b/config/feature_flags/experiment/invite_members_empty_group_version_a_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: invite_members_empty_group_version_a_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45689
+rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/280
+milestone: '13.6'
+type: experiment
+group: group::expansion
+default_enabled: false
diff --git a/config/feature_flags/experiment/invite_members_empty_project_version_a_experiment_percentage.yml b/config/feature_flags/experiment/invite_members_empty_project_version_a_experiment_percentage.yml
new file mode 100644
index 00000000000..8b91ec9526c
--- /dev/null
+++ b/config/feature_flags/experiment/invite_members_empty_project_version_a_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: invite_members_empty_project_version_a_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49588
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/262014
+milestone: '13.7'
+type: experiment
+group: group::expansion
+default_enabled: false
diff --git a/config/feature_flags/experiment/invite_members_new_dropdown_experiment_percentage.yml b/config/feature_flags/experiment/invite_members_new_dropdown_experiment_percentage.yml
new file mode 100644
index 00000000000..6fac63b381c
--- /dev/null
+++ b/config/feature_flags/experiment/invite_members_new_dropdown_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: invite_members_new_dropdown_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50069
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/268129
+milestone: '13.8'
+type: experiment
+group: group::expansion
+default_enabled: false
diff --git a/config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml b/config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml
new file mode 100644
index 00000000000..b284a0e2f78
--- /dev/null
+++ b/config/feature_flags/experiment/invite_members_version_a_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: invite_members_version_a_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45689/
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/219239
+milestone: '13.6'
+type: experiment
+group: group::expansion
+default_enabled: false
diff --git a/config/feature_flags/experiment/invite_members_version_b_experiment_percentage.yml b/config/feature_flags/experiment/invite_members_version_b_experiment_percentage.yml
new file mode 100644
index 00000000000..069e740ba44
--- /dev/null
+++ b/config/feature_flags/experiment/invite_members_version_b_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: invite_members_version_b_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43900
+rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/214
+milestone: '13.5'
+type: experiment
+group: group::expansion
+default_enabled: false
diff --git a/config/feature_flags/experiment/jobs_empty_state_experiment_percentage.yml b/config/feature_flags/experiment/jobs_empty_state_experiment_percentage.yml
new file mode 100644
index 00000000000..33a15e28d44
--- /dev/null
+++ b/config/feature_flags/experiment/jobs_empty_state_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: jobs_empty_state_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48686
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/281054
+milestone: '13.7'
+type: experiment
+group: group::activation
+default_enabled: false
diff --git a/config/feature_flags/experiment/onboarding_issues_experiment_percentage.yml b/config/feature_flags/experiment/onboarding_issues_experiment_percentage.yml
new file mode 100644
index 00000000000..7a8f3074d96
--- /dev/null
+++ b/config/feature_flags/experiment/onboarding_issues_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: onboarding_issues_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31656/
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/224515
+milestone: '13.0'
+type: experiment
+group: group::conversion
+default_enabled: true
diff --git a/config/feature_flags/experiment/pipelines_empty_state_experiment_percentage.yml b/config/feature_flags/experiment/pipelines_empty_state_experiment_percentage.yml
new file mode 100644
index 00000000000..beb8e8a21c6
--- /dev/null
+++ b/config/feature_flags/experiment/pipelines_empty_state_experiment_percentage.yml
@@ -0,0 +1,8 @@
+---
+name: pipelines_empty_state_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47952
+rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/289
+milestone: '13.8'
+type: experiment
+group: group::activation
+default_enabled: false
diff --git a/data/whats_new/202012160001_13_07.yml b/data/whats_new/202012160001_13_07.yml
new file mode 100644
index 00000000000..63f8f857d71
--- /dev/null
+++ b/data/whats_new/202012160001_13_07.yml
@@ -0,0 +1,50 @@
+---
+- title: Auto rollback in case of failure
+ body: |
+ If you have a critical problem with a deployment, manual actions to fix it often take too long and lead to a degradation in production that impacts your users. Now, you can leverage an automatic rollback mechanism that reverts your deployment back to the last successful deployment. Also, when GitLab finds problems in production it automatically notifies you with an alert. This gives you peace of mind and precious development time to debug, investigate, and fix problems without causing downtime.
+ stage: Release
+ self-managed: true
+ gitlab-com: true
+ packages: [Ultimate]
+ url: https://docs.gitlab.com/ee/ci/environments/#auto-rollback
+ image_url: https://img.youtube.com/vi/G8fYYrxqF5E/hqdefault.jpg
+ published_at: 2020-12-22
+ release: 13.7
+- title: Reviewers for Merge Requests
+ body: |
+ Asking a colleague to review your code should be a routine part of contributing code, but it's often needlessly complex. A simple task like asking for a review can lead to confusion. For example, how should you ask? An email? Comment? Chat message? Without a formal process, reviews can be inconsistent and hard to keep track of. Previously, an option was to assign a reviewer to a merge request, but even with this formality, both the author and the reviewer appeared in the same assignee field, making it hard for other team members to know who was doing what.
+
+ GitLab 13.7 introduces reviewers for merge requests, which allows authors to request a review from someone. The new "Reviewers" field allows users to be designated as reviewers in a similar way to assignees. The reviewers receive a notification inviting them to review the merge request. This provides a formal process for requesting a review and clarifies the roles of each user in a merge request.
+
+ Future iterations will include showing the most relevant reviewers for a merge request as well as a streamlined merge request approval flow that puts reviewers at the center. You can follow along in the [merge request reviewer assignment epic](https://gitlab.com/groups/gitlab-org/-/epics/1823) for more details.
+ stage: Create
+ self-managed: true
+ gitlab-com: true
+ packages: [Core, Starter, Premium, Ultimate]
+ url: https://docs.gitlab.com/ee/user/project/merge_requests/getting_started#reviewer
+ image_url: https://about.gitlab.com/images/13_7/reviewers_sidebar.png
+ published_at: 2020-12-22
+ release: 13.7
+- title: Clone an issue with a quick action
+ body: |
+ To make generating similar issues more efficient, issues now support a `/clone` quick action, which creates a new issue in the same project, with an identical title, description, and metadata. The `/clone` quick action replaces a more cumbersome process, which involves multiple steps to create an issue, copy the ID or path of the source issue, and use the `copy_meta` quick action.
+
+ By default, issues are cloned into the same project and do not include system notes and comments, but you can also change the default behavior when cloning.
+ stage: Plan
+ self-managed: true
+ gitlab-com: true
+ packages: [Core, Starter, Premium, Ultimate]
+ url: https://docs.gitlab.com/ee/user/project/quick_actions.html
+ image_url: https://about.gitlab.com/images/13_7/clone_issue_with_quick_action.png
+ published_at: 2020-12-22
+ release: 13.7
+- title: GitLab Runner for Red Hat OpenShift
+ packages: [Core, Starter, Premium, Ultimate]
+ self-managed: true
+ gitlab-com: true
+ url: 'https://docs.gitlab.com/runner/install/openshift.html'
+ image_url: 'https://about.gitlab.com/images/13_7/runner-redhat-openshift.png'
+ stage: Verify
+ body: |
+ Available today is the GitLab Runner container image for the [Red Hat OpenShift Container Platform](https://www.openshift.com/products/container-platform). To install the runner on OpenShift, you can use the new [GitLab Runner Operator](https://gitlab.com/gitlab-org/gl-openshift/gitlab-runner-operator) available from the beta channel in Red Hat's Operator Hub - a web console for OpenShift cluster administrators to discover and select Operators to install on their cluster. Operator Hub is deployed by default in the OpenShift Container Platform. We plan to transition the GitLab Runner Operator to the stable channel, and by extension [GA](https://gitlab.com/gitlab-org/gl-openshift/gitlab-runner-operator/-/issues/6), in early 2021. Finally, we are also developing an operator for GitLab, so stay tuned to future release posts for those announcements.
+
diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql
index 79278b1496a..bf453f24e4b 100644
--- a/doc/api/graphql/reference/gitlab_schema.graphql
+++ b/doc/api/graphql/reference/gitlab_schema.graphql
@@ -1381,6 +1381,16 @@ type Board {
name: String
"""
+ Web path of the board.
+ """
+ webPath: String!
+
+ """
+ Web URL of the board.
+ """
+ webUrl: String!
+
+ """
Weight of the board
"""
weight: Int
diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json
index 969ac16422f..5a9925b114c 100644
--- a/doc/api/graphql/reference/gitlab_schema.json
+++ b/doc/api/graphql/reference/gitlab_schema.json
@@ -3638,6 +3638,42 @@
"deprecationReason": null
},
{
+ "name": "webPath",
+ "description": "Web path of the board.",
+ "args": [
+
+ ],
+ "type": {
+ "kind": "NON_NULL",
+ "name": null,
+ "ofType": {
+ "kind": "SCALAR",
+ "name": "String",
+ "ofType": null
+ }
+ },
+ "isDeprecated": false,
+ "deprecationReason": null
+ },
+ {
+ "name": "webUrl",
+ "description": "Web URL of the board.",
+ "args": [
+
+ ],
+ "type": {
+ "kind": "NON_NULL",
+ "name": null,
+ "ofType": {
+ "kind": "SCALAR",
+ "name": "String",
+ "ofType": null
+ }
+ },
+ "isDeprecated": false,
+ "deprecationReason": null
+ },
+ {
"name": "weight",
"description": "Weight of the board",
"args": [
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 36137c241a5..1a90b912c04 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -252,6 +252,8 @@ Represents a project or group board.
| `lists` | BoardListConnection | Lists of the board |
| `milestone` | Milestone | The board milestone |
| `name` | String | Name of the board |
+| `webPath` | String! | Web path of the board. |
+| `webUrl` | String! | Web URL of the board. |
| `weight` | Int | Weight of the board |
### BoardEpic
diff --git a/doc/development/product_analytics/usage_ping.md b/doc/development/product_analytics/usage_ping.md
index 98682ebfd76..0e739166602 100644
--- a/doc/development/product_analytics/usage_ping.md
+++ b/doc/development/product_analytics/usage_ping.md
@@ -474,19 +474,19 @@ Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PF
api.trackRedisHllUserEvent('my_already_defined_event_name'),
```
-1. Track event using base module `Gitlab::UsageDataCounters::HLLRedisCounter.track_event(values, event_name)`.
+1. Track event using base module `Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values:)`.
Arguments:
- - `values`: One value or array of values we count. For example: user_id, visitor_id, user_ids.
- `event_name`: event name.
+ - `values`: One value or array of values we count. For example: user_id, visitor_id, user_ids.
-1. Track event on context level using base module `Gitlab::UsageDataCounters::HLLRedisCounter.track_event_in_context(entity_id, event_name, context)`.
+1. Track event on context level using base module `Gitlab::UsageDataCounters::HLLRedisCounter.track_event_in_context(event_name, values:, context:)`.
Arguments:
- - `entity_id`: value we count. For example: user_id, visitor_id.
- `event_name`: event name.
+ - `values`: values we count. For example: user_id, visitor_id.
- `context`: context value. Allowed values are `default`, `free`, `bronze`, `silver`, `gold`, `starter`, `premium`, `ultimate`
1. Get event data using `Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names:, start_date:, end_date:, context: '')`.
@@ -503,8 +503,8 @@ Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PF
Trigger events in rails console by using `track_event` method
```ruby
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(1, 'g_compliance_audit_events')
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(2, 'g_compliance_audit_events')
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: 1)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_audit_events', values: [2, 3])
```
Next, get the unique events for the current week.
@@ -595,7 +595,7 @@ redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
# Tracking events
-Gitlab::UsageDataCounters::HLLRedisCounter.track_event(visitor_id, 'expand_vulnerabilities')
+Gitlab::UsageDataCounters::HLLRedisCounter.track_event('expand_vulnerabilities', values: visitor_id)
# Get unique events for metric
redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'expand_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 8e2768ee5cb..27e246913fa 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -183,6 +183,10 @@ To create masked variables for the username and password, see [Create a custom v
Note that the key of the username variable must be `DAST_USERNAME`
and the key of the password variable must be `DAST_PASSWORD`.
+After DAST has authenticated with the application, all cookies are collected from the web browser.
+For each cookie a matching session token is created for use by ZAP. This ensures ZAP is recognized
+by the application as correctly authenticated.
+
Other variables that are related to authenticated scans are:
```yaml
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 3742c3b1c36..1d008a1a58c 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -570,7 +570,7 @@ module API
return unless Feature.enabled?(feature_flag, default_enabled: true)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(values, event_name)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: values)
rescue => error
Gitlab::AppLogger.warn("Redis tracking event failed for event: #{event_name}, message: #{error.message}")
end
diff --git a/lib/feature/shared.rb b/lib/feature/shared.rb
index 17dfe26bd82..5ad9af6ff7d 100644
--- a/lib/feature/shared.rb
+++ b/lib/feature/shared.rb
@@ -53,10 +53,12 @@ class Feature
description: 'Short lived, used specifically to run A/B/n experiments.',
optional: true,
rollout_issue: true,
- ee_only: true,
+ ee_only: false,
default_enabled: false,
example: <<-EOS
experiment(:my_experiment, project: project, actor: current_user) { ...variant code... }
+ # or
+ Gitlab::Experimentation.in_experiment_group?(:my_experiment, subject: current_user)
EOS
}
}.freeze
diff --git a/lib/gitlab/analytics/unique_visits.rb b/lib/gitlab/analytics/unique_visits.rb
index 292048dcad9..e367d33d743 100644
--- a/lib/gitlab/analytics/unique_visits.rb
+++ b/lib/gitlab/analytics/unique_visits.rb
@@ -4,7 +4,7 @@ module Gitlab
module Analytics
class UniqueVisits
def track_visit(visitor_id, target_id, time = Time.zone.now)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(visitor_id, target_id, time)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(target_id, values: visitor_id, time: time)
end
# Returns number of unique visitors for given targets in given time frame
diff --git a/lib/gitlab/experimentation/experiment.rb b/lib/gitlab/experimentation/experiment.rb
index e594c3bedeb..36cd673a38f 100644
--- a/lib/gitlab/experimentation/experiment.rb
+++ b/lib/gitlab/experimentation/experiment.rb
@@ -3,17 +3,21 @@
module Gitlab
module Experimentation
class Experiment
+ FEATURE_FLAG_SUFFIX = "_experiment_percentage"
+
attr_reader :key, :tracking_category, :use_backwards_compatible_subject_index
def initialize(key, **params)
@key = key
@tracking_category = params[:tracking_category]
@use_backwards_compatible_subject_index = params[:use_backwards_compatible_subject_index]
-
- @experiment_percentage = Feature.get(:"#{key}_experiment_percentage").percentage_of_time_value # rubocop:disable Gitlab/AvoidFeatureGet
end
def active?
+ # TODO: just touch a feature flag
+ # Temporary change, we will change `experiment_percentage` in future to `Feature.enabled?
+ Feature.enabled?(feature_flag_name, type: :experiment, default_enabled: :yaml)
+
::Gitlab.dev_env_or_com? && experiment_percentage > 0
end
@@ -25,7 +29,17 @@ module Gitlab
private
- attr_reader :experiment_percentage
+ def experiment_percentage
+ feature_flag.percentage_of_time_value
+ end
+
+ def feature_flag
+ Feature.get(feature_flag_name) # rubocop:disable Gitlab/AvoidFeatureGet
+ end
+
+ def feature_flag_name
+ :"#{key}#{FEATURE_FLAG_SUFFIX}"
+ end
end
end
end
diff --git a/lib/gitlab/url_builder.rb b/lib/gitlab/url_builder.rb
index ce59e10241e..f98c488bbe5 100644
--- a/lib/gitlab/url_builder.rb
+++ b/lib/gitlab/url_builder.rb
@@ -18,6 +18,8 @@ module Gitlab
def build(object, **options)
# Objects are sometimes wrapped in a BatchLoader instance
case object.itself
+ when Board
+ board_url(object, **options)
when ::Ci::Build
instance.project_job_url(object.project, object, **options)
when Commit
@@ -52,6 +54,14 @@ module Gitlab
end
# rubocop:enable Metrics/CyclomaticComplexity
+ def board_url(board, **options)
+ if board.project_board?
+ instance.project_board_url(board.resource_parent, board, **options)
+ else
+ instance.group_board_url(board.resource_parent, board, **options)
+ end
+ end
+
def commit_url(commit, **options)
return '' unless commit.project
diff --git a/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml b/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml
index a7a2a058483..4966afd534a 100644
--- a/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml
+++ b/lib/gitlab/usage_data_counters/aggregated_metrics/common.yml
@@ -8,6 +8,9 @@
# Corresponding feature flag should have `default_enabled` attribute set to `false`.
# This attribute is OPTIONAL and can be omitted, when `feature_flag` is missing no feature flag will be checked.
---
+- name: compliance_features_track_unique_visits_union
+ operator: OR
+ events: ['g_compliance_audit_events', 'g_compliance_dashboard', 'i_compliance_audit_events', 'a_compliance_audit_events_api', 'i_compliance_credential_inventory']
- name: product_analytics_test_metrics_union
operator: OR
events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
diff --git a/lib/gitlab/usage_data_counters/editor_unique_counter.rb b/lib/gitlab/usage_data_counters/editor_unique_counter.rb
index eeb26c11bfa..bef3fc7b504 100644
--- a/lib/gitlab/usage_data_counters/editor_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/editor_unique_counter.rb
@@ -53,7 +53,7 @@ module Gitlab
return unless Feature.enabled?(:track_editor_edit_actions, default_enabled: true)
return unless author
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(author.id, action, time)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(action, values: author.id, time: time)
end
def count_unique(actions, date_from, date_to)
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
index 51435bbca4e..47361d831b2 100644
--- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
@@ -39,20 +39,31 @@ module Gitlab
#
# Usage:
#
- # * Track event: Gitlab::UsageDataCounters::HLLRedisCounter.track_event(user_id, 'g_compliance_dashboard')
+ # * Track event: Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_dashboard', values: user_id)
# * Get unique counts per user: Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'g_compliance_dashboard', start_date: 28.days.ago, end_date: Date.current)
class << self
include Gitlab::Utils::UsageData
- def track_event(value, event_name, time = Time.zone.now)
- track(value, event_name, time: time)
- end
-
- def track_event_in_context(value, event_name, context, time = Time.zone.now)
+ # Track unique events
+ #
+ # event_name - The event name.
+ # values - One or multiple values counted.
+ # time - Time of the action, set to Time.current.
+ def track_event(event_name, values:, time: Time.current)
+ track(values, event_name, time: time)
+ end
+
+ # Track unique events
+ #
+ # event_name - The event name.
+ # values - One or multiple values counted.
+ # context - Event context, plan level tracking.
+ # time - Time of the action, set to Time.current.
+ def track_event_in_context(event_name, values:, context:, time: Time.zone.now)
return if context.blank?
return unless context.in?(valid_context_list)
- track(value, event_name, context: context, time: time)
+ track(values, event_name, context: context, time: time)
end
def unique_events(event_names:, start_date:, end_date:, context: '')
@@ -114,13 +125,13 @@ module Gitlab
private
- def track(value, event_name, context: '', time: Time.zone.now)
+ def track(values, event_name, context: '', time: Time.zone.now)
return unless Gitlab::CurrentSettings.usage_ping_enabled?
event = event_for(event_name)
raise UnknownEvent, "Unknown event #{event_name}" unless event.present?
- Gitlab::Redis::HLL.add(key: redis_key(event, time, context), value: value, expiry: expiry(event))
+ Gitlab::Redis::HLL.add(key: redis_key(event, time, context), value: values, expiry: expiry(event))
end
# The array of valid context on which we allow tracking
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 0fed8e1c211..f649e7f407d 100644
--- a/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
@@ -148,7 +148,7 @@ module Gitlab
return unless Feature.enabled?(:track_issue_activity_actions, default_enabled: true)
return unless author
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(author.id, action, time)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(action, values: author.id, time: time)
end
end
end
diff --git a/lib/gitlab/usage_data_counters/track_unique_events.rb b/lib/gitlab/usage_data_counters/track_unique_events.rb
index 95380ae0b1d..20da9665876 100644
--- a/lib/gitlab/usage_data_counters/track_unique_events.rb
+++ b/lib/gitlab/usage_data_counters/track_unique_events.rb
@@ -43,7 +43,7 @@ module Gitlab
return unless Gitlab::UsageDataCounters::HLLRedisCounter.known_event?(transformed_action.to_s)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(author_id, transformed_action.to_s, time)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(transformed_action.to_s, values: author_id, time: time)
track_git_write_action(author_id, transformed_action, time)
end
@@ -73,7 +73,7 @@ module Gitlab
def track_git_write_action(author_id, transformed_action, time)
return unless GIT_WRITE_ACTIONS.include?(transformed_action)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(author_id, GIT_WRITE_ACTION, time)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(GIT_WRITE_ACTION, values: author_id, time: time)
end
end
end
diff --git a/lib/gitlab/utils/usage_data.rb b/lib/gitlab/utils/usage_data.rb
index 9ed0dfde7fe..baccadd9594 100644
--- a/lib/gitlab/utils/usage_data.rb
+++ b/lib/gitlab/utils/usage_data.rb
@@ -122,7 +122,7 @@ module Gitlab
def track_usage_event(event_name, values)
return unless Feature.enabled?(:"usage_data_#{event_name}", default_enabled: true)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(values, event_name.to_s)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name.to_s, values: values)
end
private
diff --git a/lib/gitlab/webpack/manifest.rb b/lib/gitlab/webpack/manifest.rb
index 5873d9c2b99..9c967d99e3a 100644
--- a/lib/gitlab/webpack/manifest.rb
+++ b/lib/gitlab/webpack/manifest.rb
@@ -69,8 +69,8 @@ module Gitlab
def manifest
if Gitlab.config.webpack.dev_server.enabled
- # Don't cache if we're in dev server mode, manifest may change ...
- load_manifest
+ # Only cache at request level if we're in dev server mode, manifest may change ...
+ Gitlab::SafeRequestStore.fetch('manifest.json') { load_manifest }
else
# ... otherwise cache at class level, as JSON loading/parsing can be expensive
strong_memoize(:manifest) { load_manifest }
diff --git a/spec/controllers/concerns/redis_tracking_spec.rb b/spec/controllers/concerns/redis_tracking_spec.rb
index 831f5ad7bb1..ef59adf8c1d 100644
--- a/spec/controllers/concerns/redis_tracking_spec.rb
+++ b/spec/controllers/concerns/redis_tracking_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe RedisTracking do
def expect_tracking
expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event)
- .with(instance_of(String), 'g_compliance_approval_rules')
+ .with('g_compliance_approval_rules', values: instance_of(String))
end
def expect_no_tracking
diff --git a/spec/factories/boards.rb b/spec/factories/boards.rb
index cef7ec37f07..9ea8f3ad06f 100644
--- a/spec/factories/boards.rb
+++ b/spec/factories/boards.rb
@@ -31,4 +31,8 @@ FactoryBot.define do
board.lists.create!(list_type: :closed)
end
end
+
+ factory :group_board, parent: :board do
+ group
+ end
end
diff --git a/spec/graphql/resolvers/merge_requests_resolver_spec.rb b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
index 63fbd04848d..50b9243efa5 100644
--- a/spec/graphql/resolvers/merge_requests_resolver_spec.rb
+++ b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
@@ -231,6 +231,16 @@ RSpec.describe Resolvers::MergeRequestsResolver do
it 'sorts merge requests descending' do
expect(resolve_mr(project, sort: :merged_at_desc)).to eq [merge_request_3, merge_request_1, merge_request_with_milestone, merge_request_6, merge_request_5, merge_request_4, merge_request_2]
end
+
+ context 'when label filter is given and the optimized_issuable_label_filter feature flag is off' do
+ before do
+ stub_feature_flags(optimized_issuable_label_filter: false)
+ end
+
+ it 'does not raise PG::GroupingError' do
+ expect { resolve_mr(project, sort: :merged_at_desc, labels: %w[a b]) }.not_to raise_error
+ end
+ end
end
end
end
diff --git a/spec/graphql/types/board_type_spec.rb b/spec/graphql/types/board_type_spec.rb
index b02b342390d..5ea87d5f473 100644
--- a/spec/graphql/types/board_type_spec.rb
+++ b/spec/graphql/types/board_type_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe GitlabSchema.types['Board'] do
specify { expect(described_class).to require_graphql_authorizations(:read_board) }
it 'has specific fields' do
- expected_fields = %w[id name]
+ expected_fields = %w[id name web_url web_path]
expect(described_class).to include_graphql_fields(*expected_fields)
end
diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb
index be5f0cc9f9a..e78189bb512 100644
--- a/spec/lib/api/helpers_spec.rb
+++ b/spec/lib/api/helpers_spec.rb
@@ -205,7 +205,7 @@ RSpec.describe API::Helpers do
end
it 'tracks redis hll event' do
- expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(value, event_name)
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: value)
subject.increment_unique_values(event_name, value)
end
diff --git a/spec/lib/gitlab/experimentation/experiment_spec.rb b/spec/lib/gitlab/experimentation/experiment_spec.rb
index 7b1d1763010..008e6699597 100644
--- a/spec/lib/gitlab/experimentation/experiment_spec.rb
+++ b/spec/lib/gitlab/experimentation/experiment_spec.rb
@@ -14,8 +14,10 @@ RSpec.describe Gitlab::Experimentation::Experiment do
end
before do
- feature = double('FeatureFlag', percentage_of_time_value: percentage )
- expect(Feature).to receive(:get).with(:experiment_key_experiment_percentage).and_return(feature)
+ skip_feature_flags_yaml_validation
+ skip_default_enabled_yaml_check
+ feature = double('FeatureFlag', percentage_of_time_value: percentage, enabled?: true)
+ allow(Feature).to receive(:get).with(:experiment_key_experiment_percentage).and_return(feature)
end
subject(:experiment) { described_class.new(:experiment_key, **params) }
diff --git a/spec/lib/gitlab/experimentation_spec.rb b/spec/lib/gitlab/experimentation_spec.rb
index a68c050d829..b503960b8c7 100644
--- a/spec/lib/gitlab/experimentation_spec.rb
+++ b/spec/lib/gitlab/experimentation_spec.rb
@@ -38,6 +38,8 @@ RSpec.describe Gitlab::Experimentation do
}
})
+ skip_feature_flags_yaml_validation
+ skip_default_enabled_yaml_check
Feature.enable_percentage_of_time(:backwards_compatible_test_experiment_experiment_percentage, enabled_percentage)
Feature.enable_percentage_of_time(:test_experiment_experiment_percentage, enabled_percentage)
allow(Gitlab).to receive(:com?).and_return(true)
diff --git a/spec/lib/gitlab/url_builder_spec.rb b/spec/lib/gitlab/url_builder_spec.rb
index c892f1f0410..6d055fe3643 100644
--- a/spec/lib/gitlab/url_builder_spec.rb
+++ b/spec/lib/gitlab/url_builder_spec.rb
@@ -18,6 +18,8 @@ RSpec.describe Gitlab::UrlBuilder do
where(:factory, :path_generator) do
:project | ->(project) { "/#{project.full_path}" }
+ :board | ->(board) { "/#{board.project.full_path}/-/boards/#{board.id}" }
+ :group_board | ->(board) { "/groups/#{board.group.full_path}/-/boards/#{board.id}" }
:commit | ->(commit) { "/#{commit.project.full_path}/-/commit/#{commit.id}" }
:issue | ->(issue) { "/#{issue.project.full_path}/-/issues/#{issue.iid}" }
:merge_request | ->(merge_request) { "/#{merge_request.project.full_path}/-/merge_requests/#{merge_request.iid}" }
diff --git a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
index b7c3c8346dc..4fa3468f179 100644
--- a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
@@ -88,7 +88,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
it 'does not track the event' do
stub_application_setting(usage_ping_enabled: false)
- described_class.track_event(entity1, weekly_event, Date.current)
+ described_class.track_event(weekly_event, values: entity1, time: Date.current)
expect(Gitlab::Redis::HLL).not_to receive(:add)
end
@@ -102,20 +102,27 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
it 'tracks event when using symbol' do
expect(Gitlab::Redis::HLL).to receive(:add)
- described_class.track_event(entity1, :g_analytics_contribution)
+ described_class.track_event(:g_analytics_contribution, values: entity1)
+ end
+
+ it 'tracks events with multiple values' do
+ values = [entity1, entity2]
+ expect(Gitlab::Redis::HLL).to receive(:add).with(key: /g_{analytics}_contribution/, value: values, expiry: 84.days)
+
+ described_class.track_event(:g_analytics_contribution, values: values)
end
it "raise error if metrics don't have same aggregation" do
- expect { described_class.track_event(entity1, different_aggregation, Date.current) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownAggregation)
+ expect { described_class.track_event(different_aggregation, values: entity1, time: Date.current) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownAggregation)
end
it 'raise error if metrics of unknown aggregation' do
- expect { described_class.track_event(entity1, 'unknown', Date.current) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownEvent)
+ expect { described_class.track_event('unknown', values: entity1, time: Date.current) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownEvent)
end
context 'for weekly events' do
it 'sets the keys in Redis to expire automatically after the given expiry time' do
- described_class.track_event(entity1, "g_analytics_contribution")
+ described_class.track_event("g_analytics_contribution", values: entity1)
Gitlab::Redis::SharedState.with do |redis|
keys = redis.scan_each(match: "g_{analytics}_contribution-*").to_a
@@ -128,7 +135,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
end
it 'sets the keys in Redis to expire automatically after 6 weeks by default' do
- described_class.track_event(entity1, "g_compliance_dashboard")
+ described_class.track_event("g_compliance_dashboard", values: entity1)
Gitlab::Redis::SharedState.with do |redis|
keys = redis.scan_each(match: "g_{compliance}_dashboard-*").to_a
@@ -143,7 +150,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
context 'for daily events' do
it 'sets the keys in Redis to expire after the given expiry time' do
- described_class.track_event(entity1, "g_analytics_search")
+ described_class.track_event("g_analytics_search", values: entity1)
Gitlab::Redis::SharedState.with do |redis|
keys = redis.scan_each(match: "*-g_{analytics}_search").to_a
@@ -156,7 +163,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
end
it 'sets the keys in Redis to expire after 29 days by default' do
- described_class.track_event(entity1, "no_slot")
+ described_class.track_event("no_slot", values: entity1)
Gitlab::Redis::SharedState.with do |redis|
keys = redis.scan_each(match: "*-{no_slot}").to_a
@@ -173,12 +180,19 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
describe '.track_event_in_context' do
context 'with valid contex' do
- it 'increments conext event counte' do
+ it 'increments context event counter' do
expect(Gitlab::Redis::HLL).to receive(:add) do |kwargs|
expect(kwargs[:key]).to match(/^#{default_context}\_.*/)
end
- described_class.track_event_in_context(entity1, context_event, default_context)
+ described_class.track_event_in_context(context_event, values: entity1, context: default_context)
+ end
+
+ it 'tracks events with multiple values' do
+ values = [entity1, entity2]
+ expect(Gitlab::Redis::HLL).to receive(:add).with(key: /g_{analytics}_contribution/, value: values, expiry: 84.days)
+
+ described_class.track_event_in_context(:g_analytics_contribution, values: values, context: default_context)
end
end
@@ -186,7 +200,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
it 'does not increment a counter' do
expect(Gitlab::Redis::HLL).not_to receive(:add)
- described_class.track_event_in_context(entity1, context_event, '')
+ described_class.track_event_in_context(context_event, values: entity1, context: '')
end
end
@@ -194,7 +208,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
it 'does not increment a counter' do
expect(Gitlab::Redis::HLL).not_to receive(:add)
- described_class.track_event_in_context(entity1, context_event, invalid_context)
+ described_class.track_event_in_context(context_event, values: entity1, context: invalid_context)
end
end
end
@@ -202,35 +216,35 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
describe '.unique_events' do
before do
# events in current week, should not be counted as week is not complete
- described_class.track_event(entity1, weekly_event, Date.current)
- described_class.track_event(entity2, weekly_event, Date.current)
+ described_class.track_event(weekly_event, values: entity1, time: Date.current)
+ described_class.track_event(weekly_event, values: entity2, time: Date.current)
# Events last week
- described_class.track_event(entity1, weekly_event, 2.days.ago)
- described_class.track_event(entity1, weekly_event, 2.days.ago)
- described_class.track_event(entity1, no_slot, 2.days.ago)
+ described_class.track_event(weekly_event, values: entity1, time: 2.days.ago)
+ described_class.track_event(weekly_event, values: entity1, time: 2.days.ago)
+ described_class.track_event(no_slot, values: entity1, time: 2.days.ago)
# Events 2 weeks ago
- described_class.track_event(entity1, weekly_event, 2.weeks.ago)
+ described_class.track_event(weekly_event, values: entity1, time: 2.weeks.ago)
# Events 4 weeks ago
- described_class.track_event(entity3, weekly_event, 4.weeks.ago)
- described_class.track_event(entity4, weekly_event, 29.days.ago)
+ described_class.track_event(weekly_event, values: entity3, time: 4.weeks.ago)
+ described_class.track_event(weekly_event, values: entity4, time: 29.days.ago)
# events in current day should be counted in daily aggregation
- described_class.track_event(entity1, daily_event, Date.current)
- described_class.track_event(entity2, daily_event, Date.current)
+ described_class.track_event(daily_event, values: entity1, time: Date.current)
+ described_class.track_event(daily_event, values: entity2, time: Date.current)
# Events last week
- described_class.track_event(entity1, daily_event, 2.days.ago)
- described_class.track_event(entity1, daily_event, 2.days.ago)
+ described_class.track_event(daily_event, values: entity1, time: 2.days.ago)
+ described_class.track_event(daily_event, values: entity1, time: 2.days.ago)
# Events 2 weeks ago
- described_class.track_event(entity1, daily_event, 14.days.ago)
+ described_class.track_event(daily_event, values: entity1, time: 14.days.ago)
# Events 4 weeks ago
- described_class.track_event(entity3, daily_event, 28.days.ago)
- described_class.track_event(entity4, daily_event, 29.days.ago)
+ described_class.track_event(daily_event, values: entity3, time: 28.days.ago)
+ described_class.track_event(daily_event, values: entity4, time: 29.days.ago)
end
it 'raise error if metrics are not in the same slot' do
@@ -338,10 +352,10 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
allow(described_class).to receive(:known_events).and_return(known_events)
allow(described_class).to receive(:categories).and_return(%w(category1 category2))
- described_class.track_event_in_context([entity1, entity3], 'event_name_1', default_context, 2.days.ago)
- described_class.track_event_in_context(entity3, 'event_name_1', default_context, 2.days.ago)
- described_class.track_event_in_context(entity3, 'event_name_1', invalid_context, 2.days.ago)
- described_class.track_event_in_context([entity1, entity2], 'event_name_2', '', 2.weeks.ago)
+ described_class.track_event_in_context('event_name_1', values: [entity1, entity3], context: default_context, time: 2.days.ago)
+ described_class.track_event_in_context('event_name_1', values: entity3, context: default_context, time: 2.days.ago)
+ described_class.track_event_in_context('event_name_1', values: entity3, context: invalid_context, time: 2.days.ago)
+ described_class.track_event_in_context('event_name_2', values: [entity1, entity2], context: '', time: 2.weeks.ago)
end
subject(:unique_events) { described_class.unique_events(event_names: event_names, start_date: 4.weeks.ago, end_date: Date.current, context: context) }
@@ -379,13 +393,13 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
allow(described_class).to receive(:known_events).and_return(known_events)
allow(described_class).to receive(:categories).and_return(%w(category1 category2))
- described_class.track_event(entity1, 'event1_slot', 2.days.ago)
- described_class.track_event(entity2, 'event2_slot', 2.days.ago)
- described_class.track_event(entity3, 'event2_slot', 2.weeks.ago)
+ described_class.track_event('event1_slot', values: entity1, time: 2.days.ago)
+ described_class.track_event('event2_slot', values: entity2, time: 2.days.ago)
+ described_class.track_event('event2_slot', values: entity3, time: 2.weeks.ago)
# events in different slots
- described_class.track_event(entity2, 'event3', 2.days.ago)
- described_class.track_event(entity2, 'event4', 2.days.ago)
+ described_class.track_event('event3', values: entity2, time: 2.days.ago)
+ described_class.track_event('event4', values: entity2, time: 2.days.ago)
end
it 'returns the number of unique events for all known events' do
@@ -509,23 +523,23 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
subject(:aggregated_metrics_data) { described_class.aggregated_metrics_weekly_data }
before do
- described_class.track_event(entity1, 'event1_slot', 2.days.ago)
- described_class.track_event(entity2, 'event1_slot', 2.days.ago)
- described_class.track_event(entity3, 'event1_slot', 2.days.ago)
- described_class.track_event(entity1, 'event2_slot', 2.days.ago)
- described_class.track_event(entity2, 'event2_slot', 3.days.ago)
- described_class.track_event(entity3, 'event2_slot', 3.days.ago)
- described_class.track_event(entity1, 'event3_slot', 3.days.ago)
- described_class.track_event(entity2, 'event3_slot', 3.days.ago)
- described_class.track_event(entity2, 'event5_slot', 3.days.ago)
+ described_class.track_event('event1_slot', values: entity1, time: 2.days.ago)
+ described_class.track_event('event1_slot', values: entity2, time: 2.days.ago)
+ described_class.track_event('event1_slot', values: entity3, time: 2.days.ago)
+ described_class.track_event('event2_slot', values: entity1, time: 2.days.ago)
+ described_class.track_event('event2_slot', values: entity2, time: 3.days.ago)
+ described_class.track_event('event2_slot', values: entity3, time: 3.days.ago)
+ described_class.track_event('event3_slot', values: entity1, time: 3.days.ago)
+ described_class.track_event('event3_slot', values: entity2, time: 3.days.ago)
+ described_class.track_event('event5_slot', values: entity2, time: 3.days.ago)
# events out of time scope
- described_class.track_event(entity3, 'event2_slot', 8.days.ago)
+ described_class.track_event('event2_slot', values: entity3, time: 8.days.ago)
# events in different slots
- described_class.track_event(entity1, 'event4', 2.days.ago)
- described_class.track_event(entity2, 'event4', 2.days.ago)
- described_class.track_event(entity4, 'event4', 2.days.ago)
+ described_class.track_event('event4', values: entity1, time: 2.days.ago)
+ described_class.track_event('event4', values: entity2, time: 2.days.ago)
+ described_class.track_event('event4', values: entity4, time: 2.days.ago)
end
it_behaves_like 'aggregated_metrics_data'
@@ -536,23 +550,23 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
it_behaves_like 'aggregated_metrics_data' do
before do
- described_class.track_event(entity1, 'event1_slot', 2.days.ago)
- described_class.track_event(entity2, 'event1_slot', 2.days.ago)
- described_class.track_event(entity3, 'event1_slot', 2.days.ago)
- described_class.track_event(entity1, 'event2_slot', 2.days.ago)
- described_class.track_event(entity2, 'event2_slot', 3.days.ago)
- described_class.track_event(entity3, 'event2_slot', 3.days.ago)
- described_class.track_event(entity1, 'event3_slot', 3.days.ago)
- described_class.track_event(entity2, 'event3_slot', 10.days.ago)
- described_class.track_event(entity2, 'event5_slot', 4.weeks.ago.advance(days: 1))
+ described_class.track_event('event1_slot', values: entity1, time: 2.days.ago)
+ described_class.track_event('event1_slot', values: entity2, time: 2.days.ago)
+ described_class.track_event('event1_slot', values: entity3, time: 2.days.ago)
+ described_class.track_event('event2_slot', values: entity1, time: 2.days.ago)
+ described_class.track_event('event2_slot', values: entity2, time: 3.days.ago)
+ described_class.track_event('event2_slot', values: entity3, time: 3.days.ago)
+ described_class.track_event('event3_slot', values: entity1, time: 3.days.ago)
+ described_class.track_event('event3_slot', values: entity2, time: 10.days.ago)
+ described_class.track_event('event5_slot', values: entity2, time: 4.weeks.ago.advance(days: 1))
# events out of time scope
- described_class.track_event(entity1, 'event5_slot', 4.weeks.ago.advance(days: -1))
+ described_class.track_event('event5_slot', values: entity1, time: 4.weeks.ago.advance(days: -1))
# events in different slots
- described_class.track_event(entity1, 'event4', 2.days.ago)
- described_class.track_event(entity2, 'event4', 2.days.ago)
- described_class.track_event(entity4, 'event4', 2.days.ago)
+ described_class.track_event('event4', values: entity1, time: 2.days.ago)
+ described_class.track_event('event4', values: entity2, time: 2.days.ago)
+ described_class.track_event('event4', values: entity4, time: 2.days.ago)
end
end
diff --git a/spec/lib/gitlab/utils/usage_data_spec.rb b/spec/lib/gitlab/utils/usage_data_spec.rb
index f801a1f462a..1396f664389 100644
--- a/spec/lib/gitlab/utils/usage_data_spec.rb
+++ b/spec/lib/gitlab/utils/usage_data_spec.rb
@@ -347,7 +347,7 @@ RSpec.describe Gitlab::Utils::UsageData do
end
it 'tracks redis hll event' do
- expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(value, event_name)
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: value)
described_class.track_usage_event(event_name, value)
end
diff --git a/spec/services/packages/create_event_service_spec.rb b/spec/services/packages/create_event_service_spec.rb
index 58c79915ce5..f7bab0e5a9f 100644
--- a/spec/services/packages/create_event_service_spec.rb
+++ b/spec/services/packages/create_event_service_spec.rb
@@ -70,7 +70,7 @@ RSpec.describe Packages::CreateEventService do
end
it 'tracks the event' do
- expect(::Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(user.id, /package/)
+ expect(::Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(/package/, values: user.id)
subject
end
diff --git a/spec/support/helpers/stub_experiments.rb b/spec/support/helpers/stub_experiments.rb
index 247692d83ee..408d16a7c08 100644
--- a/spec/support/helpers/stub_experiments.rb
+++ b/spec/support/helpers/stub_experiments.rb
@@ -11,6 +11,7 @@ module StubExperiments
allow(Gitlab::Experimentation).to receive(:active?).and_call_original
experiments.each do |experiment_key, enabled|
+ Feature.persist_used!("#{experiment_key}#{feature_flag_suffix}")
allow(Gitlab::Experimentation).to receive(:active?).with(experiment_key) { enabled }
end
end
@@ -25,7 +26,14 @@ module StubExperiments
allow(Gitlab::Experimentation).to receive(:in_experiment_group?).and_call_original
experiments.each do |experiment_key, enabled|
+ Feature.persist_used!("#{experiment_key}#{feature_flag_suffix}")
allow(Gitlab::Experimentation).to receive(:in_experiment_group?).with(experiment_key, anything) { enabled }
end
end
+
+ private
+
+ def feature_flag_suffix
+ Gitlab::Experimentation::Experiment::FEATURE_FLAG_SUFFIX
+ end
end
diff --git a/spec/support/helpers/stub_feature_flags.rb b/spec/support/helpers/stub_feature_flags.rb
index 7f30a2a70cd..77f31169ecb 100644
--- a/spec/support/helpers/stub_feature_flags.rb
+++ b/spec/support/helpers/stub_feature_flags.rb
@@ -66,4 +66,8 @@ module StubFeatureFlags
def skip_feature_flags_yaml_validation
allow(Feature::Definition).to receive(:valid_usage!)
end
+
+ def skip_default_enabled_yaml_check
+ allow(Feature::Definition).to receive(:default_enabled?).and_return(false)
+ end
end
diff --git a/spec/support/shared_examples/controllers/unique_hll_events_examples.rb b/spec/support/shared_examples/controllers/unique_hll_events_examples.rb
index cf7ee17ea13..c5d65743810 100644
--- a/spec/support/shared_examples/controllers/unique_hll_events_examples.rb
+++ b/spec/support/shared_examples/controllers/unique_hll_events_examples.rb
@@ -7,7 +7,7 @@
RSpec.shared_examples 'tracking unique hll events' do |feature_flag|
it 'tracks unique event' do
- expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(expected_type, target_id)
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(target_id, values: expected_type)
request
end
diff --git a/spec/support/shared_examples/lib/gitlab/usage_data_counters/incident_management_activity_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/usage_data_counters/incident_management_activity_shared_examples.rb
index 788c35dd5bf..88bc8e8d0c1 100644
--- a/spec/support/shared_examples/lib/gitlab/usage_data_counters/incident_management_activity_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/usage_data_counters/incident_management_activity_shared_examples.rb
@@ -13,7 +13,7 @@ RSpec.shared_examples 'an incident management tracked event' do |event|
expect(Gitlab::UsageDataCounters::HLLRedisCounter)
.to receive(:track_event)
- .with(current_user.id, event.to_s)
+ .with(event.to_s, values: current_user.id)
.and_call_original
expect { subject }