diff --git a/browser/modules/BrowserUsageTelemetry.jsm b/browser/modules/BrowserUsageTelemetry.jsm index 283a85813ac3..c991bb64004f 100644 --- a/browser/modules/BrowserUsageTelemetry.jsm +++ b/browser/modules/BrowserUsageTelemetry.jsm @@ -37,6 +37,8 @@ XPCOMUtils.defineLazyPreferenceGetter( "browser.engagement.recent_visited_origins.expiry" ); +Cu.importGlobalProperties(["Glean"]); + // The upper bound for the count of the visited unique domain names. const MAX_UNIQUE_VISITED_DOMAINS = 100; @@ -341,6 +343,7 @@ let URICountListener = { TOTAL_URI_COUNT_NORMAL_AND_PRIVATE_MODE_SCALAR_NAME, 1 ); + Glean.browserEngagement.uriCount.add(1); if (!shouldCountURI) { return; diff --git a/browser/modules/metrics.yaml b/browser/modules/metrics.yaml new file mode 100644 index 000000000000..85bc9e5d7b4c --- /dev/null +++ b/browser/modules/metrics.yaml @@ -0,0 +1,63 @@ +# 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/. + +# Adding a new metric? We have docs for that! +# https://firefox-source-docs.mozilla.org/toolkit/components/glean/user/new_definitions_file.html + +--- +$schema: moz://mozilla.org/schemas/glean/metrics/2-0-0 + +browser.engagement: + active_ticks: + type: counter + description: | + The number of five-second intervals ('ticks') the user was considered + 'active'. + + 'active' means keyboard or mouse interaction with the application. + It doesn't take into account whether or not the window has focus or is in + the foreground, only if it is receiving these interaction events. + + Migrated from Telemetry's `browser.engagement.active_ticks`. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1376942 # Telemetry + - https://bugzilla.mozilla.org/show_bug.cgi?id=1545172 # Telemetry + - https://bugzilla.mozilla.org/show_bug.cgi?id=1741674 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1545172#c8 + data_sensitivity: + - interaction + notification_emails: + - loines@mozilla.com + expires: "100" + send_in_pings: + - baseline + - metrics + no_lint: + - BASELINE_PING + + uri_count: + type: counter + description: | + The number of total non-unique http(s) URIs visited, including page + reloads, after the session has been restored. URIs on minimized or + background tabs may also be counted. Private browsing uris are included. + + Migrated from Telemetry's + `browser.engagement.total_uri_count_normal_and_private_mode`. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1535169 # Telemetry + - https://bugzilla.mozilla.org/show_bug.cgi?id=1741674 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1535169#c14 + data_sensitivity: + - interaction + notification_emails: + - loines@mozilla.com + expires: "100" + send_in_pings: + - baseline + - metrics + no_lint: + - BASELINE_PING diff --git a/browser/modules/test/browser/browser_UsageTelemetry.js b/browser/modules/test/browser/browser_UsageTelemetry.js index 0bf279b0bf34..c0a7096f6100 100644 --- a/browser/modules/test/browser/browser_UsageTelemetry.js +++ b/browser/modules/test/browser/browser_UsageTelemetry.js @@ -26,13 +26,16 @@ const { SessionStore } = ChromeUtils.import( "resource:///modules/sessionstore/SessionStore.jsm" ); +// Glean's here on `window`, but eslint doesn't know that. bug 1715542. +/* global Glean:false */ + // Reset internal URI counter in case URIs were opened by other tests. Services.obs.notifyObservers(null, TELEMETRY_SUBSESSION_TOPIC); /** * Get a snapshot of the scalars and check them against the provided values. */ -let checkScalars = countsObject => { +let checkScalars = (countsObject, skipGleanCheck = false) => { const scalars = TelemetryTestUtils.getProcessScalars("parent"); // Check the expected values. Scalars that are never set must not be reported. @@ -90,6 +93,21 @@ let checkScalars = countsObject => { countsObject.totalURIsNormalAndPrivateMode, "The total URI count for both normal and private mode must match the expected value." ); + if (!skipGleanCheck) { + if (countsObject.totalURIsNormalAndPrivateMode == 0) { + Assert.equal( + Glean.browserEngagement.uriCount.testGetValue(), + undefined, + "Total URI count reported in Glean must be unset." + ); + } else { + Assert.equal( + countsObject.totalURIsNormalAndPrivateMode, + Glean.browserEngagement.uriCount.testGetValue(), + "The total URI count reported in Glean must be as expected." + ); + } + } }; add_task(async function test_tabsAndWindows() { @@ -266,18 +284,21 @@ add_task(async function test_subsessionSplit() { // must not be reported. expectedTotalURIs = 0; - checkScalars({ - maxTabs: 4, - tabOpenCount: 0, - maxWindows: 2, - windowsOpenCount: 0, - totalURIs: expectedTotalURIs, - domainCount: 0, - totalUnfilteredURIs: 0, - maxTabsPinned: 0, - tabPinnedCount: 0, - totalURIsNormalAndPrivateMode: expectedTotalURIs, - }); + checkScalars( + { + maxTabs: 4, + tabOpenCount: 0, + maxWindows: 2, + windowsOpenCount: 0, + totalURIs: expectedTotalURIs, + domainCount: 0, + totalUnfilteredURIs: 0, + maxTabsPinned: 0, + tabPinnedCount: 0, + totalURIsNormalAndPrivateMode: expectedTotalURIs, + }, + true + ); // Remove all the extra windows and tabs. for (let tab of openedTabs) { diff --git a/browser/modules/test/browser/browser_UsageTelemetry_private_and_restore.js b/browser/modules/test/browser/browser_UsageTelemetry_private_and_restore.js index 54ea602a316e..384fb8fdd238 100644 --- a/browser/modules/test/browser/browser_UsageTelemetry_private_and_restore.js +++ b/browser/modules/test/browser/browser_UsageTelemetry_private_and_restore.js @@ -4,6 +4,9 @@ const { E10SUtils } = ChromeUtils.import( ); const triggeringPrincipal_base64 = E10SUtils.SERIALIZED_SYSTEMPRINCIPAL; +// Glean's here on `window`, but eslint doesn't know that. bug 1715542. +/* global Glean:false */ + const MAX_CONCURRENT_TABS = "browser.engagement.max_concurrent_tab_count"; const TAB_EVENT_COUNT = "browser.engagement.tab_open_event_count"; const MAX_CONCURRENT_WINDOWS = "browser.engagement.max_concurrent_window_count"; @@ -80,6 +83,7 @@ add_task(async function test_privateMode() { 1, "We should include URIs in private mode as part of the actual total URI count." ); + is(Glean.browserEngagement.uriCount.testGetValue(), 1); // Clean up. await BrowserTestUtils.closeWindow(privateWin); diff --git a/testing/profiles/common/user.js b/testing/profiles/common/user.js index bf8a875326c3..2c682a6516e7 100644 --- a/testing/profiles/common/user.js +++ b/testing/profiles/common/user.js @@ -77,3 +77,6 @@ user_pref("browser.region.network.url", ""); user_pref("browser.tabs.unloadOnLowMemory", false); // Don't pull Top Sites content from the network user_pref("browser.topsites.contile.enabled", false); +// Default Glean to "record but don't report" mode. Docs: +// https://firefox-source-docs.mozilla.org/toolkit/components/glean/dev/preferences.html +user_pref("telemetry.fog.test.localhost_port", -1); diff --git a/toolkit/components/glean/metrics_index.py b/toolkit/components/glean/metrics_index.py index 82eb6031888f..3f23496da7d1 100644 --- a/toolkit/components/glean/metrics_index.py +++ b/toolkit/components/glean/metrics_index.py @@ -18,6 +18,7 @@ metrics_yamls = [ "browser/base/content/metrics.yaml", "gfx/metrics.yaml", "toolkit/components/processtools/metrics.yaml", + "browser/modules/metrics.yaml", "browser/components/metrics.yaml", ] diff --git a/toolkit/components/telemetry/pings/TelemetrySession.jsm b/toolkit/components/telemetry/pings/TelemetrySession.jsm index 7aaa59c7aea3..1ccb61abd1c0 100644 --- a/toolkit/components/telemetry/pings/TelemetrySession.jsm +++ b/toolkit/components/telemetry/pings/TelemetrySession.jsm @@ -27,6 +27,8 @@ XPCOMUtils.defineLazyModuleGetters(this, { TelemetryScheduler: "resource://gre/modules/TelemetryScheduler.jsm", }); +Cu.importGlobalProperties(["Glean"]); + const Utils = TelemetryUtils; const myScope = this; @@ -1121,6 +1123,7 @@ var Impl = { if (needsUpdate) { this._sessionActiveTicks++; Services.telemetry.scalarAdd("browser.engagement.active_ticks", 1); + Glean.browserEngagement.activeTicks.add(1); } }, diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetrySession_activeTicks.js b/toolkit/components/telemetry/tests/unit/test_TelemetrySession_activeTicks.js index a332da60e070..590eb8190696 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession_activeTicks.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession_activeTicks.js @@ -9,6 +9,8 @@ const { TelemetrySession } = ChromeUtils.import( "resource://gre/modules/TelemetrySession.jsm" ); +Cu.importGlobalProperties(["Glean"]); + function tick(aHowMany) { for (let i = 0; i < aHowMany; i++) { Services.obs.notifyObservers(null, "user-interaction-active"); @@ -44,6 +46,9 @@ add_task(async function test_setup() { do_get_profile(); // Make sure we don't generate unexpected pings due to pref changes. await setEmptyPrefWatchlist(); + // Ensure FOG's init + let FOG = Cc["@mozilla.org/toolkit/glean;1"].getService(Ci.nsIFOG); + FOG.initializeFOG(); }); add_task(async function test_record_activeTicks() { @@ -65,6 +70,7 @@ add_task(async function test_record_activeTicks() { "TelemetrySession must record the expected number of active ticks (in scalars)." ); } + Assert.equal(Glean.browserEngagement.activeTicks.testGetValue(), expected); }; for (let i = 0; i < 3; i++) {