217 lines
9.5 KiB
Ruby
Executable File
217 lines
9.5 KiB
Ruby
Executable File
# frozen_string_literal: true
|
|
|
|
# Blocks of text rendered in CLI
|
|
module InternalEventsCli
|
|
module Text
|
|
extend Helpers
|
|
|
|
CLI_INSTRUCTIONS = <<~TEXT.freeze
|
|
#{format_info('INSTRUCTIONS:')}
|
|
To start tracking usage of a feature...
|
|
|
|
1) Define event (using CLI)
|
|
2) Trigger event (from code)
|
|
3) Define metric (using CLI)
|
|
4) View data in Sisense (after merge & deploy)
|
|
|
|
This CLI will help you create the correct defintion files, then provide code examples for instrumentation and testing.
|
|
|
|
Learn more: https://docs.gitlab.com/ee/development/internal_analytics/#fundamental-concepts
|
|
|
|
TEXT
|
|
|
|
# TODO: Remove "NEW TOOL" comment after 3 months
|
|
FEEDBACK_NOTICE = format_heading <<~TEXT.chomp
|
|
Thanks for using the Internal Events CLI!
|
|
|
|
Please reach out with any feedback!
|
|
About Internal Events: https://gitlab.com/gitlab-org/analytics-section/analytics-instrumentation/internal/-/issues/687
|
|
About CLI: https://gitlab.com/gitlab-org/gitlab/-/issues/434038
|
|
In Slack: #g_analyze_analytics_instrumentation
|
|
|
|
Let us know that you used the CLI! React with 👍 on the feedback issue or post in Slack!
|
|
TEXT
|
|
|
|
ALTERNATE_RESOURCES_NOTICE = <<~TEXT.freeze
|
|
Other resources:
|
|
|
|
#{format_warning('Tracking GitLab feature usage from database info:')}
|
|
https://docs.gitlab.com/ee/development/internal_analytics/metrics/metrics_instrumentation.html#database-metrics
|
|
|
|
#{format_warning('Migrating existing metrics to use Internal Events:')}
|
|
https://docs.gitlab.com/ee/development/internal_analytics/internal_event_instrumentation/migration.html
|
|
|
|
#{format_warning('Remove an existing metric:')}
|
|
https://docs.gitlab.com/ee/development/internal_analytics/metrics/metrics_lifecycle.html
|
|
|
|
#{format_warning('Finding existing usage data for GitLab features:')}
|
|
https://metrics.gitlab.com/ (Customize Table > Sisense query)
|
|
https://app.periscopedata.com/app/gitlab/1049395/Service-Ping-Exploration-Dashboard
|
|
|
|
#{format_warning('Customer wants usage data for their own GitLab instance:')}
|
|
https://docs.gitlab.com/ee/user/analytics/
|
|
|
|
#{format_warning('Customer wants usage data for their own products:')}
|
|
https://docs.gitlab.com/ee/user/product_analytics/
|
|
TEXT
|
|
|
|
EVENT_TRACKING_EXAMPLES = <<~TEXT
|
|
Product usage can be tracked in several ways.
|
|
|
|
By tracking events: ex) a user changes the assignee on an issue
|
|
ex) a user uploads a CI template
|
|
ex) a service desk request is received
|
|
ex) all stale runners are cleaned up
|
|
ex) a user copies code to the clipboard from markdown
|
|
ex) a user uploads an issue template OR a user uploads an MR template
|
|
|
|
From database data: ex) track whether each gitlab instance allows signups
|
|
ex) query how many projects are on each gitlab instance
|
|
|
|
TEXT
|
|
|
|
EVENT_EXISTENCE_CHECK_INSTRUCTIONS = <<~TEXT.freeze
|
|
To determine what to do next, let's figure out if the event is already tracked & usable.
|
|
|
|
If you're unsure whether an event exists, you can check the existing defintions.
|
|
|
|
#{format_info('FROM GDK')}: Check `config/events/` or `ee/config/events`
|
|
#{format_info('FROM BROWSER')}: Check https://metrics.gitlab.com/snowplow
|
|
|
|
Find one? Create a new metric for the event.
|
|
Otherwise? Create a new event.
|
|
|
|
If you find a relevant event that has a different category from 'InternalEventTracking', it can be migrated to
|
|
Internal Events. See https://docs.gitlab.com/ee/development/internal_analytics/internal_event_instrumentation/migration.html
|
|
|
|
TEXT
|
|
|
|
EVENT_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
|
|
|
|
EVENT_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
|
|
|
|
EVENT_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
|
|
- TARGET: save button
|
|
- ACTION: click
|
|
- WHERE: in issue description
|
|
- WHEN: within 15s of page load
|
|
|
|
TEXT
|
|
|
|
EVENT_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
|
|
|
|
EVENT_IDENTIFIERS_INTRO = <<~TEXT.freeze
|
|
#{format_info('EVENT CONTEXT')}
|
|
Identifies 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) If the backend event was instrumentuser/project/namespace are the identifiers for this backend instrumentation:
|
|
|
|
Gitlab::InternalEvents.track_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
|
|
|
|
DATABASE_METRIC_NOTICE = <<~TEXT
|
|
|
|
For right now, this script can only define metrics for internal events.
|
|
|
|
For more info on instrumenting database-backed metrics, see https://docs.gitlab.com/ee/development/internal_analytics/metrics/metrics_instrumentation.html
|
|
TEXT
|
|
|
|
ALL_METRICS_EXIST_NOTICE = <<~TEXT
|
|
|
|
Looks like the potential metrics for this event either already exist or are unsupported.
|
|
|
|
Check out https://metrics.gitlab.com/ for improved event/metric search capabilities.
|
|
TEXT
|
|
|
|
METRIC_DESCRIPTION_INTRO = <<~TEXT.freeze
|
|
#{format_info('METRIC DESCRIPTION')}
|
|
Describes which occurrences of an event are tracked in the metric and how they're grouped.
|
|
|
|
The description field is critical for helping others find & reuse this event. This will be used by Engineering, Product, Data team, Support -- and also GitLab customers directly. Be specific and explicit.
|
|
|
|
#{format_info('GOOD EXAMPLES:')}
|
|
- Total count of analytics dashboard list views
|
|
- Weekly count of unique users who viewed the analytics dashboard list
|
|
- Monthly count of unique projects where the analytics dashboard list was viewed
|
|
- Total count of issue updates
|
|
|
|
#{format_info('SELECTED EVENT(S):')}
|
|
TEXT
|
|
|
|
METRIC_DESCRIPTION_HELP = <<~TEXT.freeze
|
|
#{format_warning('Required. 10+ words likely, but length may vary.')}
|
|
|
|
An event description can often be rearranged to work as a metric description.
|
|
|
|
ex) Event description: A merge request was created
|
|
Metric description: Total count of merge requests created
|
|
Metric description: Weekly count of unqiue users who created merge requests
|
|
|
|
Look at the event descriptions above to get ideas!
|
|
TEXT
|
|
end
|
|
end
|