Ticket #2041 (new New feature)

Opened 13 months ago

Last modified 2 months ago

Support Ping requests to report a better 'time on page'

Reported by: matt Owned by:
Priority: major Milestone: 1.x - Piwik 1.x
Component: Core Keywords:
Cc: Sensitive: no

Description

Currently, the last page view is set with a 'time on page' of zero seconds.

Instead, we could regularly ping the Piwik server with a request that notifies Piwik that the user is still on the website.

This request should not record new page view, only increase the visit_total_time counter.

Also, we should only throw this request when the user is actually looking at the page, not doing something else in some other tabs.

The risk with this feature is that instead of improving the report accuracy, we end up inflating numbers: a lot of users leave pages open in other tabs for hours and don't do anything about it. We should heavily test to ensure we never throw a request on a page where the user didn't interact with recently. Some interactions we can maybe detect: mouse click, mouse move, etc.

Of course, we should not make everything slow by adding handlers on mouse move, etc.

Change History

Changed 13 months ago by vipsoft

(In [3788]) fixes #739 - addEventListeners() on mouseup and mousedown; good catch, Matt!

  • utf8_encode() - required to convert multibyte char to string of bytes; for unit testing, it needs to be a separate function
  • killFrame() - would be called after a trackPageView(); used to prevent one's site from being frame by third-parties; there are tradeoffs (as you point) out, so it is not enabled by default

refs #2041 - setHeartBeatTimer - uses setTimeout, so it happens only once (vs setInterval is recurring); only happens on the landing page; intended to be used to improve bounce rate report; changed it to send ping=1 in the request

Changed 13 months ago by vipsoft

I reworked setHeartBeatTimer() in [3830]. It now takes an initalPingDelay and recurringHeartBeatDelay as parameters. By default, this is disabled.

Changed 13 months ago by vipsoft

The initial ping request contains "ping=1". Use this to improve bounce rates and visit time.

Subsequent heartbeat requests (if recurringDelay != 0) contain "hb=1".

I'm going to defer adding event handlers as there are issues with propagating some events like keyclicks.

Mental notes to self:

  • if you only send a beat when there's activity within the last n seconds, then on average, you'll expect the total time to be overstated by n/2 secs
  • to offset/compensate, you can instead send a beat if there's been activity in the last n/2 seconds
  • if there's no activity for n secs, do you stop checking for activity or stop sending beats?
  • what if activity resumes again? how long is too long ago to to resume beats?

Changed 13 months ago by matt

how do you define 'activity'? Will the ping be sent if user is looking at another tab, another window, or even away from computer?

Changed 13 months ago by vipsoft

activity: mousemove, click, mouseup, mousedown, mousewheel, scroll, DOMMouseScroll, resize, keypress, keydown, keyup, focus, and blur

  • need this many because of browser differences an the possibility of interference from other eveny handlers
  • handler simply sets the lastActivity timestamp

Yes, ping would be sent. That's why there's a check for activity. If there's no activity, I propose to no longer check.

I'll commit my changes after some more testing.

Changed 13 months ago by vipsoft

(In [3838]) refs #2041 - setHeartBeatTimer() now takes the minimumVisitLength and the heartBeatPeriod (time between pings) as parameters; this is simpler than initial ping + recurring hb; requests contain "ping=1".

also updated to jslint 2011-02-03

Changed 13 months ago by vipsoft

(In [3839]) refs #2041 - rollback buggy n/2 logic

Changed 13 months ago by vipsoft

(In [3840]) refs #2041 - undo previous optimizaton to ping on first page of a new session

Changed 13 months ago by vipsoft

(In [3841]) refs #2041 - add guard

Changed 13 months ago by vipsoft

  • milestone changed from Feature requests to 1.2 Piwik 1.2

Client-side changes are done, so it would be nice to have the server-side change done in time for 1.2 but we can roll into the next milestone.

Changed 13 months ago by matt

How often are the activity tests done? every second? Just thinking of keeping JS performance overhead low with this new feature.

I wont be able to do this in time for 1.2, so it will go in 1.3. Is pinging disabled by default? thx

Changed 13 months ago by vipsoft

Yes, disabled by default; frequency is user-defined.

Changed 12 months ago by matt

Before enabling this by default I think we could try it on some heavy websites, that are using GA, other libraries (jquery eg.) and doing Javascript heavily. Then we could see if Piwik adds any unexpected performance overhead.

For example it would be nice to say: Piwik will query a few JS variables every second to assess if the visitor is active or not, but will not conflict with any other library or Javascript and should not affect performance at all.

What do you think? for example, have you tried it on a a running piwik loading the dashboard full of widgets.

Changed 12 months ago by matt

  • priority changed from normal to major
  • milestone changed from 1.2 Piwik 1.2 to 1.3 - Piwik 1.3

Changed 10 months ago by matt

  • priority changed from major to critical

I think, disabled by default, but easy to enable, this would make it a really cool feautre. Also, should be made available via the 'advanced' javascript tag generator see #1845

Changed 9 months ago by matt

  • priority changed from critical to major
  • milestone changed from 1.5 - Piwik 1.5 to 1.x - Piwik 1.x

Changed 5 months ago by PolrBear

Just wondering where we are on this. I'm in the process of switching several sites from GA to Piwik, and this feature is pretty important to me. Does 1.x mean it's going to be in an indefinite release between now and 2?

Changed 5 months ago by matt

Polrbear, yes currently not roadmapped for 1.7 but it might change

Changed 4 months ago by phoenix

I'm interessed too by this feature. I have activate it on my website, but the presentation in the server side, isn't perfect (the ping is show as a new page visit).

I hope, that it can be made for 1.7.

Thanks.

Changed 2 months ago by matt

Another bug report:  http://forum.piwik.org/read.php?2,83913,page=1#msg-84060

NOTE: This feature does not work currently

Note: See TracTickets for help on using tickets.