Merge pull request #1814 from matrix-org/luke/track-page-change-duration

Track duration of page changes
This commit is contained in:
Luke Barnard 2018-03-28 12:00:32 +01:00 committed by GitHub
commit b40b417153
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 3 deletions

View file

@ -147,7 +147,10 @@ class Analytics {
return true; return true;
} }
trackPageChange() { trackPageChange(generationTimeMs) {
if (typeof generationTimeMs !== 'number') {
throw new Error('Analytics.trackPageChange: expected generationTimeMs to be a number');
}
if (this.disabled) return; if (this.disabled) return;
if (this.firstPage) { if (this.firstPage) {
// De-duplicate first page // De-duplicate first page
@ -156,6 +159,7 @@ class Analytics {
return; return;
} }
this._paq.push(['setCustomUrl', getRedactedUrl()]); this._paq.push(['setCustomUrl', getRedactedUrl()]);
this._paq.push(['setGenerationTimeMs', generationTimeMs]);
this._paq.push(['trackPageView']); this._paq.push(['trackPageView']);
} }

View file

@ -291,6 +291,8 @@ export default React.createClass({
this.handleResize(); this.handleResize();
window.addEventListener('resize', this.handleResize); window.addEventListener('resize', this.handleResize);
this._pageChanging = false;
// check we have the right tint applied for this theme. // check we have the right tint applied for this theme.
// N.B. we don't call the whole of setTheme() here as we may be // N.B. we don't call the whole of setTheme() here as we may be
// racing with the theme CSS download finishing from index.js // racing with the theme CSS download finishing from index.js
@ -368,13 +370,58 @@ export default React.createClass({
window.removeEventListener('resize', this.handleResize); window.removeEventListener('resize', this.handleResize);
}, },
componentDidUpdate: function() { componentWillUpdate: function(props, state) {
if (this.shouldTrackPageChange(this.state, state)) {
this.startPageChangeTimer();
}
},
componentDidUpdate: function(prevProps, prevState) {
if (this.shouldTrackPageChange(prevState, this.state)) {
const durationMs = this.stopPageChangeTimer();
Analytics.trackPageChange(durationMs);
}
if (this.focusComposer) { if (this.focusComposer) {
dis.dispatch({action: 'focus_composer'}); dis.dispatch({action: 'focus_composer'});
this.focusComposer = false; this.focusComposer = false;
} }
}, },
startPageChangeTimer() {
// This shouldn't happen because componentWillUpdate and componentDidUpdate
// are used.
if (this._pageChanging) {
console.warn('MatrixChat.startPageChangeTimer: timer already started');
return;
}
this._pageChanging = true;
performance.mark('riot_MatrixChat_page_change_start');
},
stopPageChangeTimer() {
if (!this._pageChanging) {
console.warn('MatrixChat.stopPageChangeTimer: timer not started');
return;
}
this._pageChanging = false;
performance.mark('riot_MatrixChat_page_change_stop');
performance.measure(
'riot_MatrixChat_page_change_delta',
'riot_MatrixChat_page_change_start',
'riot_MatrixChat_page_change_stop',
);
performance.clearMarks('riot_MatrixChat_page_change_start');
performance.clearMarks('riot_MatrixChat_page_change_stop');
const measurement = performance.getEntriesByName('riot_MatrixChat_page_change_delta').pop();
return measurement.duration;
},
shouldTrackPageChange(prevState, state) {
return prevState.currentRoomId !== state.currentRoomId ||
prevState.view !== state.view ||
prevState.page_type !== state.page_type;
},
setStateForNewView: function(state) { setStateForNewView: function(state) {
if (state.view === undefined) { if (state.view === undefined) {
throw new Error("setStateForNewView with no view!"); throw new Error("setStateForNewView with no view!");
@ -1341,7 +1388,6 @@ export default React.createClass({
if (this.props.onNewScreen) { if (this.props.onNewScreen) {
this.props.onNewScreen(screen); this.props.onNewScreen(screen);
} }
Analytics.trackPageChange();
}, },
onAliasClick: function(event, alias) { onAliasClick: function(event, alias) {