Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/analytics/unique_visits.rb')
-rw-r--r--lib/gitlab/analytics/unique_visits.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/gitlab/analytics/unique_visits.rb b/lib/gitlab/analytics/unique_visits.rb
new file mode 100644
index 00000000000..9dd7d048eec
--- /dev/null
+++ b/lib/gitlab/analytics/unique_visits.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Analytics
+ class UniqueVisits
+ TARGET_IDS = Set[
+ 'g_analytics_contribution',
+ 'g_analytics_insights',
+ 'g_analytics_issues',
+ 'g_analytics_productivity',
+ 'g_analytics_valuestream',
+ 'p_analytics_pipelines',
+ 'p_analytics_code_reviews',
+ 'p_analytics_valuestream',
+ 'p_analytics_insights',
+ 'p_analytics_issues',
+ 'p_analytics_repo',
+ 'u_analytics_todos',
+ 'i_analytics_cohorts',
+ 'i_analytics_dev_ops_score'
+ ].freeze
+
+ KEY_EXPIRY_LENGTH = 28.days
+
+ def track_visit(visitor_id, target_id, time = Time.zone.now)
+ target_key = key(target_id, time)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.multi do |multi|
+ multi.pfadd(target_key, visitor_id)
+ multi.expire(target_key, KEY_EXPIRY_LENGTH)
+ end
+ end
+ end
+
+ def weekly_unique_visits_for_target(target_id, week_of: 7.days.ago)
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.pfcount(key(target_id, week_of))
+ end
+ end
+
+ def weekly_unique_visits_for_any_target(week_of: 7.days.ago)
+ keys = TARGET_IDS.map { |target_id| key(target_id, week_of) }
+
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.pfcount(*keys)
+ end
+ end
+
+ private
+
+ def key(target_id, time)
+ raise "Invalid target id #{target_id}" unless TARGET_IDS.include?(target_id.to_s)
+
+ year_week = time.strftime('%G-%V')
+ "#{target_id}-{#{year_week}}"
+ end
+ end
+ end
+end