diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-01-08 00:10:44 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-01-08 00:10:44 +0000 |
commit | d06b4740da9267bdfd42ab14c9893e3dd581f50d (patch) | |
tree | 5012bc99ccb8ab92ed321bb33a0b51858594ce84 | |
parent | fd320d0858df108b47ebadaa546a3c99f0e44cf1 (diff) | |
download | gitlab-ce-d06b4740da9267bdfd42ab14c9893e3dd581f50d.tar.gz |
Add latest changes from gitlab-org/gitlab@master
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 } |