You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by pa...@apache.org on 2022/06/29 20:40:27 UTC

[beam] branch master updated: Add an abstract layer for analytics, fix logging change of snippet, fix logging cancelling, fix logging link following (#22012)

This is an automated email from the ASF dual-hosted git repository.

pabloem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new d69fcb7a3b5 Add an abstract layer for analytics, fix logging change of snippet, fix logging cancelling, fix logging link following (#22012)
     new de04604aee0 Merge pull request #22013 from [Playground] Fix analytics for snippet changing, cancelling, and link following (#22012)
d69fcb7a3b5 is described below

commit d69fcb7a3b59e2d5e0ff9483bea6e55769c2196f
Author: Alexey Inkin <le...@inkin.ru>
AuthorDate: Fri Jun 17 14:51:01 2022 +0400

    Add an abstract layer for analytics, fix logging change of snippet, fix logging cancelling, fix logging link following (#22012)
---
 .../lib/modules/analytics/analytics_events.dart    |   1 +
 .../lib/modules/analytics/analytics_service.dart   | 122 +++------------------
 ..._service.dart => google_analytics_service.dart} |  36 ++++--
 .../example_list/expansion_panel_item.dart         |   2 +-
 .../components/embedded_appbar_title.dart          |  16 +--
 .../components/editor_textarea_wrapper.dart        |  13 +--
 .../components/playground_page_providers.dart      |   3 +-
 playground/frontend/lib/utils/analytics_utils.dart |  10 +-
 8 files changed, 65 insertions(+), 138 deletions(-)

diff --git a/playground/frontend/lib/modules/analytics/analytics_events.dart b/playground/frontend/lib/modules/analytics/analytics_events.dart
index 120d095a7d1..d91b8e7586f 100644
--- a/playground/frontend/lib/modules/analytics/analytics_events.dart
+++ b/playground/frontend/lib/modules/analytics/analytics_events.dart
@@ -32,6 +32,7 @@ const kOpenShortcutsModalEvent = 'open_shortcuts_modal';
 const kOpenLinkEvent = 'open_link';
 const kClickEnjoyPlaygroundEvent = 'click_enjoy_playground';
 const kClickRunEvent = 'click_run';
+const kClickCancelRunEvent = 'click_cancel_run';
 const kRunTimeEvent = 'run_time';
 const kClickReportIssueEvent = 'click_report_issue';
 const kClickSendFeedbackEvent = 'click_send_feedback';
diff --git a/playground/frontend/lib/modules/analytics/analytics_service.dart b/playground/frontend/lib/modules/analytics/analytics_service.dart
index 7c4911e52a4..225386ef2a9 100644
--- a/playground/frontend/lib/modules/analytics/analytics_service.dart
+++ b/playground/frontend/lib/modules/analytics/analytics_service.dart
@@ -16,119 +16,27 @@
  * limitations under the License.
  */
 
-import 'package:flutter/cupertino.dart';
-import 'package:playground/config.g.dart';
-import 'package:playground/modules/analytics/analytics_events.dart';
+import 'package:flutter/widgets.dart';
 import 'package:playground/modules/examples/models/example_model.dart';
 import 'package:playground/modules/sdk/models/sdk.dart';
 import 'package:provider/provider.dart';
-import 'package:usage/usage_html.dart';
-
-class AnalyticsService {
-  late final Analytics _analytics;
-
-  AnalyticsService() {
-    _analytics = AnalyticsHtml(kAnalyticsUA, 'beam', '1.0');
-  }
 
+abstract class AnalyticsService {
   static AnalyticsService get(BuildContext context) {
     return Provider.of<AnalyticsService>(context, listen: false);
   }
 
-  void trackSelectSdk(SDK oldSdk, SDK newSdk) {
-    safeSendEvent(
-      kSdkCategory,
-      kSelectSdkEvent,
-      label: '${oldSdk.displayName}_${newSdk.displayName}',
-    );
-  }
-
-  void trackSelectExample(ExampleModel newExample) {
-    safeSendEvent(
-      kExampleCategory,
-      kSelectExampleEvent,
-      label: newExample.path,
-    );
-  }
-
-  void trackClickNewExample() {
-    safeSendEvent(kExampleCategory, kClickNewExampleEvent);
-  }
-
-  void trackReset() {
-    safeSendEvent(kCommonCategory, kClickResetEvent);
-  }
-
-  void trackClickToggleTheme(bool isDark) {
-    safeSendEvent(
-      kCommonCategory,
-      kClickToggleThemeEvent,
-      label: isDark ? 'dark' : 'light',
-    );
-  }
-
-  void trackOpenShortcutsModal() {
-    safeSendEvent(kCommonCategory, kOpenShortcutsModalEvent);
-  }
-
-  void trackOpenLink(String link) {
-    safeSendEvent(
-      kLinkCategory,
-      kOpenShortcutsModalEvent,
-      label: link,
-    );
-  }
-
-  void trackClickEnjoyPlayground(bool isEnjoying) {
-    safeSendEvent(
-      kFeedbackCategory,
-      kClickEnjoyPlaygroundEvent,
-      label: 'isEnjoying = ' + isEnjoying.toString(),
-    );
-  }
-
-  void trackClickReportIssue() {
-    safeSendEvent(kFeedbackCategory, kClickReportIssueEvent);
-  }
-
-  void trackClickRunEvent(String exampleName) {
-    safeSendEvent(
-      kRunCodeCategory,
-      kClickRunEvent,
-      label: exampleName,
-    );
-  }
-
-  void trackClickSendFeedback(String feedback) {
-    safeSendEvent(
-      kFeedbackCategory,
-      kClickSendFeedbackEvent,
-      label: feedback,
-    );
-  }
-
-  void trackRunTimeEvent(String exampleName, int runTimeMs) {
-    safeSendEvent(
-      kRunCodeCategory,
-      kRunTimeEvent,
-      label: exampleName,
-      value: runTimeMs,
-    );
-  }
-
-  void safeSendEvent(String category, String action,
-      {String? label, int? value, Map<String, String>? parameters}) {
-    try {
-      _analytics.sendEvent(
-        category,
-        action,
-        label: label,
-        value: value,
-        parameters: parameters,
-      );
-    } catch (e) {
-      // ignore analytics errors sync they don't affect app
-      print(e);
-    }
-  }
+  void trackSelectSdk(SDK oldSdk, SDK newSdk);
+  void trackSelectExample(ExampleModel newExample);
+  void trackClickNewExample();
+  void trackReset();
+  void trackClickToggleTheme(bool isDark);
+  void trackOpenShortcutsModal();
+  void trackOpenLink(String link);
+  void trackClickEnjoyPlayground(bool isEnjoying);
+  void trackClickReportIssue();
+  void trackClickRunEvent(String exampleName);
+  void trackClickCancelRunEvent(String exampleName);
+  void trackClickSendFeedback(String feedback);
+  void trackRunTimeEvent(String exampleName, int runTimeMs);
 }
diff --git a/playground/frontend/lib/modules/analytics/analytics_service.dart b/playground/frontend/lib/modules/analytics/google_analytics_service.dart
similarity index 85%
copy from playground/frontend/lib/modules/analytics/analytics_service.dart
copy to playground/frontend/lib/modules/analytics/google_analytics_service.dart
index 7c4911e52a4..1e8729349cb 100644
--- a/playground/frontend/lib/modules/analytics/analytics_service.dart
+++ b/playground/frontend/lib/modules/analytics/google_analytics_service.dart
@@ -16,25 +16,21 @@
  * limitations under the License.
  */
 
-import 'package:flutter/cupertino.dart';
 import 'package:playground/config.g.dart';
 import 'package:playground/modules/analytics/analytics_events.dart';
+import 'package:playground/modules/analytics/analytics_service.dart';
 import 'package:playground/modules/examples/models/example_model.dart';
 import 'package:playground/modules/sdk/models/sdk.dart';
-import 'package:provider/provider.dart';
 import 'package:usage/usage_html.dart';
 
-class AnalyticsService {
+class GoogleAnalyticsService implements AnalyticsService {
   late final Analytics _analytics;
 
-  AnalyticsService() {
+  GoogleAnalyticsService() {
     _analytics = AnalyticsHtml(kAnalyticsUA, 'beam', '1.0');
   }
 
-  static AnalyticsService get(BuildContext context) {
-    return Provider.of<AnalyticsService>(context, listen: false);
-  }
-
+  @override
   void trackSelectSdk(SDK oldSdk, SDK newSdk) {
     safeSendEvent(
       kSdkCategory,
@@ -43,6 +39,7 @@ class AnalyticsService {
     );
   }
 
+  @override
   void trackSelectExample(ExampleModel newExample) {
     safeSendEvent(
       kExampleCategory,
@@ -51,14 +48,17 @@ class AnalyticsService {
     );
   }
 
+  @override
   void trackClickNewExample() {
     safeSendEvent(kExampleCategory, kClickNewExampleEvent);
   }
 
+  @override
   void trackReset() {
     safeSendEvent(kCommonCategory, kClickResetEvent);
   }
 
+  @override
   void trackClickToggleTheme(bool isDark) {
     safeSendEvent(
       kCommonCategory,
@@ -67,30 +67,35 @@ class AnalyticsService {
     );
   }
 
+  @override
   void trackOpenShortcutsModal() {
     safeSendEvent(kCommonCategory, kOpenShortcutsModalEvent);
   }
 
+  @override
   void trackOpenLink(String link) {
     safeSendEvent(
       kLinkCategory,
-      kOpenShortcutsModalEvent,
+      kOpenLinkEvent,
       label: link,
     );
   }
 
+  @override
   void trackClickEnjoyPlayground(bool isEnjoying) {
     safeSendEvent(
       kFeedbackCategory,
       kClickEnjoyPlaygroundEvent,
-      label: 'isEnjoying = ' + isEnjoying.toString(),
+      label: 'isEnjoying = $isEnjoying',
     );
   }
 
+  @override
   void trackClickReportIssue() {
     safeSendEvent(kFeedbackCategory, kClickReportIssueEvent);
   }
 
+  @override
   void trackClickRunEvent(String exampleName) {
     safeSendEvent(
       kRunCodeCategory,
@@ -99,6 +104,16 @@ class AnalyticsService {
     );
   }
 
+  @override
+  void trackClickCancelRunEvent(String exampleName) {
+    safeSendEvent(
+      kRunCodeCategory,
+      kClickCancelRunEvent,
+      label: exampleName,
+    );
+  }
+
+  @override
   void trackClickSendFeedback(String feedback) {
     safeSendEvent(
       kFeedbackCategory,
@@ -107,6 +122,7 @@ class AnalyticsService {
     );
   }
 
+  @override
   void trackRunTimeEvent(String exampleName, int runTimeMs) {
     safeSendEvent(
       kRunCodeCategory,
diff --git a/playground/frontend/lib/modules/examples/components/example_list/expansion_panel_item.dart b/playground/frontend/lib/modules/examples/components/example_list/expansion_panel_item.dart
index 7f29c441cd1..643c4585d96 100644
--- a/playground/frontend/lib/modules/examples/components/example_list/expansion_panel_item.dart
+++ b/playground/frontend/lib/modules/examples/components/example_list/expansion_panel_item.dart
@@ -48,12 +48,12 @@ class ExpansionPanelItem extends StatelessWidget {
           onTap: () async {
             if (playgroundState.selectedExample != example) {
               closeDropdown(exampleState);
+              AnalyticsService.get(context).trackSelectExample(example);
               final exampleWithInfo = await exampleState.loadExampleInfo(
                 example,
                 playgroundState.sdk,
               );
               playgroundState.setExample(exampleWithInfo);
-              AnalyticsService.get(context).trackSelectExample(exampleWithInfo);
             }
           },
           child: Container(
diff --git a/playground/frontend/lib/pages/embedded_playground/components/embedded_appbar_title.dart b/playground/frontend/lib/pages/embedded_playground/components/embedded_appbar_title.dart
index 703f765c620..fd981f59875 100644
--- a/playground/frontend/lib/pages/embedded_playground/components/embedded_appbar_title.dart
+++ b/playground/frontend/lib/pages/embedded_playground/components/embedded_appbar_title.dart
@@ -43,6 +43,10 @@ class EmbeddedAppBarTitle extends StatelessWidget {
           RunButton(
             isRunning: state.isCodeRunning,
             cancelRun: () {
+              final exampleName = getAnalyticsExampleName(state);
+              final analyticsService = AnalyticsService.get(context);
+              analyticsService.trackClickCancelRunEvent(exampleName);
+
               state.cancelRun().catchError(
                     (_) => NotificationManager.showError(
                       context,
@@ -53,20 +57,18 @@ class EmbeddedAppBarTitle extends StatelessWidget {
             },
             runCode: () {
               final stopwatch = Stopwatch()..start();
-              final exampleName = getAnalyticsExampleName(
-                state.selectedExample,
-                state.isExampleChanged,
-                state.sdk,
-              );
+              final exampleName = getAnalyticsExampleName(state);
+              final analyticsService = AnalyticsService.get(context);
+
               state.runCode(
                 onFinish: () {
-                  AnalyticsService.get(context).trackRunTimeEvent(
+                  analyticsService.trackRunTimeEvent(
                     exampleName,
                     stopwatch.elapsedMilliseconds,
                   );
                 },
               );
-              AnalyticsService.get(context).trackClickRunEvent(exampleName);
+              analyticsService.trackClickRunEvent(exampleName);
             },
           ),
           const ToggleThemeIconButton(),
diff --git a/playground/frontend/lib/pages/playground/components/editor_textarea_wrapper.dart b/playground/frontend/lib/pages/playground/components/editor_textarea_wrapper.dart
index 71c3eda4382..95a02e5940c 100644
--- a/playground/frontend/lib/pages/playground/components/editor_textarea_wrapper.dart
+++ b/playground/frontend/lib/pages/playground/components/editor_textarea_wrapper.dart
@@ -92,6 +92,9 @@ class CodeTextAreaWrapper extends StatelessWidget {
                           disabled: state.selectedExample?.isMultiFile ?? false,
                           isRunning: state.isCodeRunning,
                           cancelRun: () {
+                            final exampleName = getAnalyticsExampleName(state);
+                            AnalyticsService.get(context)
+                                .trackClickCancelRunEvent(exampleName);
                             state.cancelRun().catchError(
                                   (_) => NotificationManager.showError(
                                     context,
@@ -104,11 +107,8 @@ class CodeTextAreaWrapper extends StatelessWidget {
                             AnalyticsService analyticsService =
                                 AnalyticsService.get(context);
                             final stopwatch = Stopwatch()..start();
-                            final exampleName = getAnalyticsExampleName(
-                              state.selectedExample,
-                              state.isExampleChanged,
-                              state.sdk,
-                            );
+                            final exampleName = getAnalyticsExampleName(state);
+
                             state.runCode(
                               onFinish: () {
                                 analyticsService.trackRunTimeEvent(
@@ -117,8 +117,7 @@ class CodeTextAreaWrapper extends StatelessWidget {
                                 );
                               },
                             );
-                            AnalyticsService.get(context)
-                                .trackClickRunEvent(exampleName);
+                            analyticsService.trackClickRunEvent(exampleName);
                           },
                         ),
                       ),
diff --git a/playground/frontend/lib/pages/playground/components/playground_page_providers.dart b/playground/frontend/lib/pages/playground/components/playground_page_providers.dart
index e2455f4f0b1..56199f0ba57 100644
--- a/playground/frontend/lib/pages/playground/components/playground_page_providers.dart
+++ b/playground/frontend/lib/pages/playground/components/playground_page_providers.dart
@@ -19,6 +19,7 @@
 import 'package:flutter/material.dart';
 import 'package:playground/constants/params.dart';
 import 'package:playground/modules/analytics/analytics_service.dart';
+import 'package:playground/modules/analytics/google_analytics_service.dart';
 import 'package:playground/modules/editor/repository/code_repository/code_client/grpc_code_client.dart';
 import 'package:playground/modules/editor/repository/code_repository/code_repository.dart';
 import 'package:playground/modules/examples/models/example_model.dart';
@@ -46,7 +47,7 @@ class PlaygroundPageProviders extends StatelessWidget {
   Widget build(BuildContext context) {
     return MultiProvider(
       providers: [
-        Provider<AnalyticsService>(create: (context) => AnalyticsService()),
+        Provider<AnalyticsService>(create: (context) => GoogleAnalyticsService()),
         ChangeNotifierProvider<ExampleState>(
           create: (context) => ExampleState(kExampleRepository)..init(),
         ),
diff --git a/playground/frontend/lib/utils/analytics_utils.dart b/playground/frontend/lib/utils/analytics_utils.dart
index a9c2081cbea..803b228228e 100644
--- a/playground/frontend/lib/utils/analytics_utils.dart
+++ b/playground/frontend/lib/utils/analytics_utils.dart
@@ -16,13 +16,13 @@
  * limitations under the License.
  */
 
-import 'package:playground/modules/examples/models/example_model.dart';
 import 'package:playground/modules/sdk/models/sdk.dart';
+import 'package:playground/pages/playground/states/playground_state.dart';
 
-String getAnalyticsExampleName(ExampleModel? example, bool isExampleChanged, SDK sdk) {
-  final customCodeName = 'Custom code, sdk ${sdk.displayName}';
-  if (isExampleChanged) {
+String getAnalyticsExampleName(PlaygroundState state) {
+  final customCodeName = 'Custom code, sdk ${state.sdk.displayName}';
+  if (state.isExampleChanged) {
     return customCodeName;
   }
-  return example?.path ?? customCodeName;
+  return state.selectedExample?.path ?? customCodeName;
 }