Class: Snapstats::EventLogger

Inherits:
Object
  • Object
show all
Defined in:
lib/event_logger/event_logger.rb,
lib/event_logger/event_logger_store.rb,
lib/event_logger/event_logger_static.rb

Constant Summary collapse

@@is_started =
false

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEventLogger

Returns a new instance of EventLogger.



7
8
9
# File 'lib/event_logger/event_logger.rb', line 7

def initialize
  @redis = Snapstats::redis
end

Class Method Details

.init_events(opt = {}) ⇒ Object



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
61
62
63
64
65
66
67
68
69
70
# File 'lib/event_logger/event_logger_static.rb', line 25

def self.init_events opt={}
  
      ActionController::Instrumentation.send(:define_method, "process_action") do |arg|

fetch_user_id = -> params { 
  model = params.try(:[], :devise_model).try(:[], :model) || :user
  request.env['warden'].try(model.to_sym).try(:id)
}

fetch_user_email = -> params {
  model = params.try(:[], :devise_model).try(:[], :model) || :user

  if params[:devise_model].present? && params[:devise_model].try(:[], :login_fields).present?
    return params[:devise_model][:login_fields].map{ |field| request.env['warden'].try(model.to_sym).try(field.to_sym) }.compact.first
  else
    return request.env['warden'].try(model.to_sym).try(:email)
  end
}

 raw_payload = {
   :controller => self.class.name,
   :action     => self.action_name,
   :params     => request.filtered_parameters,
   :format     => request.format.try(:ref),
   :method     => request.method,
   :path       => (request.fullpath rescue "unknown"),

   :ip         => request.remote_ip,
   :stash      => request.session['flash'] && request.session['flash'][:log],
   
   :user_id   => fetch_user_id.call(opt),
   :user_email => fetch_user_email.call(opt),
   :user_agent => request.user_agent
 }

 ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload.dup)

 ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
   result = super(arg)
   payload[:status] = response.status
   append_info_to_payload(payload)
   result
 end
      end

end

.start(opt = {}) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/event_logger/event_logger_static.rb', line 7

def self.start opt={}
  unless @@is_started

Snapstats.set_redis opt[:redis]

unless opt[:disable_logging] == true
    init_events opt
    subscribe 
  end

  @@is_started = true
 end
end

.subscribeObject



21
22
23
# File 'lib/event_logger/event_logger_static.rb', line 21

def self.subscribe
  ActiveSupport::Notifications.subscribe('process_action.action_controller', self.new)
end

Instance Method Details

#call(name, started, finished, unique_id, payload) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/event_logger/event_logger.rb', line 11

def call name, started, finished, unique_id, payload
  return nil if payload[:controller].scan(/^Snapstats/ui).present?

  @payload = payload
   @payload[:render_time] = finished - started
   @user_agent = UserAgent.parse(@payload[:user_agent])

   store_cpm
  store_daily_activity
   store_daily_uniqs
   
   store_daily_platforms
   store_daily_browsers

  store_user_activity_table
   store_slowest_controller
end

#store_cpmObject

Daily report



7
8
9
# File 'lib/event_logger/event_logger_store.rb', line 7

def store_cpm
  @redis.hincrby mday("cpm"), Time.now.beginning_of_minute.to_i, 1
end

#store_daily_activityObject



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
# File 'lib/event_logger/event_logger_store.rb', line 11

def store_daily_activity

   time_key = Time.current.to_i

   value = { 
     path:  @payload[:path],
     ctrl:  @payload[:controller],
     actn:  @payload[:action],
     rntm:  @payload.keys.select{ |i| i.to_s.scan(/runtime/ui).present? }.reduce({}){ |sum, i| sum[i.to_s.gsub(/_runtime/ui, '').to_sym] = @payload[i].to_f.round(3); sum },
     os:    @user_agent.platform,
     brwsr: @user_agent.browser,
     brver: @user_agent.version.to_s,
     ip:    @payload[:ip],
     total: @payload[:render_time],
     email: @payload[:user_email],
     date: time_key
   }.to_json

   @redis.zadd mday('activity'), time_key, value

   # add here links to users in sets like

   if @payload[:user_id].present? && @payload[:user_email].present?
     
     uvalue = {
       ts:     time_key,
       path:   @payload[:path],
       total:  @payload[:render_time],
       os:     @user_agent.platform,
       brwsr:  @user_agent.browser,
       brver:  @user_agent.version.to_s

     }.to_json

     @redis.zadd mday("activity:user:#{@payload[:user_id]}"), time_key, uvalue
   end
end

#store_daily_browsersObject



57
58
59
# File 'lib/event_logger/event_logger_store.rb', line 57

def store_daily_browsers
  @redis.hset mday('browsers'), "#{@payload[:ip]}_#{@user_agent.browser}", @user_agent.browser
end

#store_daily_platformsObject



53
54
55
# File 'lib/event_logger/event_logger_store.rb', line 53

def store_daily_platforms
  @redis.hset mday('platforms'), "#{@payload[:ip]}_#{@user_agent.platform}", @user_agent.platform
end

#store_daily_uniqsObject



49
50
51
# File 'lib/event_logger/event_logger_store.rb', line 49

def store_daily_uniqs
  @redis.hincrby mday('uniq'), @payload[:ip], 1
end

#store_slowest_controllerObject

Performance



77
78
79
80
81
82
83
84
85
# File 'lib/event_logger/event_logger_store.rb', line 77

def store_slowest_controller

  value = {
    ctrl:  @payload[:controller],
    actn:  @payload[:action],
  }.to_json

  @redis.zadd mday('performance:controllers'), @payload[:render_time].to_f, value
end

#store_user_activity_tableObject

User activity



63
64
65
66
67
68
69
70
71
72
73
# File 'lib/event_logger/event_logger_store.rb', line 63

def store_user_activity_table
  return nil unless @payload[:user_id].present?

  value = { 
    ts:     Time.current.to_i, 
    path:   @payload[:path],
     email:  @payload[:user_email]
  }.to_json

  @redis.hset mday("activity:users"), @payload[:user_id], value 
end