Skip to content

Commit 1048430

Browse files
authored
[ENG-4002] log pageviews to osf:metrics (#1640)
- Ticket: [ENG-4002] ## Purpose start saving our own pageview/usage data (under `osf:api/_/metrics/`), without disrupting our current metrics setup but with intent to eventually delete our current metrics setup. (depends on CenterForOpenScience/osf.io#9954) ## Summary of Changes - update `trackPage()` on the `analytics` service to: - gather metadata from each active route via [`RouterService.currentRoute`](https://api.emberjs.com/ember/3.26/classes/RouterService/properties/currentRoute?anchor=currentRoute) (including route-specific metadata via [`RouteInfo.metadata`](https://api.emberjs.com/ember/3.26/classes/RouteInfo/properties/metadata?anchor=metadata)) - send a usage event to `osf:api/_/metrics/events/counted_usage/` - implement [`buildRouteInfoMetadata()`](https://api.emberjs.com/ember/3.26/classes/Route/methods/buildRouteInfoMetadata?anchor=buildRouteInfoMetadata) on routes that have their own pageview metadata (e.g. a guid or provider) - add `trackPage()` calls to each `application` route's `didTransition` hook, in the host app and each engine - remove `trackPage()` calls from all non-`application` routes that had them - add mirage endpoint and model for `counted_usage`, and a simple `analytics.trackPage()` test that uses them - update the [analytics page in the handbook](https://github.com/CenterForOpenScience/ember-osf-web/pull/1640/files#diff-27cfe9fecf6f24b61e3b7b6bdd13c46ad4b0c7e5e3a9b9b0d88013d015804095) accordingly
1 parent 9fe50a3 commit 1048430

File tree

59 files changed

+296
-426
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+296
-426
lines changed

app/application/route.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import Route from '@ember/routing/route';
2+
import { action } from '@ember/object';
23
import { inject as service } from '@ember/service';
34
import Intl from 'ember-intl/services/intl';
45

56
import checkAuth from 'ember-osf-web/decorators/check-auth';
7+
import Analytics from 'ember-osf-web/services/analytics';
68
import CurrentUser from 'ember-osf-web/services/current-user';
79

810
@checkAuth
@@ -18,6 +20,7 @@ export default class ApplicationRoute extends Route.extend(
1820
) {
1921
@service intl!: Intl;
2022
@service currentUser!: CurrentUser;
23+
@service analytics!: Analytics;
2124

2225
queryParams = {
2326
viewOnlyToken: {
@@ -28,4 +31,9 @@ export default class ApplicationRoute extends Route.extend(
2831
beforeModel() {
2932
return this.intl.setLocale('en-us');
3033
}
34+
35+
@action
36+
didTransition() {
37+
this.analytics.trackPage();
38+
}
3139
}

app/dashboard/route.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1-
import { action } from '@ember/object';
21
import Route from '@ember/routing/route';
32
import { inject as service } from '@ember/service';
43
import { taskFor } from 'ember-concurrency-ts';
54
import Session from 'ember-simple-auth/services/session';
65

76
import DashboardController from 'ember-osf-web/dashboard/controller';
87
import requireAuth from 'ember-osf-web/decorators/require-auth';
9-
import Analytics from 'ember-osf-web/services/analytics';
108
import CurrentUser from 'ember-osf-web/services/current-user';
119
import Ready from 'ember-osf-web/services/ready';
1210

1311
@requireAuth('home')
1412
export default class Dashboard extends Route {
15-
@service analytics!: Analytics;
1613
@service currentUser!: CurrentUser;
1714
@service ready!: Ready;
1815
@service session!: Session;
@@ -27,9 +24,4 @@ export default class Dashboard extends Route {
2724
blocker.errored(e);
2825
}
2926
}
30-
31-
@action
32-
didTransition() {
33-
this.analytics.trackPage();
34-
}
3527
}

app/goodbye/route.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
1-
import { action } from '@ember/object';
21
import Transition from '@ember/routing/-private/transition';
32
import Route from '@ember/routing/route';
43
import { inject as service } from '@ember/service';
54
import Session from 'ember-simple-auth/services/session';
65

7-
import Analytics from 'ember-osf-web/services/analytics';
8-
96
export default class Goodbye extends Route {
10-
@service analytics!: Analytics;
117
@service session!: Session;
128

139
async beforeModel(transition: Transition) {
1410
await super.beforeModel(transition);
1511
const queryParams = this.session.isAuthenticated ? {} : { goodbye: true };
1612
this.transitionTo('home', { queryParams });
1713
}
18-
19-
@action
20-
didTransition() {
21-
this.analytics.trackPage();
22-
}
2314
}

app/guid-file/route.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { action } from '@ember/object';
21
import Route from '@ember/routing/route';
32
import { inject as service } from '@ember/service';
43
import { waitFor } from '@ember/test-waiters';
@@ -8,7 +7,6 @@ import { taskFor } from 'ember-concurrency-ts';
87
import moment from 'moment';
98

109
import Institution from 'ember-osf-web/models/institution';
11-
import Analytics from 'ember-osf-web/services/analytics';
1210
import MetaTags, { HeadTagDef } from 'ember-osf-web/services/meta-tags';
1311
import Ready from 'ember-osf-web/services/ready';
1412
import OsfStorageFile from 'ember-osf-web/packages/files/osf-storage-file';
@@ -27,7 +25,6 @@ import CurrentUserService from 'ember-osf-web/services/current-user';
2725
import RegistrationModel from 'ember-osf-web/models/registration';
2826

2927
export default class GuidFile extends Route {
30-
@service analytics!: Analytics;
3128
@service('head-tags') headTagsService!: HeadTagsService;
3229
@service metaTags!: MetaTags;
3330
@service ready!: Ready;
@@ -116,8 +113,11 @@ export default class GuidFile extends Route {
116113
taskFor(this.setHeadTags).perform(model.fileModel);
117114
}
118115

119-
@action
120-
didTransition() {
121-
this.analytics.trackPage(true, 'files');
116+
buildRouteInfoMetadata() {
117+
return {
118+
osfMetrics: {
119+
itemGuid: this.controller.model.id,
120+
},
121+
};
122122
}
123123
}

app/guid-node/forks/route.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,7 @@
1-
import { action } from '@ember/object';
21
import Route from '@ember/routing/route';
3-
import { inject as service } from '@ember/service';
4-
5-
import Node from 'ember-osf-web/models/node';
6-
import { GuidRouteModel } from 'ember-osf-web/resolve-guid/guid-route';
7-
import Analytics from 'ember-osf-web/services/analytics';
8-
import Ready from 'ember-osf-web/services/ready';
92

103
export default class GuidNodeForks extends Route {
11-
@service analytics!: Analytics;
12-
@service ready!: Ready;
13-
144
model() {
155
return this.modelFor('guid-node');
166
}
17-
18-
@action
19-
async didTransition() {
20-
const { taskInstance } = this.controller.model as GuidRouteModel<Node>;
21-
await taskInstance;
22-
const node = taskInstance.value;
23-
this.analytics.trackPage(node ? node.public : undefined, 'nodes');
24-
}
257
}
Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
1-
import { action } from '@ember/object';
21
import Transition from '@ember/routing/-private/transition';
32
import Route from '@ember/routing/route';
4-
import { inject as service } from '@ember/service';
53
import { taskFor } from 'ember-concurrency-ts';
64

75
import Node from 'ember-osf-web/models/node';
86
import { GuidRouteModel } from 'ember-osf-web/resolve-guid/guid-route';
9-
import Analytics from 'ember-osf-web/services/analytics';
107

118
import Controller from './controller';
129

1310
export default class GuidNodeRegistrations extends Route {
14-
@service analytics!: Analytics;
15-
1611
model() {
1712
return this.modelFor('guid-node') as GuidRouteModel<Node>;
1813
}
@@ -21,12 +16,4 @@ export default class GuidNodeRegistrations extends Route {
2116
super.setupController(controller, model, transition);
2217
taskFor(controller.getRegistrationSchemas).perform();
2318
}
24-
25-
@action
26-
async didTransition() {
27-
const { taskInstance } = this.controller.model as GuidRouteModel<Node>;
28-
await taskInstance;
29-
const node = taskInstance.value;
30-
this.analytics.trackPage(node ? node.public : undefined, 'nodes');
31-
}
3219
}
Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,12 @@
1-
import { action } from '@ember/object';
21
import Route from '@ember/routing/route';
32
import { inject as service } from '@ember/service';
43

5-
import Registration from 'ember-osf-web/models/registration';
6-
import { GuidRouteModel } from 'ember-osf-web/resolve-guid/guid-route';
7-
import Analytics from 'ember-osf-web/services/analytics';
84
import Ready from 'ember-osf-web/services/ready';
95

106
export default class GuidRegistrationForks extends Route {
11-
@service analytics!: Analytics;
127
@service ready!: Ready;
138

149
model() {
1510
return this.modelFor('guid-registration');
1611
}
17-
18-
@action
19-
async didTransition() {
20-
const { taskInstance } = this.controller.model as GuidRouteModel<Registration>;
21-
await taskInstance;
22-
const registration = taskInstance.value;
23-
this.analytics.trackPage(registration ? registration.public : undefined, 'registrations');
24-
}
2512
}

app/helpers/open-badges-icon-map.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ResourceTypes } from 'ember-osf-web/models/resource';
22

3-
export function getBadgeIcon(resourceType: ResourceTypes) {
3+
export function getBadgeIcon(resourceType: ResourceTypes | 'undefined') {
44
switch (resourceType) {
55
case ResourceTypes.Data:
66
return '/assets/images/badges/data_small_color.png';
@@ -17,7 +17,7 @@ export function getBadgeIcon(resourceType: ResourceTypes) {
1717
}
1818
}
1919

20-
export function getBadgeIconDisabled(resourceType: ResourceTypes) {
20+
export function getBadgeIconDisabled(resourceType: ResourceTypes | 'undefined') {
2121
switch (resourceType) {
2222
case ResourceTypes.Data:
2323
return '/assets/images/badges/data_small_gray.png';

app/home/route.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
1-
import { action } from '@ember/object';
21
import Transition from '@ember/routing/-private/transition';
32
import Route from '@ember/routing/route';
43
import { inject as service } from '@ember/service';
5-
import Features from 'ember-feature-flags/services/features';
6-
import config from 'ember-get-config';
74
import Session from 'ember-simple-auth/services/session';
85

9-
import Analytics from 'ember-osf-web/services/analytics';
10-
11-
const { featureFlagNames: { ABTesting } } = config;
12-
136
export default class Home extends Route {
14-
@service analytics!: Analytics;
157
@service session!: Session;
16-
@service features!: Features;
178

189
async beforeModel(transition: Transition) {
1910
await super.beforeModel(transition);
@@ -22,11 +13,4 @@ export default class Home extends Route {
2213
this.transitionTo('dashboard');
2314
}
2415
}
25-
26-
@action
27-
didTransition() {
28-
const shouldShowVersionB = this.features.isEnabled(ABTesting.homePageHeroTextVersionB);
29-
const version = shouldShowVersionB ? 'versionB' : 'versionA';
30-
this.analytics.trackPage(undefined, undefined, undefined, version);
31-
}
3216
}

app/institutions/dashboard/route.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { action } from '@ember/object';
21
import Route from '@ember/routing/route';
32
import RouterService from '@ember/routing/router-service';
43
import { inject as service } from '@ember/service';
@@ -10,7 +9,6 @@ import InstitutionModel from 'ember-osf-web/models/institution';
109
import InstitutionDepartmentModel from 'ember-osf-web/models/institution-department';
1110
import InstitutionSummaryMetricModel from 'ember-osf-web/models/institution-summary-metric';
1211
import { QueryHasManyResult } from 'ember-osf-web/models/osf-model';
13-
import Analytics from 'ember-osf-web/services/analytics';
1412
import captureException from 'ember-osf-web/utils/capture-exception';
1513

1614
export interface InstitutionsDashboardModel {
@@ -19,7 +17,6 @@ export interface InstitutionsDashboardModel {
1917
summaryMetrics: InstitutionSummaryMetricModel;
2018
}
2119
export default class InstitutionsDashboardRoute extends Route {
22-
@service analytics!: Analytics;
2320
@service router!: RouterService;
2421

2522
@task
@@ -57,9 +54,4 @@ export default class InstitutionsDashboardRoute extends Route {
5754
taskInstance: taskFor(this.modelTask).perform(params.institution_id),
5855
};
5956
}
60-
61-
@action
62-
didTransition() {
63-
this.analytics.trackPage();
64-
}
6557
}

0 commit comments

Comments
 (0)