mirror of https://github.com/jitsi/jitsi-meet
Restructures the analytics events (#2333)
* ref: Restructures the pinned/unpinned events. * ref: Refactors the "audio only disabled" event. * ref: Refactors the "stream switch delay" event. * ref: Refactors the "select participant failed" event. * ref: Refactors the "initially muted" events. * ref: Refactors the screen sharing started/stopped events. * ref: Restructures the "device list changed" events. * ref: Restructures the "shared video" events. * ref: Restructures the "start muted" events. * ref: Restructures the "start audio only" event. * ref: Restructures the "sync track state" event. * ref: Restructures the "callkit" events. * ref: Restructures the "replace track". * ref: Restructures keyboard shortcuts events. * ref: Restructures most of the toolbar events. * ref: Refactors the API events. * ref: Restructures the video quality, profile button and invite dialog events. * ref: Refactors the "device changed" events. * ref: Refactors the page reload event. * ref: Removes an unused function. * ref: Removes a method which is needlessly exposed under a different name. * ref: Refactors the events from the remote video menu. * ref: Refactors the events from the profile pane. * ref: Restructures the recording-related events. Removes events fired when recording with something other than jibri (which isn't currently supported anyway). * ref: Cleans up AnalyticsEvents.js. * ref: Removes an unused function and adds documentation. * feat: Adds events for all API calls. * fix: Addresses feedback. * fix: Brings back mistakenly removed code. * fix: Simplifies code and fixes a bug in toggleFilmstrip when the 'visible' parameter is defined. * feat: Removes the resolution change application log. * ref: Uses consistent naming for events' attributes. Uses "_" as a separator instead of camel case or ".". * ref: Don't add the user agent and conference name as permanent properties. The library does this on its own now. * ref: Adapts the GA handler to changes in lib-jitsi-meet. * ref: Removes unused fields from the analytics handler initializaiton. * ref: Renames the google analytics file and add docs. * fix: Fixes the push-to-talk events and logs. * npm: Updates lib-jitsi-meet to 515374c8d383cb17df8ed76427e6f0fb5ea6ff1e. * fix: Fixes a recently introduced bug in the google analytics handler. * ref: Uses "value" instead of "delay" since this is friendlier to GA.pull/2354/head jitsi-meet_2733
parent
d08bbae770
commit
090f2f9ccb
@ -0,0 +1,146 @@ |
||||
/* global ga */ |
||||
|
||||
(function(ctx) { |
||||
/** |
||||
* |
||||
*/ |
||||
function Analytics() { |
||||
/* eslint-disable */ |
||||
|
||||
/** |
||||
* Google Analytics |
||||
*/ |
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ |
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) |
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); |
||||
ga('create', 'UA-319188-14', 'jit.si'); |
||||
ga('send', 'pageview'); |
||||
|
||||
/* eslint-enable */ |
||||
} |
||||
|
||||
/** |
||||
* Extracts the integer to use for a Google Analytics event's value field |
||||
* from a lib-jitsi-meet analytics event. |
||||
* @param {Object} event - The lib-jitsi-meet analytics event. |
||||
* @returns {Object} - The integer to use for the 'value' of a Google |
||||
* Analytics event. |
||||
* @private |
||||
*/ |
||||
Analytics.prototype._extractAction = function(event) { |
||||
// Page events have a single 'name' field.
|
||||
if (event.type === 'page') { |
||||
return event.name; |
||||
} |
||||
|
||||
// All other events have action, actionSubject, and source fields. All
|
||||
// three fields are required, and the often jitsi-meet and
|
||||
// lib-jitsi-meet use the same value when separate values are not
|
||||
// necessary (i.e. event.action == event.actionSubject).
|
||||
// Here we concatenate these three fields, but avoid adding the same
|
||||
// value twice, because it would only make the GA event's action harder
|
||||
// to read.
|
||||
let action = event.action; |
||||
|
||||
if (event.actionSubject && event.actionSubject !== event.action) { |
||||
// Intentionally use string concatenation as analytics needs to
|
||||
// work on IE but this file does not go through babel. For some
|
||||
// reason disabling this globally for the file does not have an
|
||||
// effect.
|
||||
// eslint-disable-next-line prefer-template
|
||||
action = event.actionSubject + '.' + action; |
||||
} |
||||
if (event.source && event.source !== event.action |
||||
&& event.source !== event.action) { |
||||
// eslint-disable-next-line prefer-template
|
||||
action = event.source + '.' + action; |
||||
} |
||||
|
||||
return action; |
||||
}; |
||||
|
||||
/** |
||||
* Extracts the integer to use for a Google Analytics event's value field |
||||
* from a lib-jitsi-meet analytics event. |
||||
* @param {Object} event - The lib-jitsi-meet analytics event. |
||||
* @returns {Object} - The integer to use for the 'value' of a Google |
||||
* Analytics event, or NaN if the lib-jitsi-meet event doesn't contain a |
||||
* suitable value. |
||||
* @private |
||||
*/ |
||||
Analytics.prototype._extractValue = function(event) { |
||||
let value = event && event.attributes && event.attributes.value; |
||||
|
||||
// Try to extract an integer from the "value" attribute.
|
||||
value = Math.round(parseFloat(value)); |
||||
|
||||
return value; |
||||
}; |
||||
|
||||
/** |
||||
* Extracts the string to use for a Google Analytics event's label field |
||||
* from a lib-jitsi-meet analytics event. |
||||
* @param {Object} event - The lib-jitsi-meet analytics event. |
||||
* @returns {string} - The string to use for the 'label' of a Google |
||||
* Analytics event. |
||||
* @private |
||||
*/ |
||||
Analytics.prototype._extractLabel = function(event) { |
||||
let label = ''; |
||||
|
||||
// The label field is limited to 500B. We will concatenate all
|
||||
// attributes of the event, except the user agent because it may be
|
||||
// lengthy and is probably included from elsewhere.
|
||||
for (const property in event.attributes) { |
||||
if (property !== 'permanent_user_agent' |
||||
&& event.attributes.hasOwnProperty(property)) { |
||||
// eslint-disable-next-line prefer-template
|
||||
label += property + '=' + event.attributes[property] + '&'; |
||||
} |
||||
} |
||||
|
||||
if (label.length > 0) { |
||||
label = label.slice(0, -1); |
||||
} |
||||
|
||||
return label; |
||||
}; |
||||
|
||||
/** |
||||
* This is the entry point of the API. The function sends an event to |
||||
* google analytics. The format of the event is described in |
||||
* AnalyticsAdapter in lib-jitsi-meet. |
||||
* @param {Object} event - the event in the format specified by |
||||
* lib-jitsi-meet. |
||||
*/ |
||||
Analytics.prototype.sendEvent = function(event) { |
||||
if (!event) { |
||||
return; |
||||
} |
||||
|
||||
const gaEvent = { |
||||
'eventCategory': 'jitsi-meet', |
||||
'eventAction': this._extractAction(event), |
||||
'eventLabel': this._extractLabel(event) |
||||
}; |
||||
const value = this._extractValue(event); |
||||
|
||||
if (!isNaN(value)) { |
||||
gaEvent.eventValue = value; |
||||
} |
||||
|
||||
ga('send', 'event', gaEvent); |
||||
}; |
||||
|
||||
if (typeof ctx.JitsiMeetJS === 'undefined') { |
||||
ctx.JitsiMeetJS = {}; |
||||
} |
||||
if (typeof ctx.JitsiMeetJS.app === 'undefined') { |
||||
ctx.JitsiMeetJS.app = {}; |
||||
} |
||||
if (typeof ctx.JitsiMeetJS.app.analyticsHandlers === 'undefined') { |
||||
ctx.JitsiMeetJS.app.analyticsHandlers = []; |
||||
} |
||||
ctx.JitsiMeetJS.app.analyticsHandlers.push(Analytics); |
||||
})(window); |
||||
/* eslint-enable prefer-template */ |
||||
@ -1,47 +0,0 @@ |
||||
/* global ga */ |
||||
|
||||
(function(ctx) { |
||||
/** |
||||
* |
||||
*/ |
||||
function Analytics() { |
||||
/* eslint-disable */ |
||||
|
||||
/** |
||||
* Google Analytics |
||||
*/ |
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ |
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) |
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); |
||||
ga('create', 'UA-319188-14', 'jit.si'); |
||||
ga('send', 'pageview'); |
||||
|
||||
/* eslint-enable */ |
||||
} |
||||
|
||||
Analytics.prototype.sendEvent = function(action, data) { |
||||
// empty label if missing value for it and add the value,
|
||||
// the value should be integer or null
|
||||
let value = data.value; |
||||
|
||||
value = value ? Math.round(parseFloat(value)) : null; |
||||
const label = data.label || ''; |
||||
|
||||
// Intentionally use string concatenation as analytics needs to work on
|
||||
// IE but this file does not go through babel.
|
||||
// eslint-disable-next-line prefer-template
|
||||
ga('send', 'event', 'jit.si', action + '.' + data.browserName, |
||||
label, value); |
||||
}; |
||||
|
||||
if (typeof ctx.JitsiMeetJS === 'undefined') { |
||||
ctx.JitsiMeetJS = {}; |
||||
} |
||||
if (typeof ctx.JitsiMeetJS.app === 'undefined') { |
||||
ctx.JitsiMeetJS.app = {}; |
||||
} |
||||
if (typeof ctx.JitsiMeetJS.app.analyticsHandlers === 'undefined') { |
||||
ctx.JitsiMeetJS.app.analyticsHandlers = []; |
||||
} |
||||
ctx.JitsiMeetJS.app.analyticsHandlers.push(Analytics); |
||||
})(window); |
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue