Files
2025-05-16 06:09:15 +00:00

93 lines
2.5 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
# Generate a metric/event files in the correct locations.
require 'tty-prompt'
require 'net/http'
require 'yaml'
require 'json_schemer'
require 'delegate'
require_relative './cli/helpers'
require_relative './cli/flows/event_definer'
require_relative './cli/flows/flow_advisor'
require_relative './cli/flows/metric_definer'
require_relative './cli/flows/usage_viewer'
require_relative './cli/global_state'
require_relative './cli/time_framed_key_path'
require_relative './cli/metric'
require_relative './cli/event'
class Cli
include ::InternalEventsCli::Helpers
attr_reader :cli
def initialize(cli)
@cli = cli
end
def run
cli.say feedback_notice
cli.say instructions
task = cli.select("What would you like to do?", **select_opts) do |menu|
menu.enum "."
menu.choice "New Event -- track when a specific scenario occurs on gitlab instances\n " \
"ex) a user applies a label to an issue", :new_event
menu.choice "New Metric -- track the count of existing events over time\n " \
"ex) count unique users who assign labels to issues per month", :new_metric
menu.choice 'View Usage -- look at code and testing examples for existing events & metrics', :view_usage
menu.choice '...am I in the right place?', :help_decide
end
case task
when :new_event
InternalEventsCli::Flows::EventDefiner.new(cli).run
when :new_metric
InternalEventsCli::Flows::MetricDefiner.new(cli).run
when :view_usage
InternalEventsCli::Flows::UsageViewer.new(cli).run
when :help_decide
InternalEventsCli::Flows::FlowAdvisor.new(cli).run
end
end
def instructions
cli.say <<~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 Tableau (after merge & deploy)
This CLI will help you create the correct definition files, then provide code examples for instrumentation and testing.
Learn more: https://docs.gitlab.com/ee/development/internal_analytics/#fundamental-concepts
TEXT
end
end
class GitlabPrompt < SimpleDelegator
def global
@global ||= InternalEventsCli::GlobalState.new
end
end
if $PROGRAM_NAME == __FILE__
begin
prompt = GitlabPrompt.new(TTY::Prompt.new)
Cli.new(prompt).run
rescue Interrupt
puts "\n"
end
end
# vim: ft=ruby