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

Reply via email to