JGirault has uploaded a new change for review. https://gerrit.wikimedia.org/r/311462
Change subject: WIP: Add module for collecting Kartographer metrics ...................................................................... WIP: Add module for collecting Kartographer metrics Pending: * Schema needs sign-off * "hashopen" event not implemented * "discovery" event not implemented * Define a user token? * Do a performance review * Add sampling? Change-Id: Ib12b87c55408040dd69c9f190721aa103019563c --- M extension.json M includes/DataModule.php M modules/box/Map.js A modules/eventlogging/index.js 4 files changed, 117 insertions(+), 1 deletion(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Kartographer refs/changes/62/311462/1 diff --git a/extension.json b/extension.json index a56ab62..f80c86b 100644 --- a/extension.json +++ b/extension.json @@ -267,6 +267,19 @@ "desktop" ] }, + "ext.kartographer.eventlogging": { + "dependencies": [ + "ext.eventLogging", + "schema.Kartographer" + ], + "scripts": [ + "modules/eventlogging/index.js" + ], + "targets": [ + "mobile", + "desktop" + ] + }, "ext.kartographer.visualEditor": { "scripts": [ "modules/ve-maps/ve.dm.MWInlineMapsNode.js", @@ -375,6 +388,11 @@ "mobile", "desktop" ] + }, + "schema.Kartographer": { + "class": "ResourceLoaderSchemaModule", + "schema": "Kartographer", + "revision": 15893543 } }, "ResourceFileModulePaths": { diff --git a/includes/DataModule.php b/includes/DataModule.php index b559ad6..057cb40 100644 --- a/includes/DataModule.php +++ b/includes/DataModule.php @@ -20,6 +20,7 @@ public function getScript( ResourceLoaderContext $context ) { $config = $context->getResourceLoader()->getConfig(); return ResourceLoader::makeConfigSetScript( array( + 'wgKartographerEventLogging' => $config->get( 'KartographerEventLogging' ), 'wgKartographerMapServer' => $config->get( 'KartographerMapServer' ), 'wgKartographerIconServer' => $config->get( 'KartographerIconServer' ), 'wgKartographerSrcsetScales' => $config->get( 'KartographerSrcsetScales' ), diff --git a/modules/box/Map.js b/modules/box/Map.js index 587b5b6..0f5fdc3 100644 --- a/modules/box/Map.js +++ b/modules/box/Map.js @@ -16,7 +16,15 @@ Map, precisionPerZoom = [ 0, 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5 ], liveDataPromise = false, - groupsLoaded = {}; + groupsLoaded = {}, + logEvent = function ( map, event ) { + mw.loader.using( [ + 'ext.kartographer.eventlogging', + 'schema.Kartographer' + ] ).then( function () { + mw.loader.require( 'ext.kartographer.eventlogging' ).logEvent( map, event ); + } ); + }; function bracketDevicePixelRatio() { var i, scale, @@ -338,6 +346,13 @@ /*jscs:disable requireCamelCaseOrUpperCaseIdentifiers*/ this._kartographer_ready = true; /*jscs:enable requireCamelCaseOrUpperCaseIdentifiers*/ + if ( this.options.fullscreen ) { + logEvent( this, 'open' ); + this.addInteractionEvents(); + } else if ( !this.parentMap ) { + logEvent( this, 'view' ); + this.addInteractionEvents(); + } }, this ); /** @@ -434,6 +449,7 @@ * Fired when the Kartographer Map object is ready. */ 'kartographerisready' ); + }, this ) ); }, @@ -699,6 +715,7 @@ zoom = isNaN( zoom ) ? this.options.fallbackZoom : zoom; L.Map.prototype.setView.call( this, center, zoom, options ); } else { + this._autoPositioning = true; // Determines best center of the map maxBounds = getValidBounds( this ); @@ -727,6 +744,7 @@ } ); } } + this._autoPositioning = false; } return this; }, @@ -749,6 +767,15 @@ ]; }, + addInteractionEvents: function () { + this.on( 'dragend zoomstart popupopen popupclose', function () { + if ( this._autoPositioning ) { + return; + } + logEvent( this, 'interaction' ); + } ); + }, + /** * @localdoc Extended to also destroy the {@link #fullScreenMap} when * it exists. @@ -758,12 +785,17 @@ */ remove: function () { if ( this.fullScreenMap ) { + logEvent( this, 'close' ); L.Map.prototype.remove.call( this.fullScreenMap ); this.fullScreenMap = null; } if ( this.parentMap ) { + logEvent( this.parentMap, 'close' ); this.parentMap.fullScreenMap = null; } + if ( this.options.link ) { + logEvent( this, 'close' ); + } return L.Map.prototype.remove.call( this ); }, diff --git a/modules/eventlogging/index.js b/modules/eventlogging/index.js new file mode 100644 index 0000000..46a8f88 --- /dev/null +++ b/modules/eventlogging/index.js @@ -0,0 +1,65 @@ +/* globals module */ +/** + * Module to facilitate the collection of metrics on how users interact + * with Kartographer's interface. + * + * @alias ext.kartographer.eventlogging + * @class Kartographer.EventLogging + * @singleton + */ +module.exports = ( function ( mw ) { + + var analyticsEnabled = !!mw.config.get( 'wgKartographerEventLogging' ), + isMobile = mw.config.get( 'skin' ) === 'minerva', + userToken = 'random_id', + trackedMaps = {}; + + return { + /** + * Construct and transmit to a remote server a record of some event + * having occurred. Opens the map dialog and renders the map. + * + * This method represents the public client-side API of Kartographer EventLogging. + * + * @param {Kartographer.Box.Map} map + * @param {string} action + */ + logEvent: function ( map, action ) { + /*jscs:disable disallowDanglingUnderscores, requireCamelCaseOrUpperCaseIdentifiers */ + var event, + feature = 'rawmap', + tracking; + if ( !analyticsEnabled ) { + return; + } + tracking = trackedMaps[ map._leaflet_id ] = trackedMaps[ map._leaflet_id ] || {}; + + feature = map.options.link ? 'maplink' : 'mapframe'; + + event = { + // "mapframe" / "maplink" + feature: feature, + // "view" / "hashopen" / "close" / "interaction" / "discovery" + action: action, + // true / false + mobile: isMobile, + // we noticed a number of events get sent multiple + // times from javascript, especially when using sendBeacon. + // This userToken allows for later deduplication. + userToken: userToken + }; + if ( tracking.duration ) { + event.duration = parseInt( performance.now() - tracking.startTime, 10 ); + } + mw.eventLog.logEvent( 'Kartographer', event ); + + if ( action === 'open' ) { + tracking.duration = true; + tracking.startTime = performance.now(); + } else if ( action === 'close' ) { + tracking.duration = false; + } + /*jscs:enable disallowDanglingUnderscores, requireCamelCaseOrUpperCaseIdentifiers */ + } + }; +} )( mediaWiki ); -- To view, visit https://gerrit.wikimedia.org/r/311462 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib12b87c55408040dd69c9f190721aa103019563c Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Kartographer Gerrit-Branch: master Gerrit-Owner: JGirault <julien.inbox.w...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits