Module: GitlabInternalEventsCli::Text::EventDefiner

Extended by:
Helpers::Formatting
Included in:
Flows::EventDefiner
Defined in:
lib/gitlab_internal_events_cli/text/event_definer.rb

Constant Summary collapse

DESCRIPTION_INTRO =
<<~TEXT.freeze
  #{format_info('EVENT DESCRIPTION')}
  Include what the event is supposed to track, where, and when.

  The description field helps others find & reuse this event. This will be used by Engineering, Product, Data team, Support -- and also GitLab customers directly. Be specific and explicit.
    ex - Debian package published to the registry using a deploy token
    ex - Issue confidentiality was changed

TEXT
DESCRIPTION_HELP =
<<~TEXT.freeze
  #{format_warning('Required. 10+ words likely, but length may vary.')}

  #{format_info('GOOD EXAMPLES:')}
  - Pipeline is created with a CI Template file included in its configuration
  - Quick action `/assign @user1` used to assign a single individual to an issuable
  - Quick action `/target_branch` used on a Merge Request
  - Quick actions `/unlabel` or `/remove_label` used to remove one or more specific labels
  - User edits file using the single file editor
  - User edits file using the Web IDE
  - User removed issue link between issue and incident
  - Debian package published to the registry using a deploy token

  #{format_info('GUT CHECK:')}
  For your description...
    1. Would two different engineers likely instrument the event from the same code locations?
    2. Would a new GitLab user find where the event is triggered in the product?
    3. Would a GitLab customer understand what the description says?


TEXT
ACTION_INTRO =
<<~TEXT.freeze
  #{format_info('EVENT NAME')}
  The event name is a unique identifier used from both a) app code and b) metric definitions.
  The name should concisely communicate the same information as the event description.

    ex - change_time_estimate_on_issue
    ex - push_package_to_repository
    ex - publish_go_module_to_the_registry_from_pipeline
    ex - admin_user_comments_on_issue_while_impersonating_blocked_user

  #{format_info('EXPECTED FORMAT:')} #{format_selection('<action>_<target_of_action>_<where/when>')}

    ex) click_save_button_in_issue_description_within_15s_of_page_load
      - ACTION: click
      - TARGET: save button
      - WHERE: in issue description
      - WHEN: within 15s of page load

TEXT
ACTION_HELP =
<<~TEXT.freeze
  #{format_warning('Required. Must be globally unique. Must use only letters/numbers/underscores.')}

  #{format_info('FAQs:')}
  - Q: Present tense or past tense?
    A: Prefer present tense! But it's up to you.
  - Q: Other event names have prefixes like `i_` or the `g_group_name`. Why?
    A: Those are leftovers from legacy naming schemes. Changing the names of old events/metrics can break dashboards, so stability is better than uniformity.


TEXT
IDENTIFIERS_INTRO =
<<~TEXT.freeze
  #{format_info('KEY IDENTIFIERS')}
  Indicates the attributes recorded when the event occurs. Generally, we want to include every identifier available to us when the event is triggered.

  #{format_info('BACKEND')}: Attributes must be specified when the event is triggered
    ex) User, project, and namespace are the identifiers available for backend instrumentation:
      track_internal_event(
        '%s',
        user: user,
        project: project,
        namespace: project.namespace
      )

  #{format_info('FRONTEND')}: Attributes are automatically included from the URL
    ex) When a user takes an action on the MR list page, the URL is https://gitlab.com/gitlab-org/gitlab/-/merge_requests
        Because this URL is for a project, we know that all of user/project/namespace are available for the event

  #{format_info('NOTE')}: If you're planning to instrument a unique-by-user metric, you should still include project & namespace when possible. This is especially helpful in the data warehouse, where namespace and project can make events relevant for CSM use-cases.

TEXT
IDENTIFIER_OPTIONS =
{
  %w[project namespace user] =>
    'Use case: For project-level user actions (ex - issue_assignee_changed) [MOST COMMON]',
  %w[namespace user] =>
    'Use case: For namespace-level user actions (ex - epic_assigned_to_milestone)',
  %w[user] =>
    'Use case: For user-only actions (ex - admin_impersonated_user)',
  %w[project namespace] =>
    'Use case: For project-level events without user interaction (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
ADDITIONAL_PROPERTIES_INTRO =
<<~TEXT.freeze
  #{format_info('ADDITIONAL PROPERTIES')}
  Describe any related attributes or information which should be tracked when the event occurs. This enables extra capabilities:
    - Service Ping: define metrics filtered to a specific subset of events
    - Snowflake: view/sort/group individual events from GitLab.com

  BUILT-IN PROPERTIES (recommended)
  For the best performance and flexibility, provide event context using:

    property (string),  label (string),  value (numeric)

  These attribute names correspond to repurposed fields in Snowflake. They have no special meaning other than data type.

  ex) To add a metric like "Monthly count of unique users who changed an MR status to closed" using a 'change_merge_request_status' event, define an additional property like:
    Attribute: label (string)
    Description: Status of merge request after update (one of opened, merged, closed)

  CUSTOM PROPERTIES (as-needed)
  If the built-in properties are not suitable or descriptive, properties of any name can be provided.

  WARNING: Make sure the additional properties don't contain any sensitive information, like customer data or PII.
  For more information, see the Data Classification Standard at https://about.gitlab.com/handbook/security/data-classification-standard/

TEXT
ADDITIONAL_PROPERTIES_ADD_MORE_HELP =
<<~TEXT.freeze
  #{format_warning('Required. Must be unique within the event context. Must use only letters/numbers/underscores.')}

  #{format_info('It should not be named any of the following:')}
  - property#{' '}
  - label
  - value

TEXT
CLASSIFICATION_INTRO =
<<~TEXT.freeze
  #{format_info('EVENT CLASSIFICATION')}

  The classification field is used to categorize events based on their data handling requirements.
  Currently, the only supported classification is "duo" for AI and Duo-related features.

  #{format_info('WHEN TO USE "classification: duo":')}
  - Events related to GitLab Duo features (Duo Agent Platform, Code Suggestions, Duo Chat, etc.)
  - AI-powered functionality and interactions
  - Events owned by an AI Engineering product group such as duo_chat, ai_framework or duo_agent_framework

  #{format_info('WHEN NOT TO USE "classification: duo":')}
  - GitLab features unrelated to Duo or AI

  Events with "classification: duo" are treated as operational data with specific data handling requirements.

  Learn more: https://docs.gitlab.com/development/internal_analytics/internal_event_instrumentation/duo_classification/

TEXT

Constants included from Helpers::Formatting

Helpers::Formatting::DEFAULT_WINDOW_HEIGHT, Helpers::Formatting::DEFAULT_WINDOW_WIDTH

Method Summary

Methods included from Helpers::Formatting

clear_format, counter, divider, format_error, format_heading, format_help, format_info, format_prefix, format_prompt, format_selection, format_subheader, format_warning, progress_bar