diff options
Diffstat (limited to 'toolkit/components/telemetry/app/TelemetryControllerBase.sys.mjs')
-rw-r--r-- | toolkit/components/telemetry/app/TelemetryControllerBase.sys.mjs | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/toolkit/components/telemetry/app/TelemetryControllerBase.sys.mjs b/toolkit/components/telemetry/app/TelemetryControllerBase.sys.mjs new file mode 100644 index 0000000000..cf0a7bd372 --- /dev/null +++ b/toolkit/components/telemetry/app/TelemetryControllerBase.sys.mjs @@ -0,0 +1,141 @@ +/* -*- 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; + }, +}); |