mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-08-01 15:53:04 +00:00
116 lines
2.9 KiB
Ruby
116 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Tracking
|
|
InvalidEventError = Class.new(RuntimeError)
|
|
|
|
class EventDefinition
|
|
attr_reader :path
|
|
|
|
class << self
|
|
include Gitlab::Utils::StrongMemoize
|
|
|
|
def definitions
|
|
@definitions ||= paths.flat_map { |glob_path| load_all_from_path(glob_path) }
|
|
end
|
|
|
|
def internal_event_exists?(event_name)
|
|
internal_event_actions.include?(event_name)
|
|
end
|
|
|
|
def find(event_name)
|
|
strong_memoize_with(:find, event_name) do
|
|
definitions.find { |definition| definition.action == event_name }
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def paths
|
|
@paths ||= [Rails.root.join('config', 'events', '*.yml'), Rails.root.join('ee', 'config', 'events', '*.yml')]
|
|
end
|
|
|
|
def load_from_file(path)
|
|
definition = File.read(path)
|
|
definition = YAML.safe_load(definition)
|
|
definition.deep_symbolize_keys!
|
|
|
|
self.new(path, definition)
|
|
rescue StandardError => e
|
|
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(Gitlab::Tracking::InvalidEventError.new(e.message))
|
|
end
|
|
|
|
def load_all_from_path(glob_path)
|
|
Dir.glob(glob_path).map { |path| load_from_file(path) }
|
|
end
|
|
|
|
def internal_event_actions
|
|
@internal_event_actions ||= definitions
|
|
.filter_map { |event| event.action if event.internal_events? }
|
|
.to_set
|
|
end
|
|
end
|
|
|
|
def initialize(path, opts = {})
|
|
@path = path
|
|
@attributes = opts
|
|
end
|
|
|
|
def additional_properties
|
|
@attributes.fetch(:additional_properties, {})
|
|
end
|
|
|
|
def internal_events?
|
|
@attributes[:internal_events]
|
|
end
|
|
|
|
def category
|
|
@attributes[:category]
|
|
end
|
|
|
|
def yaml_path
|
|
path.delete_prefix(Rails.root.to_s)
|
|
end
|
|
|
|
def event_selection_rules
|
|
@event_selection_rules ||= find_event_selection_rules
|
|
end
|
|
|
|
def action
|
|
@attributes[:action]
|
|
end
|
|
|
|
def extra_trackers
|
|
return [] unless @attributes[:extra_trackers]
|
|
|
|
@attributes[:extra_trackers].to_h do |item|
|
|
[
|
|
item[:tracking_class].constantize,
|
|
{ protected_properties: item[:protected_properties]&.keys || [] }
|
|
]
|
|
end
|
|
end
|
|
|
|
def duo_event?
|
|
@attributes[:classification] == 'duo'
|
|
end
|
|
|
|
def raw_attributes
|
|
@attributes
|
|
end
|
|
|
|
private
|
|
|
|
def find_event_selection_rules
|
|
[
|
|
Gitlab::Usage::EventSelectionRule.new(name: action, time_framed: false),
|
|
Gitlab::Usage::EventSelectionRule.new(name: action, time_framed: true),
|
|
*Gitlab::Usage::MetricDefinition.all.flat_map do |metric_definition|
|
|
metric_definition.event_selection_rules.select { |rule| rule.name == action }
|
|
end
|
|
].uniq
|
|
end
|
|
end
|
|
end
|
|
end
|