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 | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb index c9c39225068..53bf6daea4c 100644 --- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb +++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb @@ -31,7 +31,11 @@ module Gitlab # * Track event: Gitlab::UsageDataCounters::HLLRedisCounter.track_event(user_id, 'g_compliance_dashboard') # * Get unique counts per user: Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'g_compliance_dashboard', start_date: 28.days.ago, end_date: Date.current) class << self + include Gitlab::Utils::UsageData + def track_event(entity_id, event_name, time = Time.zone.now) + return unless Gitlab::CurrentSettings.usage_ping_enabled? + event = event_for(event_name) raise UnknownEvent.new("Unknown event #{event_name}") unless event.present? @@ -50,15 +54,51 @@ module Gitlab keys = keys_for_aggregation(aggregation, events: events, start_date: start_date, end_date: end_date) - Gitlab::Redis::HLL.count(keys: keys) + redis_usage_data { Gitlab::Redis::HLL.count(keys: keys) } + end + + def categories + @categories ||= known_events.map { |event| event[:category] }.uniq end + # @param category [String] the category name + # @return [Array<String>] list of event names for given category def events_for_category(category) - known_events.select { |event| event[:category] == category }.map { |event| event[:name] } + known_events.select { |event| event[:category] == category.to_s }.map { |event| event[:name] } + end + + def unique_events_data + categories.each_with_object({}) do |category, category_results| + events_names = events_for_category(category) + + event_results = events_names.each_with_object({}) do |event, hash| + hash[event] = unique_events(event_names: event, start_date: 7.days.ago.to_date, end_date: Date.current) + end + + if eligible_for_totals?(events_names) + event_results["#{category}_total_unique_counts_weekly"] = unique_events(event_names: events_names, start_date: 7.days.ago.to_date, end_date: Date.current) + event_results["#{category}_total_unique_counts_monthly"] = unique_events(event_names: events_names, start_date: 4.weeks.ago.to_date, end_date: Date.current) + end + + category_results["#{category}"] = event_results + end + end + + def known_event?(event_name) + event_for(event_name).present? end private + # Allow to add totals for events that are in the same redis slot, category and have the same aggregation level + # and if there are more than 1 event + def eligible_for_totals?(events_names) + return false if events_names.size <= 1 + + events = events_for(events_names) + events_in_same_slot?(events) && events_in_same_category?(events) && events_same_aggregation?(events) + end + def keys_for_aggregation(aggregation, events:, start_date:, end_date:) if aggregation.to_sym == :daily daily_redis_keys(events: events, start_date: start_date, end_date: end_date) @@ -76,8 +116,11 @@ module Gitlab end def events_in_same_slot?(events) + # if we check one event then redis_slot is only one to check + return true if events.size == 1 + slot = events.first[:redis_slot] - events.all? { |event| event[:redis_slot] == slot } + events.all? { |event| event[:redis_slot].present? && event[:redis_slot] == slot } end def events_in_same_category?(events) @@ -91,7 +134,7 @@ module Gitlab end def expiry(event) - return event[:expiry] if event[:expiry].present? + return event[:expiry].days if event[:expiry].present? event[:aggregation].to_sym == :daily ? DEFAULT_DAILY_KEY_EXPIRY_LENGTH : DEFAULT_WEEKLY_KEY_EXPIRY_LENGTH end |