141 lines
4.6 KiB
JavaScript
141 lines
4.6 KiB
JavaScript
/* -*- js-indent-level: 2; indent-tabs-mode: nil -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
|
|
import { Log } from "resource://gre/modules/Log.sys.mjs";
|
|
|
|
const LOGGER_NAME = "Toolkit.Telemetry";
|
|
const LOGGER_PREFIX = "TelemetryController::";
|
|
|
|
const PREF_BRANCH_LOG = "toolkit.telemetry.log.";
|
|
const PREF_LOG_LEVEL = "toolkit.telemetry.log.level";
|
|
const PREF_LOG_DUMP = "toolkit.telemetry.log.dump";
|
|
|
|
const PREF_TELEMETRY_ENABLED = "toolkit.telemetry.enabled";
|
|
|
|
const Preferences = Object.freeze({
|
|
OverridePreRelease: "toolkit.telemetry.testing.overridePreRelease",
|
|
Unified: "toolkit.telemetry.unified",
|
|
});
|
|
|
|
/**
|
|
* Setup Telemetry logging. This function also gets called when loggin related
|
|
* preferences change.
|
|
*/
|
|
var gLogger = null;
|
|
var gPrefixLogger = null;
|
|
var gLogAppenderDump = null;
|
|
|
|
export var TelemetryControllerBase = Object.freeze({
|
|
// Whether the FHR/Telemetry unification features are enabled.
|
|
// Changing this pref requires a restart.
|
|
IS_UNIFIED_TELEMETRY: Services.prefs.getBoolPref(Preferences.Unified, false),
|
|
|
|
Preferences,
|
|
|
|
/**
|
|
* Returns the state of the Telemetry enabled preference, making sure
|
|
* it correctly evaluates to a boolean type.
|
|
*/
|
|
get isTelemetryEnabled() {
|
|
return Services.prefs.getBoolPref(PREF_TELEMETRY_ENABLED, false) === true;
|
|
},
|
|
|
|
get log() {
|
|
if (!gPrefixLogger) {
|
|
gPrefixLogger = Log.repository.getLoggerWithMessagePrefix(
|
|
LOGGER_NAME,
|
|
LOGGER_PREFIX
|
|
);
|
|
}
|
|
return gPrefixLogger;
|
|
},
|
|
|
|
configureLogging() {
|
|
if (!gLogger) {
|
|
gLogger = Log.repository.getLogger(LOGGER_NAME);
|
|
|
|
// Log messages need to go to the browser console.
|
|
let consoleAppender = new Log.ConsoleAppender(new Log.BasicFormatter());
|
|
gLogger.addAppender(consoleAppender);
|
|
|
|
Services.prefs.addObserver(PREF_BRANCH_LOG, this.configureLogging);
|
|
}
|
|
|
|
// Make sure the logger keeps up with the logging level preference.
|
|
gLogger.level =
|
|
Log.Level[Services.prefs.getStringPref(PREF_LOG_LEVEL, "Warn")];
|
|
|
|
// If enabled in the preferences, add a dump appender.
|
|
let logDumping = Services.prefs.getBoolPref(PREF_LOG_DUMP, false);
|
|
if (logDumping != !!gLogAppenderDump) {
|
|
if (logDumping) {
|
|
gLogAppenderDump = new Log.DumpAppender(new Log.BasicFormatter());
|
|
gLogger.addAppender(gLogAppenderDump);
|
|
} else {
|
|
gLogger.removeAppender(gLogAppenderDump);
|
|
gLogAppenderDump = null;
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Set the Telemetry core recording flag for Unified Telemetry.
|
|
*/
|
|
setTelemetryRecordingFlags() {
|
|
// Enable extended Telemetry on pre-release channels and disable it
|
|
// on Release/ESR.
|
|
let prereleaseChannels = [
|
|
"nightly",
|
|
"nightly-autoland",
|
|
"nightly-try",
|
|
"aurora",
|
|
"beta",
|
|
];
|
|
if (!AppConstants.MOZILLA_OFFICIAL) {
|
|
// Turn extended telemetry for local developer builds.
|
|
prereleaseChannels.push("default");
|
|
}
|
|
const isPrereleaseChannel = prereleaseChannels.includes(
|
|
AppConstants.MOZ_UPDATE_CHANNEL
|
|
);
|
|
const isReleaseCandidateOnBeta =
|
|
AppConstants.MOZ_UPDATE_CHANNEL === "release" &&
|
|
Services.prefs.getCharPref("app.update.channel", null) === "beta";
|
|
Services.telemetry.canRecordBase = true;
|
|
Services.telemetry.canRecordExtended =
|
|
isPrereleaseChannel ||
|
|
isReleaseCandidateOnBeta ||
|
|
Services.prefs.getBoolPref(this.Preferences.OverridePreRelease, false);
|
|
},
|
|
|
|
/**
|
|
* Perform telemetry initialization for either chrome or content process.
|
|
* @return {Boolean} True if Telemetry is allowed to record at least base (FHR) data,
|
|
* false otherwise.
|
|
*/
|
|
enableTelemetryRecording: function enableTelemetryRecording() {
|
|
// Configure base Telemetry recording.
|
|
// Unified Telemetry makes it opt-out. If extended Telemetry is enabled, base recording
|
|
// is always on as well.
|
|
if (this.IS_UNIFIED_TELEMETRY) {
|
|
this.setTelemetryRecordingFlags();
|
|
} else {
|
|
// We're not on unified Telemetry, stick to the old behaviour for
|
|
// supporting Fennec.
|
|
Services.telemetry.canRecordBase = Services.telemetry.canRecordExtended =
|
|
this.isTelemetryEnabled;
|
|
}
|
|
|
|
this.log.config(
|
|
"enableTelemetryRecording - canRecordBase:" +
|
|
Services.telemetry.canRecordBase +
|
|
", canRecordExtended: " +
|
|
Services.telemetry.canRecordExtended
|
|
);
|
|
|
|
return Services.telemetry.canRecordBase;
|
|
},
|
|
});
|