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;
}