jam-cloud/ruby/lib/jam_ruby/resque/google_analytics_event.rb

109 lines
3.5 KiB
Ruby
Raw Normal View History

2014-03-09 13:38:46 +00:00
require 'resque'
2014-01-30 21:51:05 +00:00
# more info on Measurement Protocol https://developers.google.com/analytics/devguides/collection/protocol/v1/
2014-03-09 13:38:46 +00:00
module JamRuby
class GoogleAnalyticsEvent
2014-01-30 21:51:05 +00:00
2014-03-09 13:38:46 +00:00
@queue = :google_analytics_event
2014-01-30 21:51:05 +00:00
2014-03-09 13:38:46 +00:00
CAT_SESS_SIZE = 'SessionSize'
ACTION_SESS_SIZE = 'Size'
CAT_SESS_DUR = 'SessionDuration'
ACTION_SESS_DUR = 'Duration'
CAT_BAND = 'Band'
ACTION_BAND_SESS = 'Session'
ACTION_BAND_REC = 'Recording'
2014-01-30 21:51:05 +00:00
2014-03-09 13:38:46 +00:00
@@log = Logging.logger[GoogleAnalyticsEvent]
2014-01-30 21:51:05 +00:00
2014-03-09 13:38:46 +00:00
SESSION_INTERVALS = [1, 5, 10, 15, 30, 45, 60, 90, 120, 180] # minutes
2014-04-14 10:57:21 +00:00
QUEUE_BAND_TRACKER = :band_tracker
2014-03-09 13:38:46 +00:00
QUEUE_SESSION_TRACKER = :session_tracker
2014-01-30 21:51:05 +00:00
2014-03-09 13:38:46 +00:00
class SessionDurationTracker
@queue = QUEUE_SESSION_TRACKER
2014-01-30 21:51:05 +00:00
2014-04-14 10:57:21 +00:00
def self.perform(args={})
session_id, interval_idx = args['session_id'], args['interval_idx'].to_i
2014-05-06 02:55:32 +00:00
return unless session_id && session = MusicSession.find_by_id(session_id)
2014-04-14 10:57:21 +00:00
GoogleAnalyticsEvent.enqueue(CAT_SESS_DUR, ACTION_SESS_DUR, SESSION_INTERVALS[interval_idx])
2014-03-09 13:38:46 +00:00
interval_idx += 1
if SESSION_INTERVALS.count-1 > interval_idx
next_time = session.created_at + SESSION_INTERVALS[interval_idx].minutes
Resque.enqueue_at(next_time, self, :session_id => session_id, :interval_idx => interval_idx)
2014-03-09 13:38:46 +00:00
end
end
end
2014-01-30 21:51:05 +00:00
def self.track_session_duration(session)
Resque.enqueue_at(SESSION_INTERVALS[0].minute.from_now,
SessionDurationTracker,
:session_id => session.id,
:interval_idx => 0)
end
2014-03-09 13:38:46 +00:00
class BandSessionTracker
2014-04-14 10:57:21 +00:00
@queue = QUEUE_BAND_TRACKER
2014-03-09 13:38:46 +00:00
def self.perform(session_id)
return unless session = ActiveMusicSession.find(session_id)
2014-03-09 13:38:46 +00:00
band = session.band
2014-03-10 08:58:03 +00:00
if band.in_real_session?(session)
2014-04-14 10:57:21 +00:00
band.update_attribute(:did_real_session, true)
GoogleAnalyticsEvent.enqueue(CAT_BAND, ACTION_BAND_SESS, nil)
2014-03-09 13:38:46 +00:00
end if band
end
2014-01-30 21:51:05 +00:00
end
2014-03-09 13:38:46 +00:00
BAND_SESSION_MIN_DURATION = 15 # minutes
def self.track_band_real_session(session)
if session.band && !session.band.did_real_session?
2014-04-14 10:57:21 +00:00
Resque.enqueue_at(BAND_SESSION_MIN_DURATION.minutes.from_now,
2014-03-09 13:38:46 +00:00
BandSessionTracker,
2014-04-14 10:57:21 +00:00
session.id)
2014-03-09 13:38:46 +00:00
end
end
def self.report_band_recording(band)
if band && 1 == Recording.where(:band_id => band.id).count
self.enqueue(CAT_BAND, ACTION_BAND_REC)
end
end
2014-01-30 21:51:05 +00:00
2014-03-09 13:38:46 +00:00
def self.report_session_participant(participant_count)
self.enqueue(CAT_SESS_SIZE, ACTION_SESS_SIZE, participant_count)
end
2014-01-30 21:51:05 +00:00
2014-03-09 13:38:46 +00:00
def self.enqueue(category, event, data=nil)
begin
Resque.enqueue(GoogleAnalyticsEvent, category, event, data)
true
rescue
# implies redis is down. but since there is no retry logic with this, we should at least log a warn in case we've configured something wrong
@@log.warn("unable to enqueue")
false
end
end
def self.perform(category, action, data)
@@log.info("starting (#{category}, #{action})")
raise "no google analytics tracking ID" unless APP_CONFIG.ga_ua
params = {
2014-01-30 21:51:05 +00:00
v: APP_CONFIG.ga_ua_version,
tid: APP_CONFIG.ga_ua,
cid: APP_CONFIG.ga_anonymous_client_id,
t: "event",
ec: category,
2014-03-09 13:38:46 +00:00
ea: action,
el: 'data',
ev: data.to_s
}
RestClient.post(APP_CONFIG.ga_endpoint, params: params, timeout: 8, open_timeout: 8)
@@log.info("done (#{category}, #{action})")
end
2014-01-30 21:51:05 +00:00
end
2014-03-09 13:38:46 +00:00
end