Source code
Revision control
Copy as Markdown
Other Tools
/* -*- 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
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;
},
});