From 7518f32f5e47e2479df97cb79e4c659fd874a4f5 Mon Sep 17 00:00:00 2001 From: Renzo Lucioni Date: Mon, 17 Jun 2013 10:30:17 -0400 Subject: [PATCH 1/5] Instrument sequentials with segment-io so we know when people switch tabs manually or using the arrows to navigate --- .../xmodule/js/src/sequence/display.coffee | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/common/lib/xmodule/xmodule/js/src/sequence/display.coffee b/common/lib/xmodule/xmodule/js/src/sequence/display.coffee index 0e4c9788ba..3e371de439 100644 --- a/common/lib/xmodule/xmodule/js/src/sequence/display.coffee +++ b/common/lib/xmodule/xmodule/js/src/sequence/display.coffee @@ -111,6 +111,11 @@ class @Sequence if (1 <= new_position) and (new_position <= @num_contents) Logger.log "seq_goto", old: @position, new: new_position, id: @id + analytics.track "Sequential Goto", + old: @position + new: new_position + id: @id + # On Sequence chage, destroy any existing polling thread # for queued submissions, see ../capa/display.coffee if window.queuePollerID @@ -127,12 +132,22 @@ class @Sequence Logger.log "seq_next", old: @position, new: new_position, id: @id @render new_position + analytics.track "Sequential Next", + old: @position + new: new_position + id: @id + previous: (event) => event.preventDefault() new_position = @position - 1 Logger.log "seq_prev", old: @position, new: new_position, id: @id @render new_position + analytics.track "Sequential Previous", + old: @position + new: new_position + id: @id + link_for: (position) -> @$("#sequence-list a[data-element=#{position}]") From c30d2d2f529656c2ace96e9c30e44577269fb23d Mon Sep 17 00:00:00 2001 From: Renzo Lucioni Date: Mon, 17 Jun 2013 13:48:50 -0400 Subject: [PATCH 2/5] Incorporate Segment.io into Logger.log with whitelist --- .../xmodule/js/src/sequence/display.coffee | 15 --------------- common/static/coffee/src/logger.coffee | 7 +++++++ lms/envs/common.py | 2 +- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/common/lib/xmodule/xmodule/js/src/sequence/display.coffee b/common/lib/xmodule/xmodule/js/src/sequence/display.coffee index 3e371de439..0e4c9788ba 100644 --- a/common/lib/xmodule/xmodule/js/src/sequence/display.coffee +++ b/common/lib/xmodule/xmodule/js/src/sequence/display.coffee @@ -111,11 +111,6 @@ class @Sequence if (1 <= new_position) and (new_position <= @num_contents) Logger.log "seq_goto", old: @position, new: new_position, id: @id - analytics.track "Sequential Goto", - old: @position - new: new_position - id: @id - # On Sequence chage, destroy any existing polling thread # for queued submissions, see ../capa/display.coffee if window.queuePollerID @@ -132,22 +127,12 @@ class @Sequence Logger.log "seq_next", old: @position, new: new_position, id: @id @render new_position - analytics.track "Sequential Next", - old: @position - new: new_position - id: @id - previous: (event) => event.preventDefault() new_position = @position - 1 Logger.log "seq_prev", old: @position, new: new_position, id: @id @render new_position - analytics.track "Sequential Previous", - old: @position - new: new_position - id: @id - link_for: (position) -> @$("#sequence-list a[data-element=#{position}]") diff --git a/common/static/coffee/src/logger.coffee b/common/static/coffee/src/logger.coffee index 58395ba831..6da4929fb0 100644 --- a/common/static/coffee/src/logger.coffee +++ b/common/static/coffee/src/logger.coffee @@ -1,5 +1,12 @@ class @Logger + # events we want sent to Segment.io for tracking + SEGMENT_IO_WHITELIST = ["seq_goto", "seq_next", "seq_prev"] + @log: (event_type, data) -> + if event_type in SEGMENT_IO_WHITELIST + # Segment.io event tracking + analytics.track event_type, data + $.getWithPrefix '/event', event_type: event_type event: JSON.stringify(data) diff --git a/lms/envs/common.py b/lms/envs/common.py index ef590a5149..2c36c7e0c3 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -102,7 +102,7 @@ MITX_FEATURES = { # Staff Debug tool. 'ENABLE_STUDENT_HISTORY_VIEW': True, - # segment.io for LMS--need to explicitly turn it on on production. + # segment.io for LMS--need to explicitly turn it on for production. 'SEGMENT_IO_LMS': False, # Enables the student notes API and UI. From f528f61ec11c7a51eef157c21f42d1c494ad5b2b Mon Sep 17 00:00:00 2001 From: Renzo Lucioni Date: Mon, 17 Jun 2013 16:18:07 -0400 Subject: [PATCH 3/5] Add new Jasmine test to ensure Segment.io is called when appropriate --- common/static/coffee/spec/logger_spec.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/static/coffee/spec/logger_spec.coffee b/common/static/coffee/spec/logger_spec.coffee index 8fdfb99251..3a274f101e 100644 --- a/common/static/coffee/spec/logger_spec.coffee +++ b/common/static/coffee/spec/logger_spec.coffee @@ -3,6 +3,11 @@ describe 'Logger', -> expect(window.log_event).toBe Logger.log describe 'log', -> + it 'send event to Segment.io if event is whitelisted', -> + spyOn 'analytics.track' + Logger.log 'seq_goto', 'data' + expect(analytics.track).toHaveBeenCalledWith 'seq_goto', 'data' + it 'send a request to log event', -> spyOn $, 'getWithPrefix' Logger.log 'example', 'data' From 305e9315ef147e4590ca80a7b7843ed34f6f030e Mon Sep 17 00:00:00 2001 From: Renzo Lucioni Date: Tue, 18 Jun 2013 14:27:43 -0400 Subject: [PATCH 4/5] Write Jasmine tests to prove Segment.io works in Logger --- common/static/coffee/spec/logger_spec.coffee | 27 +++++++++++++++++-- .../jasmine/jasmine_test_runner.html.erb | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/common/static/coffee/spec/logger_spec.coffee b/common/static/coffee/spec/logger_spec.coffee index 3a274f101e..9c9e3110a0 100644 --- a/common/static/coffee/spec/logger_spec.coffee +++ b/common/static/coffee/spec/logger_spec.coffee @@ -1,10 +1,22 @@ describe 'Logger', -> + beforeEach -> + window.analytics = jasmine.createSpyObj('analytics', ['track']) + analytics.track.andCallFake(-> + $.ajax('/foo'); + ) + @requests = requests = [] + @xhr = sinon.useFakeXMLHttpRequest() + @xhr.onCreate = (xhr) -> requests.push(xhr) + + afterEach -> + @xhr.restore() + delete window.analytics + it 'expose window.log_event', -> expect(window.log_event).toBe Logger.log describe 'log', -> - it 'send event to Segment.io if event is whitelisted', -> - spyOn 'analytics.track' + it 'sends an event to Segment.io, if the event is whitelisted', -> Logger.log 'seq_goto', 'data' expect(analytics.track).toHaveBeenCalledWith 'seq_goto', 'data' @@ -16,6 +28,17 @@ describe 'Logger', -> event: '"data"' page: window.location.href + it 'continues to log events if Segment.io is down', -> + spyOn($, 'getWithPrefix').andCallThrough() + Logger.log 'seq_goto', 'data' + expect(@requests.length).toEqual 2 + expect(@requests[0].url).toMatch /foo/ + @requests[0].respond(500) + expect($.getWithPrefix).toHaveBeenCalledWith '/event', + event_type: 'seq_goto' + event: '"data"' + page: window.location.href + # Broken with commit 9f75e64? Skipping for now. xdescribe 'bind', -> beforeEach -> diff --git a/common/templates/jasmine/jasmine_test_runner.html.erb b/common/templates/jasmine/jasmine_test_runner.html.erb index 4d82826186..9ea6ef42a3 100644 --- a/common/templates/jasmine/jasmine_test_runner.html.erb +++ b/common/templates/jasmine/jasmine_test_runner.html.erb @@ -26,6 +26,7 @@ + +