From 11d96c8fed81dfb9d11d1d8dbb957e084434b8ed Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 29 Apr 2024 11:09:40 -0700 Subject: [PATCH 1/3] Send timing, screen, and impression events through unified_analytics --- .../src/shared/analytics/_analytics_web.dart | 126 +++++++++--------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index 7ff3b929000..f85e96a935e 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -470,14 +470,12 @@ void screen( int value = 0, ]) { _log.fine('Event: Screen(screenName:$screenName, value:$value)'); - GTag.event( - screenName, - gaEventProvider: () => _gtagEvent( - event_category: gac.screenViewEvent, - value: value, - send_to: gaDevToolsPropertyId(), - ), + final gtagEvent = _gtagEvent( + event_category: gac.screenViewEvent, + value: value, + send_to: gaDevToolsPropertyId(), ); + _sendEventForScreen(screenName, gtagEvent); } String _operationKey(String screenName, String timedOperation) { @@ -616,16 +614,14 @@ void _timing( 'timedOperation:$timedOperation, ' 'durationMicros:$durationMicros)', ); - GTag.event( - screenName, - gaEventProvider: () => _gtagEvent( - event_category: gac.timingEvent, - event_label: timedOperation, - value: durationMicros, - send_to: gaDevToolsPropertyId(), - screenMetrics: screenMetrics, - ), + final gtagEvent = _gtagEvent( + event_category: gac.timingEvent, + event_label: timedOperation, + value: durationMicros, + send_to: gaDevToolsPropertyId(), + screenMetrics: screenMetrics, ); + _sendEventForScreen(screenName, gtagEvent); } /// Sends an analytics event to signal that something in DevTools was selected. @@ -652,43 +648,7 @@ void select( screenMetrics: screenMetricsProvider != null ? screenMetricsProvider() : null, ); - GTag.event( - screenName, - gaEventProvider: () => gtagEvent, - ); - - final uaEvent = ua.Event.devtoolsEvent( - eventCategory: gtagEvent.event_category!, - label: gtagEvent.event_label!, - value: gtagEvent.value, - userInitiatedInteraction: !gtagEvent.non_interaction, - userApp: gtagEvent.user_app, - userBuild: gtagEvent.user_build, - userPlatform: gtagEvent.user_platform, - devtoolsPlatform: gtagEvent.devtools_platform, - devtoolsChrome: gtagEvent.devtools_chrome, - devtoolsVersion: gtagEvent.devtools_version, - ideLaunched: gtagEvent.ide_launched, - isExternalBuild: gtagEvent.is_external_build, - isEmbedded: gtagEvent.is_embedded, - ideLaunchedFeature: gtagEvent.ide_launched_feature, - g3Username: gtagEvent.g3_username, - uiDurationMicros: gtagEvent.ui_duration_micros, - rasterDurationMicros: gtagEvent.raster_duration_micros, - shaderCompilationDurationMicros: - gtagEvent.shader_compilation_duration_micros, - traceEventCount: gtagEvent.trace_event_count, - cpuSampleCount: gtagEvent.cpu_sample_count, - cpuStackDepth: gtagEvent.cpu_stack_depth, - heapDiffObjectsBefore: gtagEvent.heap_diff_objects_before, - heapDiffObjectsAfter: gtagEvent.heap_diff_objects_after, - heapObjectsTotal: gtagEvent.heap_objects_total, - rootSetCount: gtagEvent.root_set_count, - rowCount: gtagEvent.row_count, - inspectorTreeControllerId: gtagEvent.inspector_tree_controller_id, - ); - - unawaited(dtdManager.sendAnalyticsEvent(uaEvent)); + _sendEventForScreen(screenName, gtagEvent); } /// Sends an analytics event to signal that something in DevTools was viewed. @@ -704,17 +664,15 @@ void impression( 'screenName:$screenName, ' 'item:$item)', ); - GTag.event( - screenName, - gaEventProvider: () => _gtagEvent( - event_category: gac.impressionEvent, - event_label: item, - non_interaction: true, - send_to: gaDevToolsPropertyId(), - screenMetrics: - screenMetricsProvider != null ? screenMetricsProvider() : null, - ), + final gtagEvent = _gtagEvent( + event_category: gac.impressionEvent, + event_label: item, + non_interaction: true, + send_to: gaDevToolsPropertyId(), + screenMetrics: + screenMetricsProvider != null ? screenMetricsProvider() : null, ); + _sendEventForScreen(screenName, gtagEvent); } String? _lastGaError; @@ -954,3 +912,45 @@ void legacyOnSetupAnalytics() { initializeGA(); jsHookupListenerForGA(); } + +void _sendEventForScreen(String screenName, GtagEventDevTools gtagEvent) { + GTag.event( + screenName, + gaEventProvider: () => gtagEvent, + ); + final uaEvent = uaEventFromGtagEvent(gtagEvent); + unawaited(dtdManager.sendAnalyticsEvent(uaEvent)); +} + +ua.Event uaEventFromGtagEvent(GtagEventDevTools gtagEvent) { + return ua.Event.devtoolsEvent( + eventCategory: gtagEvent.event_category!, + label: gtagEvent.event_label!, + value: gtagEvent.value, + userInitiatedInteraction: !gtagEvent.non_interaction, + userApp: gtagEvent.user_app, + userBuild: gtagEvent.user_build, + userPlatform: gtagEvent.user_platform, + devtoolsPlatform: gtagEvent.devtools_platform, + devtoolsChrome: gtagEvent.devtools_chrome, + devtoolsVersion: gtagEvent.devtools_version, + ideLaunched: gtagEvent.ide_launched, + isExternalBuild: gtagEvent.is_external_build, + isEmbedded: gtagEvent.is_embedded, + ideLaunchedFeature: gtagEvent.ide_launched_feature, + g3Username: gtagEvent.g3_username, + uiDurationMicros: gtagEvent.ui_duration_micros, + rasterDurationMicros: gtagEvent.raster_duration_micros, + shaderCompilationDurationMicros: + gtagEvent.shader_compilation_duration_micros, + traceEventCount: gtagEvent.trace_event_count, + cpuSampleCount: gtagEvent.cpu_sample_count, + cpuStackDepth: gtagEvent.cpu_stack_depth, + heapDiffObjectsBefore: gtagEvent.heap_diff_objects_before, + heapDiffObjectsAfter: gtagEvent.heap_diff_objects_after, + heapObjectsTotal: gtagEvent.heap_objects_total, + rootSetCount: gtagEvent.root_set_count, + rowCount: gtagEvent.row_count, + inspectorTreeControllerId: gtagEvent.inspector_tree_controller_id, + ); +} From 897d3f41da772faccb3cbf9b5eaacd2d2661ed7e Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 29 Apr 2024 11:53:59 -0700 Subject: [PATCH 2/3] add exception --- .../lib/src/shared/analytics/_analytics_stub.dart | 1 - .../lib/src/shared/analytics/_analytics_web.dart | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_stub.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_stub.dart index 7f5db17ba46..09ab3b8fd1b 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_stub.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_stub.dart @@ -98,7 +98,6 @@ void impression( void reportError( String errorMessage, { bool fatal = false, - ScreenAnalyticsMetrics Function()? screenMetricsProvider, }) {} Future setupDimensions() async {} diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index f85e96a935e..95ca192910b 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -680,7 +680,6 @@ String? _lastGaError; void reportError( String errorMessage, { bool fatal = false, - ScreenAnalyticsMetrics Function()? screenMetricsProvider, }) { // Don't keep recording same last error. if (_lastGaError == errorMessage) return; @@ -690,10 +689,13 @@ void reportError( gaExceptionProvider: () => _gtagException( errorMessage, fatal: fatal, - screenMetrics: - screenMetricsProvider != null ? screenMetricsProvider() : null, ), ); + + // TODO(kenz): we may want to create a new event `devtoolsException` if we + // need all of our custom dimensions logged with exceptions. + final uaEvent = ua.Event.exception(exception: errorMessage); + unawaited(dtdManager.sendAnalyticsEvent(uaEvent)); } //////////////////////////////////////////////////////////////////////////////// From 7554faf0b13c6e554dc22a8341dbd848a7dc516d Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Mon, 29 Apr 2024 12:02:35 -0700 Subject: [PATCH 3/3] add event label for screen events --- .../lib/src/shared/analytics/_analytics_web.dart | 5 +++-- .../devtools_app/lib/src/shared/analytics/constants.dart | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart index 95ca192910b..80c432f4d47 100644 --- a/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart +++ b/packages/devtools_app/lib/src/shared/analytics/_analytics_web.dart @@ -186,8 +186,8 @@ class GtagEventDevTools extends GtagEvent { // This cannot be a factory constructor in the [GtagEventDevTools] class due to // https://github.com/dart-lang/sdk/issues/46967. GtagEventDevTools _gtagEvent({ - String? event_category, - String? event_label, + required String event_category, + required String event_label, String? send_to, bool non_interaction = false, int value = 0, @@ -472,6 +472,7 @@ void screen( _log.fine('Event: Screen(screenName:$screenName, value:$value)'); final gtagEvent = _gtagEvent( event_category: gac.screenViewEvent, + event_label: gac.init, value: value, send_to: gaDevToolsPropertyId(), ); diff --git a/packages/devtools_app/lib/src/shared/analytics/constants.dart b/packages/devtools_app/lib/src/shared/analytics/constants.dart index 427639d739a..826e4c6788d 100644 --- a/packages/devtools_app/lib/src/shared/analytics/constants.dart +++ b/packages/devtools_app/lib/src/shared/analytics/constants.dart @@ -42,6 +42,7 @@ final deeplink = ScreenMetaData.deepLinks.id; // GA events not associated with a any screen e.g., hotReload, hotRestart, etc const devToolsMain = 'main'; const appDisconnected = 'appDisconnected'; +const init = 'init'; // DevTools UI action selected (clicked).