Skip to content

Commit 78b190f

Browse files
committed
Added sync settings metrics for mobile
1 parent 5fce832 commit 78b190f

File tree

6 files changed

+113
-0
lines changed

6 files changed

+113
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
- The `ContextIDComponent` constructor can now synchronously invoke the rotation callback when it receives an invalid timestamp from callers; in such cases, it falls back to the current timestamp and forces an ID rotation.
1414
- `rotate_context_id` is no longer public since consumers can use `force_rotation` instead.
1515

16+
### Sync Manager
17+
- Added sync settings metrics for mobile. [#6786](https://github.com/mozilla/application-services/pull/6786)
18+
1619
[Full Changelog](In progress)
1720

1821
# v140.0 (_2025-05-23_)

components/sync_manager/android/src/main/java/mozilla/appservices/syncmanager/SyncTelemetry.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import mozilla.telemetry.glean.private.StringMetricType
1313
import org.json.JSONException
1414
import org.json.JSONObject
1515
import org.mozilla.appservices.syncmanager.GleanMetrics.Pings
16+
import org.mozilla.appservices.syncmanager.GleanMetrics.SyncSettings
1617
import org.mozilla.appservices.syncmanager.GleanMetrics.AddressesSyncV2 as AddressesSync
1718
import org.mozilla.appservices.syncmanager.GleanMetrics.BookmarksSyncV2 as BookmarksSync
1819
import org.mozilla.appservices.syncmanager.GleanMetrics.CreditcardsSyncV2 as CreditcardsSync
@@ -485,4 +486,19 @@ object SyncTelemetry {
485486
}
486487
return errors
487488
}
489+
490+
fun processOpenSyncSettingsMenuTelemetry() {
491+
SyncSettings.openMenu.record()
492+
}
493+
494+
fun processSaveSyncSettingsTelemetry(enabledEngines: List<String>, disabledEngines: List<String>) {
495+
val enabledList = if (enabledEngines.any()) enabledEngines.joinToString(separator = ",") else null
496+
val disabledList = if (disabledEngines.any()) disabledEngines.joinToString(separator = ",") else null
497+
val extras = SyncSettings.SaveExtra(
498+
disabledEngines = disabledList,
499+
enabledEngines = enabledList,
500+
)
501+
502+
SyncSettings.save.record(extras)
503+
}
488504
}

components/sync_manager/android/src/test/java/mozilla/appservices/syncmanager/SyncTelemetryTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.junit.Before
2929
import org.junit.Test
3030
import org.junit.runner.RunWith
3131
import org.mozilla.appservices.syncmanager.GleanMetrics.Pings
32+
import org.mozilla.appservices.syncmanager.GleanMetrics.SyncSettings
3233
import java.util.Date
3334
import java.util.UUID
3435
import org.mozilla.appservices.syncmanager.GleanMetrics.BookmarksSyncV2 as BookmarksSync
@@ -1273,4 +1274,26 @@ class SyncTelemetryTest {
12731274
private fun MutableMap<String, Int>.incrementForKey(key: String) {
12741275
this[key] = 1 + this.getOrElse(key, { 0 })
12751276
}
1277+
1278+
@Test
1279+
fun `checks received open sync settings menu telemetry when it should`() {
1280+
SyncTelemetry.processOpenSyncSettingsMenuTelemetry()
1281+
val events = SyncSettings.openMenu.testGetValue()!!
1282+
assertEquals(1, events.size)
1283+
assertEquals("sync_settings", events.elementAt(0).category)
1284+
assertEquals("open_menu", events.elementAt(0).name)
1285+
}
1286+
1287+
@Test
1288+
fun `checks received save sync settings telemetry when it should`() {
1289+
val enabledEngines = listOf<String>("bookmarks", "tabs")
1290+
val disabledEngines = listOf<String>("logins")
1291+
SyncTelemetry.processSaveSyncSettingsTelemetry(enabledEngines, disabledEngines)
1292+
val events = SyncSettings.save.testGetValue()!!
1293+
assertEquals(1, events.size)
1294+
assertEquals("sync_settings", events.elementAt(0).category)
1295+
assertEquals("save", events.elementAt(0).name)
1296+
assertEquals("bookmarks,tabs", events.elementAt(0).extra!!["enabled_engines"])
1297+
assertEquals("logins", events.elementAt(0).extra!!["disabled_engines"])
1298+
}
12761299
}

components/sync_manager/metrics.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,3 +1017,41 @@ fxa_tab_v2:
10171017
- sync-team@mozilla.com
10181018
- skhamis@mozilla.com
10191019
expires: never
1020+
1021+
sync_settings:
1022+
open_menu:
1023+
type: event
1024+
description: |
1025+
Records when the user opens the choose sync settings menu.
1026+
bugs:
1027+
- https://mozilla-hub.atlassian.net/browse/SYNC-4792
1028+
data_reviews:
1029+
- https://github.com/mozilla/application-services/pull/6786#issuecomment-2967802374
1030+
data_sensitivity:
1031+
- interaction
1032+
notification_emails:
1033+
- sync-dev@mozilla.org
1034+
expires: never
1035+
1036+
save:
1037+
type: event
1038+
description: |
1039+
Records when the user makes sync settings changes.
1040+
bugs:
1041+
- https://mozilla-hub.atlassian.net/browse/SYNC-4792
1042+
data_reviews:
1043+
- https://github.com/mozilla/application-services/pull/6786#issuecomment-2967802374
1044+
data_sensitivity:
1045+
- interaction
1046+
notification_emails:
1047+
- sync-dev@mozilla.org
1048+
expires: never
1049+
extra_keys:
1050+
enabled_engines:
1051+
description: |
1052+
A comma-delimited list of engines that were enabled by the user.
1053+
type: string
1054+
disabled_engines:
1055+
description: |
1056+
A comma-delimited list of engines that were disabled by the user.
1057+
type: string

megazords/ios-rust/Sources/MozillaRustComponentsWrapper/SyncManager/SyncManagerComponent.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import Foundation
6+
import Glean
67

78
open class SyncManagerComponent {
89
private var api: SyncManager
@@ -29,4 +30,16 @@ open class SyncManagerComponent {
2930
try processSyncTelemetry(syncTelemetry: telemetry)
3031
}
3132
}
33+
34+
public static func reportOpenSyncSettingsMenuTelemetry() {
35+
GleanMetrics.SyncSettings.openMenu.record()
36+
}
37+
38+
public static func reportSaveSyncSettingsTelemetry(enabledEngines: [String], disabledEngines: [String]) {
39+
let enabledList = enabledEngines.isEmpty ? nil : enabledEngines.joined(separator: ",")
40+
let disabledList = disabledEngines.isEmpty ? nil : disabledEngines.joined(separator: ",")
41+
let extras = GleanMetrics.SyncSettings.SaveExtra(disabledEngines: disabledList, enabledEngines: enabledList)
42+
43+
GleanMetrics.SyncSettings.save.record(extras)
44+
}
3245
}

megazords/ios-rust/tests/MozillaRustComponentsTests/SyncManagerTelemetryTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,4 +274,24 @@ class SyncManagerTelemetryTests: XCTestCase {
274274
submitCreditCardsPing: submitCreditCardsPing,
275275
submitTabsPing: submitTabsPing)
276276
}
277+
278+
func testReceivesOpenSyncSettingsMenuTelemetry() {
279+
SyncManagerComponent.reportOpenSyncSettingsMenuTelemetry()
280+
let events = GleanMetrics.SyncSettings.openMenu.testGetValue()!
281+
XCTAssertEqual(1, events.count)
282+
XCTAssertEqual("sync_settings", events[0].category)
283+
XCTAssertEqual("open_menu", events[0].name)
284+
}
285+
286+
func testReceivesSaveSyncSettingsTelemetry() {
287+
let enabledEngines = ["bookmarks", "tabs"]
288+
let disabledEngines = ["logins"]
289+
SyncManagerComponent.reportSaveSyncSettingsTelemetry(enabledEngines: enabledEngines, disabledEngines: disabledEngines)
290+
let events = GleanMetrics.SyncSettings.save.testGetValue()!
291+
XCTAssertEqual(1, events.count)
292+
XCTAssertEqual("sync_settings", events[0].category)
293+
XCTAssertEqual("save", events[0].name)
294+
XCTAssertEqual("bookmarks,tabs", events[0].extra!["enabled_engines"])
295+
XCTAssertEqual("logins", events[0].extra!["disabled_engines"])
296+
}
277297
}

0 commit comments

Comments
 (0)