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

unique_visits.rb « analytics « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9dd7d048eec884da42d7f680aea1e043a15368b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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