Class: RedisAnalytics::Visit
- Inherits:
-
Object
- Object
- RedisAnalytics::Visit
- Includes:
- Metrics
- Defined in:
- lib/redis_analytics/visit.rb
Instance Attribute Summary
Attributes included from Metrics
#first_visits_count_per_visit, #page_views_count_per_hit, #repeat_visits_count_per_visit, #second_page_views_count_per_hit, #unique_visits_ratio_per_visit, #visit_time_count_per_visit, #visits_count_per_visit
Instance Method Summary collapse
-
#counter(metric_name) ⇒ Object
helpers.
- #current_visit_info ⇒ Object
- #exec_custom_methods(type) ⇒ Object
- #first_visit_info ⇒ Object
-
#for_each_time_range(t) ⇒ Object
helpers.
-
#initialize(request, response) ⇒ Visit
constructor
method used in analytics.rb to initialize visit.
-
#record ⇒ Object
called from analytics.rb.
- #track(metric_name, metric_value) ⇒ Object
- #updated_current_visit_info ⇒ Object
- #updated_first_visit_info ⇒ Object
Methods included from Metrics
#browser_ratio_per_visit, #country_ratio_per_visit, #device_ratio_per_visit, #http_response_ratio_per_hit, #landing_page_ratio_per_hit, #platform_ratio_per_visit, #recency_ratio_per_visit, #referrer_ratio_per_visit, #url_ratio_per_hit
Constructor Details
#initialize(request, response) ⇒ Visit
method used in analytics.rb to initialize visit
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/redis_analytics/visit.rb', line 28 def initialize(request, response) @t = Time.now @redis_key_prefix = "#{RedisAnalytics.redis_namespace}:" @rack_request = request @rack_response = response @first_visit_seq = first_visit_info[0] || current_visit_info[0] @current_visit_seq = current_visit_info[1] @first_visit_time = first_visit_info[1] @last_visit_time = first_visit_info[2] @page_view_seq_no = current_visit_info[2] || 0 @last_visit_start_time = current_visit_info[3] @last_visit_end_time = current_visit_info[4] end |
Instance Method Details
#counter(metric_name) ⇒ Object
helpers
80 81 82 83 84 85 |
# File 'lib/redis_analytics/visit.rb', line 80 def counter(metric_name) n = RedisAnalytics.redis_connection.incr("#{@redis_key_prefix}#{metric_name}") # to debug, uncomment this line # puts "COUNT #{metric_name} -> #{n}" return n end |
#current_visit_info ⇒ Object
22 23 24 25 |
# File 'lib/redis_analytics/visit.rb', line 22 def current_visit_info = @rack_request.[RedisAnalytics.] return ? .split('.') : [] end |
#exec_custom_methods(type) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/redis_analytics/visit.rb', line 66 def exec_custom_methods(type) Metrics.public_instance_methods.each do |meth| if m = meth.to_s.match(/^([a-z_]*)_(count|ratio)_per_#{type}$/) begin return_value = self.send(meth) track(m.to_a[1], return_value) if return_value rescue => e warn "#{meth} resulted in an exception #{e}" end end end end |
#first_visit_info ⇒ Object
17 18 19 20 |
# File 'lib/redis_analytics/visit.rb', line 17 def first_visit_info = @rack_request.[RedisAnalytics.] return ? .split('.') : [] end |
#for_each_time_range(t) ⇒ Object
helpers
11 12 13 14 15 |
# File 'lib/redis_analytics/visit.rb', line 11 def for_each_time_range(t) RedisAnalytics..map{|x, y| t.strftime(x)}.each do |ts| yield(ts) end end |
#record ⇒ Object
called from analytics.rb
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/redis_analytics/visit.rb', line 45 def record if @current_visit_seq track("visit_time", @t.to_i - @last_visit_end_time.to_i) else @current_visit_seq ||= counter("visits") track("visits", 1) # track core 'visit' metric if @first_visit_seq track("repeat_visits", 1) else @first_visit_seq ||= counter("unique_visits") track("first_visits", 1) track("unique_visits", 1) end exec_custom_methods('visit') # custom methods that are measured on a per-visit basis end exec_custom_methods('hit') # custom methods that are measured on a per-page-view (per-hit) basis track("page_views", 1) # track core 'page_view' metric track("second_page_views", 1) if @page_view_seq_no.to_i == 1 # @last_visit_start_time and (@last_visit_start_time.to_i == @last_visit_end_time.to_i) @rack_response end |
#track(metric_name, metric_value) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/redis_analytics/visit.rb', line 103 def track(metric_name, metric_value) n = 0 RedisAnalytics.redis_connection.hmset("#{@redis_key_prefix}#METRICS", metric_name, metric_value.class) for_each_time_range(@t) do |ts| key = "#{@redis_key_prefix}#{metric_name}:#{ts}" if metric_value.is_a?(Integer) n = RedisAnalytics.redis_connection.incrby(key, metric_value) else n = RedisAnalytics.redis_connection.zincrby(key, 1, metric_value) end end # to debug, uncomment this line # puts "TRACK #{metric_name} -> #{n}" return n end |
#updated_current_visit_info ⇒ Object
87 88 89 90 91 92 93 |
# File 'lib/redis_analytics/visit.rb', line 87 def updated_current_visit_info value = [@first_visit_seq.to_i, @current_visit_seq.to_i, @page_view_seq_no.to_i + 1, (@last_visit_start_time || @t).to_i, @t.to_i] # to debug, uncomment this line # puts "UPDATING VCN COOKIE -> #{value}" expires = @t + RedisAnalytics.visit_timeout.to_i.minutes {:value => value.join('.'), :expires => expires} end |
#updated_first_visit_info ⇒ Object
95 96 97 98 99 100 101 |
# File 'lib/redis_analytics/visit.rb', line 95 def updated_first_visit_info value = [@first_visit_seq.to_i, (@first_visit_time || @t).to_i, @t.to_i] # to debug, uncomment this line # puts "UPDATING RUCN COOKIE -> #{value}" expires = @t + 1.year {:value => value.join('.'), :expires => expires} end |