diff options
Diffstat (limited to 'lib/gitlab/usage_data_counters/hll_redis_counter.rb')
-rw-r--r-- | lib/gitlab/usage_data_counters/hll_redis_counter.rb | 79 |
1 files changed, 20 insertions, 59 deletions
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb index e71061c4522..53594a27867 100644 --- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb +++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb @@ -8,9 +8,6 @@ module Gitlab EventError = Class.new(StandardError) UnknownEvent = Class.new(EventError) - InvalidContext = Class.new(EventError) - - KNOWN_EVENTS_PATH = File.expand_path('known_events/*.yml', __dir__) # Track event on entity_id # Increment a Redis HLL counter for unique event_name and entity_id @@ -31,29 +28,13 @@ module Gitlab track(values, event_name, time: time) end - # Track unique events - # - # event_name - The event name. - # values - One or multiple values counted. - # context - Event context, plan level tracking. - # time - Time of the action, set to Time.current. - def track_event_in_context(event_name, values:, context:, time: Time.zone.now) - return if context.blank? - return unless context.in?(valid_context_list) - - track(values, event_name, context: context, time: time) - end - # Count unique events for a given time range. # # event_names - The list of the events to count. # start_date - The start date of the time range. # end_date - The end date of the time range. - # context - Event context, plan level tracking. Available if set when tracking. - def unique_events(event_names:, start_date:, end_date:, context: '') - count_unique_events(event_names: event_names, start_date: start_date, end_date: end_date, context: context) do - raise InvalidContext if context.present? && !context.in?(valid_context_list) - end + def unique_events(event_names:, start_date:, end_date:) + count_unique_events(event_names: event_names, start_date: start_date, end_date: end_date) end def known_event?(event_name) @@ -61,7 +42,7 @@ module Gitlab end def known_events - @known_events ||= load_events(KNOWN_EVENTS_PATH) + @known_events ||= load_events end def calculate_events_union(event_names:, start_date:, end_date:) @@ -70,7 +51,7 @@ module Gitlab private - def track(values, event_name, context: '', time: Time.zone.now) + def track(values, event_name, time: Time.zone.now) return unless ::ServicePing::ServicePingSettings.enabled? event = event_for(event_name) @@ -79,7 +60,7 @@ module Gitlab return if event.blank? return unless Feature.enabled?(:redis_hll_tracking, type: :ops) - Gitlab::Redis::HLL.add(key: redis_key(event, time, context), value: values, expiry: KEY_EXPIRY_LENGTH) + Gitlab::Redis::HLL.add(key: redis_key(event, time), value: values, expiry: KEY_EXPIRY_LENGTH) rescue StandardError => e # Ignore any exceptions unless is dev or test env @@ -87,48 +68,33 @@ module Gitlab Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) end - # The array of valid context on which we allow tracking - def valid_context_list - Plan.all_plans - end - - def count_unique_events(event_names:, start_date:, end_date:, context: '') + def count_unique_events(event_names:, start_date:, end_date:) events = events_for(Array(event_names).map(&:to_s)) - yield events if block_given? - - keys = keys_for_aggregation(events: events, start_date: start_date, end_date: end_date, context: context) + keys = keys_for_aggregation(events: events, start_date: start_date, end_date: end_date) return FALLBACK unless keys.any? redis_usage_data { Gitlab::Redis::HLL.count(keys: keys) } end - def keys_for_aggregation(events:, start_date:, end_date:, context: '') + def keys_for_aggregation(events:, start_date:, end_date:) end_date = end_date.end_of_week - 1.week (start_date.to_date..end_date.to_date).map do |date| - events.map { |event| redis_key(event, date, context) } + events.map { |event| redis_key(event, date) } end.flatten.uniq end - def load_events(wildcard) - if Feature.enabled?(:use_metric_definitions_for_events_list) - events = Gitlab::Usage::MetricDefinition.not_removed.values.map do |d| - d.attributes[:options] && d.attributes[:options][:events] - end.flatten.compact.uniq - - events.map do |e| - { name: e }.with_indifferent_access - end - else - Dir[wildcard].each_with_object([]) do |path, events| - events.push(*load_yaml_from_path(path)) - end - end - end + def load_events + events = Gitlab::Usage::MetricDefinition.all.map do |d| + next unless d.available? + + d.attributes[:options] && d.attributes[:options][:events] + end.flatten.compact.uniq - def load_yaml_from_path(path) - YAML.safe_load(File.read(path))&.map(&:with_indifferent_access) + events.map do |e| + { name: e }.with_indifferent_access + end end def known_events_names @@ -144,20 +110,15 @@ module Gitlab end # Compose the key in order to store events daily or weekly - def redis_key(event, time, context = '') + def redis_key(event, time) raise UnknownEvent, "Unknown event #{event[:name]}" unless known_events_names.include?(event[:name].to_s) key = "{#{REDIS_SLOT}}_#{event[:name]}" year_week = time.strftime('%G-%V') - key = "#{key}-#{year_week}" - - key = "#{context}_#{key}" if context.present? - key + "#{key}-#{year_week}" end end end end end - -Gitlab::UsageDataCounters::HLLRedisCounter.prepend_mod_with('Gitlab::UsageDataCounters::HLLRedisCounter') |