diff --git a/config/events/schema.json b/config/events/schema.json index e763a09ea9db4b995718b0e1dce451385d369e0b..8b0f89fbd1b44483b4807b696a7a13040e7812f8 100644 --- a/config/events/schema.json +++ b/config/events/schema.json @@ -41,7 +41,8 @@ "enum": [ "project", "user", - "namespace" + "namespace", + "feature_enabled_by_namespace_ids" ] } }, diff --git a/doc/development/internal_analytics/internal_event_instrumentation/event_definition_guide.md b/doc/development/internal_analytics/internal_event_instrumentation/event_definition_guide.md index f899c8b9b2ffd6153045a5fd1c5cd75232183188..0d706b39e42c51b8f8132b3caf0c43a4be6b322b 100644 --- a/doc/development/internal_analytics/internal_event_instrumentation/event_definition_guide.md +++ b/doc/development/internal_analytics/internal_event_instrumentation/event_definition_guide.md @@ -28,7 +28,7 @@ Each event is defined in a separate YAML file consisting of the following fields | `internal_events` | no | Always `true` for events used in Internal Events. | | `category` | no | Required for legacy events. Should not be used for Internal Events. | | `action` | yes | A unique name for the event. Only lowercase, numbers, and underscores are allowed. Use the format `<operation>_<target_of_operation>_<where/when>`. <br/><br/> Ex: `publish_go_module_to_the_registry_from_pipeline` <br/>`<operation> = publish`<br/>`<target> = go_module`<br/>`<when/where> = to_the_registry_from_pipeline`. | -| `identifiers` | no | A list of identifiers sent with the event. Can be set to one or more of `project`, `user`, or `namespace`. | +| `identifiers` | no | A list of identifiers sent with the event. Can be set to one or more of `project`, `user`, `namespace` or `feature_enabled_by_namespace_ids` | | `product_group` | yes | The [group](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) that owns the event. | | `milestone` | no | The milestone when the event is introduced. | | `introduced_by_url` | no | The URL to the merge request that introduced the event. | diff --git a/scripts/internal_events/cli/event_definer.rb b/scripts/internal_events/cli/event_definer.rb index 82c01ac4aad7eb60424c5558f4d6989ee00cf4ce..353adb9d4cbfc7906905f1e59a233894be80ef0a 100755 --- a/scripts/internal_events/cli/event_definer.rb +++ b/scripts/internal_events/cli/event_definer.rb @@ -27,10 +27,12 @@ class EventDefiner '(ex - service_desk_request_received)', %w[namespace] => 'Use case: For namespace-level events without user interaction ' \ '(ex - stale_runners_cleaned_up)', + %w[feature_enabled_by_namespace_ids user] => 'Use case: For user actions attributable to multiple namespaces ' \ + '(ex - Code-Suggestions / Duo Pro)', %w[] => "Use case: For instance-level events without user interaction [LEAST COMMON]" }.freeze - IDENTIFIER_FORMATTING_BUFFER = "[#{IDENTIFIER_OPTIONS.keys.max_by(&:length).join(', ')}]".length + IDENTIFIER_FORMATTING_BUFFER = "[#{IDENTIFIER_OPTIONS.keys.map { |k| k.join(', ') }.max_by(&:length)}]".length attr_reader :cli, :event @@ -95,7 +97,8 @@ def prompt_for_identifiers identifiers = prompt_for_array_selection( 'Which identifiers are available when the event occurs?', - IDENTIFIER_OPTIONS.keys + IDENTIFIER_OPTIONS.keys, + per_page: IDENTIFIER_OPTIONS.length ) { |choice| format_identifier_choice(choice) } event.identifiers = identifiers if identifiers.any? diff --git a/scripts/internal_events/cli/helpers/cli_inputs.rb b/scripts/internal_events/cli/helpers/cli_inputs.rb index f8e9852381a20baf9840a704fa1474100de038b4..62a6618d4a25c3b6295b15792cdfa1c75bbfc593 100755 --- a/scripts/internal_events/cli/helpers/cli_inputs.rb +++ b/scripts/internal_events/cli/helpers/cli_inputs.rb @@ -4,14 +4,14 @@ module InternalEventsCli module Helpers module CliInputs - def prompt_for_array_selection(message, choices, default = nil, &formatter) + def prompt_for_array_selection(message, choices, default = nil, **opts, &formatter) formatter ||= ->(choice) { choice.sort.join(", ") } choices = choices.map do |choice| { name: formatter.call(choice), value: choice } end - cli.select(message, choices, **select_opts) do |menu| + cli.select(message, choices, **select_opts, **opts) do |menu| menu.enum "." menu.default formatter.call(default) if default end diff --git a/spec/fixtures/scripts/internal_events/events/event_with_feature_enabled_by_namespace_ids_identifier.yml b/spec/fixtures/scripts/internal_events/events/event_with_feature_enabled_by_namespace_ids_identifier.yml new file mode 100644 index 0000000000000000000000000000000000000000..3b116bea3301ee485dcf5fcbd6893d2418b85880 --- /dev/null +++ b/spec/fixtures/scripts/internal_events/events/event_with_feature_enabled_by_namespace_ids_identifier.yml @@ -0,0 +1,24 @@ +--- +description: Engineer uses Internal Event CLI to define a new event +internal_events: true +action: internal_events_cli_used +identifiers: +- feature_enabled_by_namespace_ids +- user +additional_properties: + label: + description: TODO + property: + description: TODO + value: + description: Time the CLI ran before closing (seconds) +product_group: analytics_instrumentation +milestone: '16.6' +introduced_by_url: TODO +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/spec/fixtures/scripts/internal_events/new_events.yml b/spec/fixtures/scripts/internal_events/new_events.yml index 97021344c69d7f93eaacd42ab66dc754ae3a26a0..84556633318f2420b23c97687370715078654726 100644 --- a/spec/fixtures/scripts/internal_events/new_events.yml +++ b/spec/fixtures/scripts/internal_events/new_events.yml @@ -75,7 +75,7 @@ - "1\n" # Enum-select: New Event -- start tracking when an action or scenario occurs on gitlab instances - "Internal Event CLI is opened\n" # Submit description - "internal_events_cli_opened\n" # Submit action name - - "6\n" # Select: None + - "7\n" # Select: None - "\n" # Select (add props): None! Continue to next step! - "\n" # Skip MR URL - "instrumentation" # Filters to the analytics instrumentation group @@ -130,7 +130,7 @@ - "y\n" # Yes --> Ready to start? - "Internal Event CLI is opened\n" # Submit description - "internal_events_cli_opened\n" # Submit action name - - "6\n" # Select: None + - "7\n" # Select: None - "\n" # Select (add props): None! Continue to next step! - "\n" # Skip MR URL - "instrumentation" # Filters to the analytics instrumentation group @@ -248,7 +248,7 @@ - "1\n" # Create another event - "Internal Event CLI is opened\n" # Submit description - "internal_events_cli_opened\n" # Submit action name - - "6\n" # Select: None + - "7\n" # Select: None - "\n" # Select (add props): None! Continue to next step! - "\n" # Skip MR URL - "instrumentation" # Filters to the analytics instrumentation group @@ -286,3 +286,27 @@ files: - path: config/events/internal_events_cli_used.yml content: spec/fixtures/scripts/internal_events/events/event_with_all_additional_properties.yml + +- description: Event with feature_enabled_by_namespace_ids identifier + inputs: + keystrokes: + - "1\n" # Enum-select: New Event -- start tracking when an action or scenario occurs on gitlab instances + - "Engineer uses Internal Event CLI to define a new event\n" # Submit description + - "internal_events_cli_used\n" # Submit action name + - "6\n" # Select: [feature_enabled_by_namespace_ids, user] + - "\e[B\n" # Arrow down to & Select: String 1 (aka label) + - "\n" # Skip label description + - "\e[B\n" # Arrow down to: String 2 (aka property) + - "\n" # Skip property description + - "\e[B\n" # Arrow down to: Number (aka value) + - "Time the CLI ran before closing (seconds)\n" # value description + - "\n" # Skip MR URL + - "instrumentation" # Filters to the analytics instrumentation group + - "\n" # Accept analytics:monitor:analytics_instrumentation + - "1\n" # Select: [free, premium, ultimate] + - "y\n" # Create file + - "4\n" # Exit + outputs: + files: + - path: config/events/internal_events_cli_used.yml + content: spec/fixtures/scripts/internal_events/events/event_with_feature_enabled_by_namespace_ids_identifier.yml diff --git a/spec/fixtures/scripts/internal_events/new_metrics.yml b/spec/fixtures/scripts/internal_events/new_metrics.yml index 2614a78b1ee111112c8fc56f8b68be5db6b3c95e..1b56109c8744c3d0b44c76e73dcb0a08e3831cb6 100644 --- a/spec/fixtures/scripts/internal_events/new_metrics.yml +++ b/spec/fixtures/scripts/internal_events/new_metrics.yml @@ -244,7 +244,7 @@ - "1\n" # Create an event - "Internal Event CLI is opened\n" # Submit description - "internal_events_cli_opened\n" # Submit action name - - "6\n" # Select: None + - "7\n" # Select: None - "\n" # Select (add props): None! Continue to next step! - "\n" # Skip MR URL - "instrumentation" # Filters to the analytics instrumentation group diff --git a/spec/scripts/internal_events/cli_spec.rb b/spec/scripts/internal_events/cli_spec.rb index 76cdf213cdbd56a5f4b39714875f594ac0c001bd..dc3abc33ef64ae3bcb96fb525e783c77ba3d86f9 100644 --- a/spec/scripts/internal_events/cli_spec.rb +++ b/spec/scripts/internal_events/cli_spec.rb @@ -1031,7 +1031,7 @@ def select_event_from_list "1\n", # Enum-select: New Event -- start tracking when an action or scenario occurs on gitlab instances "Internal Event CLI is opened\n", # Submit description "internal_events_cli_opened\n", # Submit action name - "6\n", # Select: None + "7\n", # Select: None "\n", # Select: None! Continue to next section! "\n", # Skip MR URL "analytics_instrumentation\n", # Input group @@ -1104,7 +1104,7 @@ def select_event_from_list "1\n", # Enum-select: New Event -- start tracking when an action or scenario occurs on gitlab instances "Internal Event CLI is opened\n", # Submit description "internal_events_cli_opened\n", # Submit action name - "6\n", # Select: None + "7\n", # Select: None "\n", # Select: None! Continue to next section! "\n", # Skip MR URL "instrumentation\n", # Filter & select group