From f4d78a856cca2e2ce8c0b361baac681390538d61 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 14:20:39 +0100 Subject: [PATCH 1/8] Disable page view and session tracking. --- services/web/app/views/layout.jade | 3 --- 1 file changed, 3 deletions(-) diff --git a/services/web/app/views/layout.jade b/services/web/app/views/layout.jade index cd284c95e2..83d7da4838 100644 --- a/services/web/app/views/layout.jade +++ b/services/web/app/views/layout.jade @@ -56,9 +56,6 @@ html(itemscope, itemtype='http://schema.org/Product') Countly.url = '#{settings.analytics.countly.server}'; !{ session.user ? 'Countly.device_id = "' + session.user._id + '";' : '' } - Countly.q.push(['track_sessions']); - Countly.q.push(['track_pageview']); - (function() { var cly = document.createElement('script'); cly.type = 'text/javascript'; cly.async = true; From 5ea9558976ada29bc9867d3bbc05595120b4fe37 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 15:53:04 +0100 Subject: [PATCH 2/8] Add method to track event only once (stores sent events in local storage). --- services/web/public/coffee/main/event.coffee | 33 +++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/main/event.coffee b/services/web/public/coffee/main/event.coffee index 68decfd5ee..46a443b4f5 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -1,8 +1,34 @@ define [ "base" ], (App) -> + CACHE_KEY = "countlyEvents" + + _getEventCache = () -> + eventCache = window.localStorage.getItem CACHE_KEY + + # Initialize as an empy object if the event cache is still empty. + if !eventCache? + window.localStorage.setItem(CACHE_KEY, "{}") + eventCache = window.localStorage.getItem CACHE_KEY + + return JSON.parse eventCache + + _eventInCache = (key) -> + curCache = _getEventCache() + + if (curCache.hasOwnProperty key) + _getEventCache()[key] + else + false + + _addEventToCache = (key) -> + curCache = _getEventCache() + curCache[key] = true + curCacheAsStr = JSON.stringify curCache + window.localStorage.setItem CACHE_KEY, curCacheAsStr App.factory "event_tracking", -> + return { send: (category, action, label, value)-> ga('send', 'event', category, action, label, value) @@ -10,10 +36,15 @@ define [ sendCountly: (key, segmentation) -> eventData = { key } eventData.segmentation = segmentation if segmentation? - Countly?.q.push([ "add_event", eventData ]); + Countly?.q.push([ "add_event", eventData ]) sendCountlySampled: (key, segmentation) -> @sendCountly key, segmentation if Math.random() < .01 + + sendCountlyOnce: (key, segmentation) -> + if ! _eventInCache(key) + _addEventToCache(key) + @sendCountly key, segmentation } # App.directive "countlyTrack", () -> From 64654257a15bd5efff85fdb7befe4308f477a2ea Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 15:53:28 +0100 Subject: [PATCH 3/8] Track a few high-frequency events only once. --- services/web/public/coffee/ide.coffee | 6 +++--- .../public/coffee/ide/pdf/controllers/PdfController.coffee | 4 ++-- .../coffee/ide/share/controllers/ShareController.coffee | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index e984b408d5..c34482fca0 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -72,13 +72,13 @@ define [ # Tracking code. $scope.$watch "ui.view", (newView, oldView) -> if newView? and newView != "editor" and newView != "pdf" - event_tracking.sendCountly "ide-open-view-#{ newView }" + event_tracking.sendCountlyOnce "ide-open-view-#{ newView }" $scope.$watch "ui.chatOpen", (isOpen) -> - event_tracking.sendCountly "ide-open-chat" if isOpen + event_tracking.sendCountlyOnce "ide-open-chat" if isOpen $scope.$watch "ui.leftMenuShown", (isOpen) -> - event_tracking.sendCountly "ide-open-left-menu" if isOpen + event_tracking.sendCountlyOnce "ide-open-left-menu" if isOpen # End of tracking code. window._ide = ide diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 36c0b1cdae..f9daf4315a 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -333,7 +333,7 @@ define [ $scope.toggleLogs = () -> $scope.shouldShowLogs = !$scope.shouldShowLogs - event_tracking.sendCountly "ide-open-logs" if $scope.shouldShowLogs + event_tracking.sendCountlyOnce "ide-open-logs" if $scope.shouldShowLogs $scope.showPdf = () -> $scope.pdf.view = "pdf" @@ -499,7 +499,7 @@ define [ App.controller "PdfLogEntryController", ["$scope", "ide", "event_tracking", ($scope, ide, event_tracking) -> $scope.openInEditor = (entry) -> - event_tracking.sendCountly 'logs-jump-to-location' + event_tracking.sendCountlyOnce 'logs-jump-to-location' entity = ide.fileTreeManager.findEntityByPath(entry.file) return if !entity? or entity.type != "doc" if entry.line? diff --git a/services/web/public/coffee/ide/share/controllers/ShareController.coffee b/services/web/public/coffee/ide/share/controllers/ShareController.coffee index fc74862528..9f338ae48d 100644 --- a/services/web/public/coffee/ide/share/controllers/ShareController.coffee +++ b/services/web/public/coffee/ide/share/controllers/ShareController.coffee @@ -3,7 +3,7 @@ define [ ], (App) -> App.controller "ShareController", ["$scope", "$modal", "event_tracking", ($scope, $modal, event_tracking) -> $scope.openShareProjectModal = () -> - event_tracking.sendCountly "ide-open-share-modal" + event_tracking.sendCountlyOnce "ide-open-share-modal" $modal.open( templateUrl: "shareProjectModalTemplate" From 406175a410f5d80dc218e160fdd79cc53a926ff6 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 16:17:16 +0100 Subject: [PATCH 4/8] Protection against possible local storage write errors. --- services/web/public/coffee/main/event.coffee | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/services/web/public/coffee/main/event.coffee b/services/web/public/coffee/main/event.coffee index 46a443b4f5..f84ccdcc2a 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -4,14 +4,18 @@ define [ CACHE_KEY = "countlyEvents" _getEventCache = () -> - eventCache = window.localStorage.getItem CACHE_KEY + eventCacheStr = window.localStorage.getItem CACHE_KEY # Initialize as an empy object if the event cache is still empty. - if !eventCache? - window.localStorage.setItem(CACHE_KEY, "{}") - eventCache = window.localStorage.getItem CACHE_KEY + if !eventCacheStr? + eventCacheStr = "{}" - return JSON.parse eventCache + # Errors writing to localStorage may happen when quota is full or + # browser is in incognito mode. We'll return an empty object, anyway. + try + window.localStorage.setItem CACHE_KEY, eventCacheStr + + return JSON.parse eventCacheStr _eventInCache = (key) -> curCache = _getEventCache() @@ -25,7 +29,11 @@ define [ curCache = _getEventCache() curCache[key] = true curCacheAsStr = JSON.stringify curCache - window.localStorage.setItem CACHE_KEY, curCacheAsStr + + # Protection against issues mentioned above. + try + window.localStorage.setItem CACHE_KEY, curCacheAsStr + App.factory "event_tracking", -> From a3af95006b3509cc93e8b0b1b8112f793a86e387 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 16:22:23 +0100 Subject: [PATCH 5/8] Minor fixes. --- services/web/public/coffee/main/event.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/web/public/coffee/main/event.coffee b/services/web/public/coffee/main/event.coffee index f84ccdcc2a..fdfcad6e13 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -21,7 +21,7 @@ define [ curCache = _getEventCache() if (curCache.hasOwnProperty key) - _getEventCache()[key] + curCache[key] else false @@ -36,7 +36,6 @@ define [ App.factory "event_tracking", -> - return { send: (category, action, label, value)-> ga('send', 'event', category, action, label, value) From a93980f080427baacc6cb3b7541e65199cc739e6 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 16:53:44 +0100 Subject: [PATCH 6/8] Use existing localStorage module. --- services/web/public/coffee/main/event.coffee | 45 +++++++++----------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/services/web/public/coffee/main/event.coffee b/services/web/public/coffee/main/event.coffee index fdfcad6e13..cdbcf93328 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -1,41 +1,34 @@ define [ "base" + "modules/localStorage" ], (App) -> CACHE_KEY = "countlyEvents" - _getEventCache = () -> - eventCacheStr = window.localStorage.getItem CACHE_KEY + App.factory "event_tracking", (localStorage) -> + _getEventCache = () -> + eventCache = localStorage CACHE_KEY - # Initialize as an empy object if the event cache is still empty. - if !eventCacheStr? - eventCacheStr = "{}" + # Initialize as an empy object if the event cache is still empty. + if !eventCache? + eventCache = {} + localStorage CACHE_KEY, eventCache - # Errors writing to localStorage may happen when quota is full or - # browser is in incognito mode. We'll return an empty object, anyway. - try - window.localStorage.setItem CACHE_KEY, eventCacheStr + return eventCache - return JSON.parse eventCacheStr + _eventInCache = (key) -> + curCache = _getEventCache() - _eventInCache = (key) -> - curCache = _getEventCache() + if (curCache.hasOwnProperty key) + curCache[key] + else + false - if (curCache.hasOwnProperty key) - curCache[key] - else - false + _addEventToCache = (key) -> + curCache = _getEventCache() + curCache[key] = true - _addEventToCache = (key) -> - curCache = _getEventCache() - curCache[key] = true - curCacheAsStr = JSON.stringify curCache + localStorage CACHE_KEY, curCache - # Protection against issues mentioned above. - try - window.localStorage.setItem CACHE_KEY, curCacheAsStr - - - App.factory "event_tracking", -> return { send: (category, action, label, value)-> ga('send', 'event', category, action, label, value) From 4c2f69692e0cf1d84c5807b450e29358afff2625 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 16:56:14 +0100 Subject: [PATCH 7/8] Namespace events which are sent only once. --- services/web/public/coffee/ide.coffee | 6 +++--- .../public/coffee/ide/pdf/controllers/PdfController.coffee | 4 ++-- .../coffee/ide/share/controllers/ShareController.coffee | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/services/web/public/coffee/ide.coffee b/services/web/public/coffee/ide.coffee index c34482fca0..4c75ab5d77 100644 --- a/services/web/public/coffee/ide.coffee +++ b/services/web/public/coffee/ide.coffee @@ -72,13 +72,13 @@ define [ # Tracking code. $scope.$watch "ui.view", (newView, oldView) -> if newView? and newView != "editor" and newView != "pdf" - event_tracking.sendCountlyOnce "ide-open-view-#{ newView }" + event_tracking.sendCountlyOnce "ide-open-view-#{ newView }-once" $scope.$watch "ui.chatOpen", (isOpen) -> - event_tracking.sendCountlyOnce "ide-open-chat" if isOpen + event_tracking.sendCountlyOnce "ide-open-chat-once" if isOpen $scope.$watch "ui.leftMenuShown", (isOpen) -> - event_tracking.sendCountlyOnce "ide-open-left-menu" if isOpen + event_tracking.sendCountlyOnce "ide-open-left-menu-once" if isOpen # End of tracking code. window._ide = ide diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index f9daf4315a..0f8134258c 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -333,7 +333,7 @@ define [ $scope.toggleLogs = () -> $scope.shouldShowLogs = !$scope.shouldShowLogs - event_tracking.sendCountlyOnce "ide-open-logs" if $scope.shouldShowLogs + event_tracking.sendCountlyOnce "ide-open-logs-once" if $scope.shouldShowLogs $scope.showPdf = () -> $scope.pdf.view = "pdf" @@ -499,7 +499,7 @@ define [ App.controller "PdfLogEntryController", ["$scope", "ide", "event_tracking", ($scope, ide, event_tracking) -> $scope.openInEditor = (entry) -> - event_tracking.sendCountlyOnce 'logs-jump-to-location' + event_tracking.sendCountlyOnce "logs-jump-to-location-once" entity = ide.fileTreeManager.findEntityByPath(entry.file) return if !entity? or entity.type != "doc" if entry.line? diff --git a/services/web/public/coffee/ide/share/controllers/ShareController.coffee b/services/web/public/coffee/ide/share/controllers/ShareController.coffee index 9f338ae48d..2378391974 100644 --- a/services/web/public/coffee/ide/share/controllers/ShareController.coffee +++ b/services/web/public/coffee/ide/share/controllers/ShareController.coffee @@ -3,7 +3,7 @@ define [ ], (App) -> App.controller "ShareController", ["$scope", "$modal", "event_tracking", ($scope, $modal, event_tracking) -> $scope.openShareProjectModal = () -> - event_tracking.sendCountlyOnce "ide-open-share-modal" + event_tracking.sendCountlyOnce "ide-open-share-modal-once" $modal.open( templateUrl: "shareProjectModalTemplate" From 38251117130bb0e410359f5949bb5a052c37924c Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 27 Jul 2016 17:08:15 +0100 Subject: [PATCH 8/8] No need to check for property existence. --- services/web/public/coffee/main/event.coffee | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/services/web/public/coffee/main/event.coffee b/services/web/public/coffee/main/event.coffee index cdbcf93328..371bd1004e 100644 --- a/services/web/public/coffee/main/event.coffee +++ b/services/web/public/coffee/main/event.coffee @@ -17,11 +17,7 @@ define [ _eventInCache = (key) -> curCache = _getEventCache() - - if (curCache.hasOwnProperty key) - curCache[key] - else - false + curCache[key] || false _addEventToCache = (key) -> curCache = _getEventCache()