Class: MongoidTraffic::Logger

Inherits:
Object
  • Object
show all
Defined in:
lib/mongoid_traffic/logger.rb,
lib/mongoid_traffic/logger/bots.rb,
lib/mongoid_traffic/logger/geo_ip.rb,
lib/mongoid_traffic/logger/browser.rb,
lib/mongoid_traffic/logger/referer.rb

Defined Under Namespace

Classes: Bots, Browser, GeoIp, Referer

Constant Summary collapse

TIME_SCOPE_OPTIONS =
%i(year month week day).freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(log_cls, ip_address: nil, referer: nil, scope: nil, time_scope: %i(month day), unique_id: nil, user_agent: nil) ⇒ Logger




22
23
24
25
26
27
28
29
30
# File 'lib/mongoid_traffic/logger.rb', line 22

def initialize(log_cls, ip_address: nil, referer: nil, scope: nil, time_scope: %i(month day), unique_id: nil, user_agent: nil)
  @log_cls = log_cls
  @ip_address = ip_address
  @referer_string = referer
  @scope = scope
  @time_scope = time_scope
  @unique_id = unique_id
  @user_agent_string = user_agent
end

Class Method Details

.log(log_cls, *args) ⇒ Object




16
17
18
# File 'lib/mongoid_traffic/logger.rb', line 16

def self.log(log_cls, *args)
  new(log_cls, *args).log
end

Instance Method Details

#access_count_queryObject




56
57
58
# File 'lib/mongoid_traffic/logger.rb', line 56

def access_count_query
  { ac: 1 }
end

#browser_queryObject



60
61
62
63
64
# File 'lib/mongoid_traffic/logger.rb', line 60

def browser_query
  return {} unless browser.present?
  browser_path = [browser.platform, browser.name, browser.version].map { |s| escape_key(s) }.join('.')
  { "b.#{browser_path}" => 1 }
end

#country_queryObject



66
67
68
69
70
71
# File 'lib/mongoid_traffic/logger.rb', line 66

def country_query
  return {} unless @ip_address.present?
  return {} unless country_code2 = GeoIp.country_code2(@ip_address)
  country_code_key = escape_key(country_code2)
  { "c.#{country_code_key}" => 1 }
end

#escape_key(key) ⇒ Object




87
88
89
# File 'lib/mongoid_traffic/logger.rb', line 87

def escape_key(key)
  CGI.escape(key).gsub('.', '%2E')
end

#find_query(ts) ⇒ Object




93
94
95
96
97
# File 'lib/mongoid_traffic/logger.rb', line 93

def find_query(ts)
  res = time_query(ts)
  res = res.merge(scope_query) if @scope.present?
  res
end

#logObject



32
33
34
35
36
37
38
39
# File 'lib/mongoid_traffic/logger.rb', line 32

def log
  return if Bots.is_a_bot?(@referer_string)
  raise "Invalid time scope definition: #{@time_scope}" unless @time_scope.all? { |ts| TIME_SCOPE_OPTIONS.include?(ts) }

  @time_scope.each do |ts|
    @log_cls.collection.find(find_query(ts)).update_many(upsert_query, upsert: true)
  end
end

#referer_queryObject



73
74
75
76
77
# File 'lib/mongoid_traffic/logger.rb', line 73

def referer_query
  return {} unless referer.present?
  referer_key = escape_key(referer.to_s)
  { "r.#{referer_key}" => 1 }
end

#scope_queryObject



99
100
101
# File 'lib/mongoid_traffic/logger.rb', line 99

def scope_query
  { s: @scope }
end

#time_query(ts) ⇒ Object



103
104
105
106
107
108
109
# File 'lib/mongoid_traffic/logger.rb', line 103

def time_query(ts)
  date = Date.today
  case ts
  when :day then { df: date, dt: date }
  else { df: date.send("at_beginning_of_#{ts}"), dt: date.send("at_end_of_#{ts}") }
  end
end

#unique_id_queryObject



79
80
81
82
83
# File 'lib/mongoid_traffic/logger.rb', line 79

def unique_id_query
  return {} unless @unique_id.present?
  unique_id_key = escape_key(@unique_id.to_s)
  { "u.#{unique_id_key}" => 1 }
end

#upsert_queryObject




43
44
45
46
47
48
49
50
51
52
# File 'lib/mongoid_traffic/logger.rb', line 43

def upsert_query
  {
    '$inc' => access_count_query
      .merge(browser_query)
      .merge(country_query)
      .merge(referer_query)
      .merge(unique_id_query),
    '$set' => { uat: Time.now }
  }
end