Bug 1137222 - Submit subsession-specific value for simpleMeasurements.activeTicks. r=gfritzsche

This commit is contained in:
Alessio Placitelli 2015-03-24 10:48:00 +01:00
parent 4dcce4682a
commit 484fcbf3eb
2 changed files with 71 additions and 4 deletions

View File

@ -727,6 +727,7 @@ this.TelemetrySession = Object.freeze({
Impl._previousSubsessionId = null; Impl._previousSubsessionId = null;
Impl._subsessionCounter = 0; Impl._subsessionCounter = 0;
Impl._profileSubsessionCounter = 0; Impl._profileSubsessionCounter = 0;
Impl._subsessionStartActiveTicks = 0;
this.uninstall(); this.uninstall();
return this.setup(); return this.setup();
}, },
@ -804,6 +805,8 @@ let Impl = {
_profileSubsessionCounter: 0, _profileSubsessionCounter: 0,
// Date of the last session split // Date of the last session split
_subsessionStartDate: null, _subsessionStartDate: null,
// The active ticks counted when the subsession starts
_subsessionStartActiveTicks: 0,
// A task performing delayed initialization of the chrome process // A task performing delayed initialization of the chrome process
_delayedInitTask: null, _delayedInitTask: null,
// The deferred promise resolved when the initialization task completes. // The deferred promise resolved when the initialization task completes.
@ -816,10 +819,12 @@ let Impl = {
/** /**
* Gets a series of simple measurements (counters). At the moment, this * Gets a series of simple measurements (counters). At the moment, this
* only returns startup data from nsIAppStartup.getStartupInfo(). * only returns startup data from nsIAppStartup.getStartupInfo().
* @param {Boolean} isSubsession True if this is a subsession, false otherwise.
* @param {Boolean} clearSubsession True if a new subsession is being started, false otherwise.
* *
* @return simple measurements as a dictionary. * @return simple measurements as a dictionary.
*/ */
getSimpleMeasurements: function getSimpleMeasurements(forSavedSession) { getSimpleMeasurements: function getSimpleMeasurements(forSavedSession, isSubsession, clearSubsession) {
this._log.trace("getSimpleMeasurements"); this._log.trace("getSimpleMeasurements");
let si = Services.startup.getStartupInfo(); let si = Services.startup.getStartupInfo();
@ -909,7 +914,16 @@ let Impl = {
let sr = drs.getSessionRecorder(); let sr = drs.getSessionRecorder();
if (sr) { if (sr) {
ret.activeTicks = sr.activeTicks; let activeTicks = sr.activeTicks;
if (isSubsession) {
activeTicks = sr.activeTicks - this._subsessionStartActiveTicks;
}
if (clearSubsession) {
this._subsessionStartActiveTicks = activeTicks;
}
ret.activeTicks = activeTicks;
} }
} }
@ -1340,9 +1354,13 @@ let Impl = {
this._log.trace("getSessionPayload - reason: " + reason + ", clearSubsession: " + clearSubsession); this._log.trace("getSessionPayload - reason: " + reason + ", clearSubsession: " + clearSubsession);
#if defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_ANDROID) #if defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_ANDROID)
clearSubsession = false; clearSubsession = false;
const isSubsession = false;
#else
const isSubsession = !this._isClassicReason(reason);
#endif #endif
let measurements = this.getSimpleMeasurements(reason == REASON_SAVED_SESSION); let measurements =
this.getSimpleMeasurements(reason == REASON_SAVED_SESSION, isSubsession, clearSubsession);
let info = !IS_CONTENT_PROCESS ? this.getMetadata(reason) : null; let info = !IS_CONTENT_PROCESS ? this.getMetadata(reason) : null;
let payload = this.assemblePayloadWithMeasurements(measurements, info, reason, clearSubsession); let payload = this.assemblePayloadWithMeasurements(measurements, info, reason, clearSubsession);

View File

@ -664,7 +664,7 @@ add_task(function* test_saveLoadPing() {
} }
}); });
add_task(function* test_checkSubsession() { add_task(function* test_checkSubsessionHistograms() {
if (gIsAndroid) { if (gIsAndroid) {
// We don't support subsessions yet on Android. // We don't support subsessions yet on Android.
return; return;
@ -852,6 +852,55 @@ add_task(function* test_checkSubsession() {
Assert.equal(subsession.keyedHistograms[KEYED_ID]["b"].sum, 1); Assert.equal(subsession.keyedHistograms[KEYED_ID]["b"].sum, 1);
}); });
add_task(function* test_checkSubsessionData() {
if (gIsAndroid || !SESSION_RECORDER_EXPECTED) {
// We don't support subsessions yet on Android. Also bail out if we
// can't use the session recorder.
return;
}
// Keep track of the active ticks count if the session recorder is available.
let sessionRecorder = gDatareportingService.getSessionRecorder();
let activeTicksAtSubsessionStart = sessionRecorder.activeTicks;
let expectedActiveTicks = activeTicksAtSubsessionStart;
incrementActiveTicks = () => {
sessionRecorder.incrementActiveTicks();
++expectedActiveTicks;
}
yield TelemetrySession.reset();
// Both classic and subsession payload data should be the same on the first subsession.
incrementActiveTicks();
let classic = TelemetrySession.getPayload();
let subsession = TelemetrySession.getPayload("environment-change");
Assert.equal(classic.simpleMeasurements.activeTicks, expectedActiveTicks,
"Classic pings must count active ticks since the beginning of the session.");
Assert.equal(subsession.simpleMeasurements.activeTicks, expectedActiveTicks,
"Subsessions must count active ticks as classic pings on the first subsession.");
// Start a new subsession and check that the active ticks are correctly reported.
incrementActiveTicks();
activeTicksAtSubsessionStart = sessionRecorder.activeTicks;
classic = TelemetrySession.getPayload();
subsession = TelemetrySession.getPayload("environment-change", true);
Assert.equal(classic.simpleMeasurements.activeTicks, expectedActiveTicks,
"Classic pings must count active ticks since the beginning of the session.");
Assert.equal(subsession.simpleMeasurements.activeTicks, expectedActiveTicks,
"Pings must not loose the tick count when starting a new subsession.");
// Get a new subsession payload without clearing the subsession.
incrementActiveTicks();
classic = TelemetrySession.getPayload();
subsession = TelemetrySession.getPayload("environment-change");
Assert.equal(classic.simpleMeasurements.activeTicks, expectedActiveTicks,
"Classic pings must count active ticks since the beginning of the session.");
Assert.equal(subsession.simpleMeasurements.activeTicks,
expectedActiveTicks - activeTicksAtSubsessionStart,
"Subsessions must count active ticks since the last new subsession.");
});
add_task(function* test_dailyCollection() { add_task(function* test_dailyCollection() {
if (gIsAndroid) { if (gIsAndroid) {
// We don't do daily collections yet on Android. // We don't do daily collections yet on Android.