Class: Metry::Rack::Tracking

Inherits:
Object
  • Object
show all
Defined in:
lib/metry/rack/tracking.rb

Constant Summary collapse

"_metry"

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Tracking



6
7
8
9
# File 'lib/metry/rack/tracking.rb', line 6

def initialize(app)
  @app = app
  @storage = Metry.current
end

Instance Method Details

#build_event(request) ⇒ Object



32
33
34
35
36
37
38
39
40
41
# File 'lib/metry/rack/tracking.rb', line 32

def build_event(request)
  { "event" => "pageview",
    "path" => request.fullpath,
    "time" => Time.now.to_f,
    "ip" => request.ip,
    "host" => request.host,
    "method" => request.request_method,
    "referrer" => request.env["HTTP_REFERER"],
    "user_agent" => request.env["HTTP_USER_AGENT"] }
end

#call(env) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/metry/rack/tracking.rb', line 11

def call(env)
  request = ::Rack::Request.new(env)
  visitor = find_or_create_visitor(request)
  env["metry.visitor"] = visitor
  env["metry.event"] = event = build_event(request)

  status, headers, body = @app.call(env)

  response = ::Rack::Response.new(body, status, headers)

  save_visitor(response, visitor)

  unless event["ignore"] == "true"
    event["status"] = status.to_s
    event["visitor"] = visitor['_id'].to_s
    @storage.add_event(event)
  end

  response.to_a
end

#find_or_create_visitor(request) ⇒ Object



43
44
45
# File 'lib/metry/rack/tracking.rb', line 43

def find_or_create_visitor(request)
  @storage.visitor(request.cookies[COOKIE]) || @storage.new_visitor
end

#save_visitor(response, visitor) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/metry/rack/tracking.rb', line 47

def save_visitor(response, visitor)
  @storage.save_visitor(visitor)
  response.set_cookie(COOKIE,
    :value => visitor['_id'].to_s,
    :expires => (Time.now+(60*60*24*365*20)),
    :path => '/')
end