Update internal analytics

Adding level session ID where applicable.
Slimming down fields for most common events.
This commit is contained in:
Matt Lott 2015-01-15 11:04:48 -08:00
parent 1ab2ea6910
commit 116c7d0bf2
8 changed files with 78 additions and 25 deletions

View file

@ -79,10 +79,12 @@ module.exports = class Tracker
unless event in ['Simulator Result', 'Started Level Load', 'Finished Level Load']
# Trimming properties we don't use internally
# TODO: delete internalProperites.level for 'Saw Victory' after 2/8/15. Should be using levelID instead.
if event in ['Clicked Level', 'Inventory Play', 'Heard Sprite', 'Started Level', 'Saw Victory', 'Click Play', 'Choose Inventory', 'Loaded World Map', 'Homepage Loaded']
if event in ['Clicked Level', 'Inventory Play', 'Heard Sprite', 'Started Level', 'Saw Victory', 'Click Play', 'Choose Inventory', 'Loaded World Map', 'Homepage Loaded', 'Change Hero']
delete properties.category
delete properties.label
else if event in ['Started Signup', 'Finished Signup', 'Login', 'Facebook Login', 'Google Login']
delete properties.category
console.log 'Tracking internal analytics event:', event, properties if debugAnalytics
request = @supermodel.addRequestResource 'log_event', {
url: '/db/analytics_log_event/-/log_event'

View file

@ -221,7 +221,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@scriptInProgress = true
@currentTimeouts = []
scriptLabel = "#{nextNoteGroup.scriptID} - #{nextNoteGroup.name}"
application.tracker?.trackEvent 'Script Started', {levelID: @levelID, label: scriptLabel}, ['Google Analytics']
application.tracker?.trackEvent 'Script Started', {levelID: @levelID, label: scriptLabel, ls: @session?.get('_id')}, ['Google Analytics']
console.debug "SCRIPT: Starting note group '#{nextNoteGroup.name}'" if @debugScripts
for module in nextNoteGroup.modules
@processNote(note, nextNoteGroup) for note in module.startNotes()
@ -284,7 +284,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@ending = true
return unless @currentNoteGroup?
scriptLabel = "#{@currentNoteGroup.scriptID} - #{@currentNoteGroup.name}"
application.tracker?.trackEvent 'Script Ended', {levelID: @levelID, label: scriptLabel}, ['Google Analytics']
application.tracker?.trackEvent 'Script Ended', {levelID: @levelID, label: scriptLabel, ls: @session?.get('_id')}, ['Google Analytics']
console.debug "SCRIPT: Ending note group '#{@currentNoteGroup.name}'" if @debugScripts
clearTimeout(timeout) for timeout in @currentTimeouts
for module in @currentNoteGroup.modules

View file

@ -17,6 +17,11 @@ module.exports = class LevelDialogueView extends CocoView
'click': 'onClick'
'click a': 'onClickLink'
constructor: (options) ->
super options
@level = options.level
@sessionID = options.sessionID
onClick: (e) ->
Backbone.Mediator.publish 'tome:focus-editor', {}
@ -33,7 +38,7 @@ module.exports = class LevelDialogueView extends CocoView
$('body').addClass('dialogue-view-active')
@setMessage e.message, e.mood, e.responses
window.tracker?.trackEvent 'Heard Sprite', {message: e.message, label: e.message}, ['Google Analytics']
window.tracker?.trackEvent 'Heard Sprite', {message: e.message, label: e.message, ls: @sessionID}, ['Google Analytics']
onDialogueSoundCompleted: ->
@$el.removeClass 'speaking'

View file

@ -239,7 +239,7 @@ module.exports = class PlayLevelView extends RootView
@insertSubView new LevelFlagsView levelID: @levelID, world: @world if @$el.hasClass 'flags'
@insertSubView new GoldView {}
@insertSubView new HUDView {level: @level}
@insertSubView new LevelDialogueView {level: @level}
@insertSubView new LevelDialogueView {level: @level, sessionID: @session.id}
@insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session
@insertSubView new ProblemAlertView session: @session, level: @level, supermodel: @supermodel
worldName = utils.i18n @level.attributes, 'name'
@ -335,7 +335,8 @@ module.exports = class PlayLevelView extends RootView
if @options.realTimeMultiplayerSessionID?
Backbone.Mediator.publish 'playback:real-time-playback-waiting', {}
@realTimeMultiplayerContinueGame @options.realTimeMultiplayerSessionID
application.tracker?.trackEvent 'Started Level', category:'Play Level', levelID: @levelID
# TODO: Is it possible to create a Mongoose ObjectId for 'ls', instead of the string returned from get()?
application.tracker?.trackEvent 'Started Level', category:'Play Level', levelID: @levelID, ls: @session?.get('_id')
playAmbientSound: ->
return if @destroyed
@ -418,6 +419,7 @@ module.exports = class PlayLevelView extends RootView
level: @level.get('name')
label: @level.get('name')
levelID: @levelID
ls: @session?.get('_id')
application.tracker?.trackTiming victoryTime, 'Level Victory Time', @levelID, @levelID, 100
showVictory: ->

View file

@ -74,7 +74,7 @@ module.exports = class ProblemAlertView extends CocoView
@onWindowResize()
@render()
@onJiggleProblemAlert()
application.tracker?.trackEvent 'Show problem alert', levelID: @level.get('slug')
application.tracker?.trackEvent 'Show problem alert', {levelID: @level.get('slug'), ls: @session?.get('_id')}
onJiggleProblemAlert: ->
return unless @problem?
@ -90,7 +90,7 @@ module.exports = class ProblemAlertView extends CocoView
@onRemoveClicked()
onClickProblemAlertHelp: ->
application.tracker?.trackEvent 'Problem alert help clicked', levelID: @level.get('slug')
application.tracker?.trackEvent 'Problem alert help clicked', {levelID: @level.get('slug'), ls: @session?.get('_id')}
@openModalView new GameMenuModal showTab: 'guide', level: @level, session: @session, supermodel: @supermodel
onRemoveClicked: ->

View file

@ -14,6 +14,7 @@ module.exports = class LevelGuideView extends CocoView
constructor: (options) ->
@levelID = options.level.get('slug')
@sessionID = options.session.get('_id')
@helpVideos = options.level.get('helpVideos') ? []
@trackedHelpVideoStart = @trackedHelpVideoFinish = false
@ -85,12 +86,12 @@ module.exports = class LevelGuideView extends CocoView
onStartHelpVideo: ->
unless @trackedHelpVideoStart
window.tracker?.trackEvent 'Start help video', level: @levelID, style: @helpVideos[@helpVideosIndex].style
window.tracker?.trackEvent 'Start help video', level: @levelID, ls: @sessionID, style: @helpVideos[@helpVideosIndex].style
@trackedHelpVideoStart = true
onFinishHelpVideo: ->
unless @trackedHelpVideoFinish
window.tracker?.trackEvent 'Finish help video', level: @levelID, style: @helpVideos[@helpVideosIndex].style
window.tracker?.trackEvent 'Finish help video', level: @levelID, ls: @sessionID, style: @helpVideos[@helpVideosIndex].style
@trackedHelpVideoFinish = true
setupVideoPlayer: () ->

View file

@ -1,9 +1,10 @@
log = require 'winston'
mongoose = require 'mongoose'
utils = require '../lib/utils'
AnalyticsLogEvent = require './AnalyticsLogEvent'
Campaign = require '../campaigns/Campaign'
Level = require '../levels/Level'
Handler = require '../commons/Handler'
log = require 'winston'
utils = require '../lib/utils'
class AnalyticsLogEventHandler extends Handler
modelClass: AnalyticsLogEvent
@ -54,17 +55,10 @@ class AnalyticsLogEventHandler extends Handler
if eventID > 0
# TODO: properties slimming is pretty ugly
slimProperties = _.cloneDeep properties
if event is 'Saw Victory'
delete slimProperties.level
if slimProperties.levelID?
# levelID: string => l: string ID
utils.getAnalyticsStringID slimProperties.levelID, (levelStringID) ->
if levelStringID > 0
delete slimProperties.levelID
slimProperties.l = levelStringID
saveDoc eventID, slimProperties
return
else if event is 'Started Level'
if event in ['Clicked Level', 'Show problem alert', 'Started Level', 'Saw Victory', 'Problem alert help clicked', 'Spell palette help clicked']
delete slimProperties.level if event is 'Saw Victory'
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.levelID?
# levelID: string => l: string ID
utils.getAnalyticsStringID slimProperties.levelID, (levelStringID) ->
@ -74,7 +68,9 @@ class AnalyticsLogEventHandler extends Handler
saveDoc eventID, slimProperties
return
else if event in ['Script Started', 'Script Ended']
if slimProperties.levelID?
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.levelID? and slimProperties.label?
# levelID: string => l: string ID
# label: string => lb: string ID
utils.getAnalyticsStringID slimProperties.levelID, (levelStringID) ->
@ -87,6 +83,52 @@ class AnalyticsLogEventHandler extends Handler
slimProperties.lb = labelStringID
saveDoc eventID, slimProperties
return
else if event is 'Heard Sprite'
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.message?
# message: string => m: string ID
utils.getAnalyticsStringID slimProperties.message, (messageStringID) ->
if messageStringID > 0
delete slimProperties.message
slimProperties.m = messageStringID
saveDoc eventID, slimProperties
return
else if event in ['Start help video', 'Finish help video']
properties.ls = mongoose.Types.ObjectId properties.ls if properties.ls
slimProperties.ls = mongoose.Types.ObjectId slimProperties.ls if slimProperties.ls
if slimProperties.level and slimProperties.style?
# level: string => l: string ID
# style: string => s: string ID
utils.getAnalyticsStringID slimProperties.level, (levelStringID) ->
if levelStringID > 0
delete slimProperties.level
slimProperties.l = levelStringID
utils.getAnalyticsStringID slimProperties.style, (styleStringID) ->
if styleStringID > 0
delete slimProperties.style
slimProperties.s = styleStringID
saveDoc eventID, slimProperties
return
else if event is 'Show subscription modal'
delete properties.category
delete slimProperties.category
if slimProperties.label?
# label: string => lb: string ID
utils.getAnalyticsStringID slimProperties.label, (labelStringID) ->
if labelStringID > 0
delete slimProperties.label
slimProperties.lb = labelStringID
if slimProperties.level?
# level: string => l: string ID
utils.getAnalyticsStringID slimProperties.level, (levelStringID) ->
if levelStringID > 0
delete slimProperties.level
slimProperties.l = levelStringID
saveDoc eventID, slimProperties
return
saveDoc eventID, slimProperties
return
saveDoc eventID, slimProperties
else
log.warn "Unable to get analytics string ID for " + event

View file

@ -15,6 +15,7 @@ module.exports =
# Create an ObjectId with that hex timestamp
mongoose.Types.ObjectId(hexSeconds + "0000000000000000")
getAnalyticsStringID: (str, callback) ->
return callback -1 unless str?
@analyticsStringCache ?= {}
return callback @analyticsStringCache[str] if @analyticsStringCache[str]