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 7ff3b929000..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, @@ -470,14 +470,13 @@ 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, + event_label: gac.init, + value: value, + send_to: gaDevToolsPropertyId(), ); + _sendEventForScreen(screenName, gtagEvent); } String _operationKey(String screenName, String timedOperation) { @@ -616,16 +615,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 +649,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 +665,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; @@ -722,7 +681,6 @@ String? _lastGaError; void reportError( String errorMessage, { bool fatal = false, - ScreenAnalyticsMetrics Function()? screenMetricsProvider, }) { // Don't keep recording same last error. if (_lastGaError == errorMessage) return; @@ -732,10 +690,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)); } //////////////////////////////////////////////////////////////////////////////// @@ -954,3 +915,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, + ); +} 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).