Skip to content

Commit 2018fb2

Browse files
authored
feat: using telemetry tracker in few atomic components (#1129)
* feat: adding user telemetry config and service * feat: adding error handler and a track directive * feat: adding ootb providers * feat: using telemetry in with link components * refactor: using abstract service approach * refactor: updating api for htTrack directive * revert: package-lock.json * revert: revert package.json * revert: revert package.json peer deps * refactor: adding tests and addressing commments * refactor: fix lint errors * refactor: adding packages and modifying code * refactor: adding tracking directive on common components * refactor: fixing tests * revert: package json changes * refactor: adding mixpanel types
1 parent 1e04e81 commit 2018fb2

File tree

17 files changed

+79
-21
lines changed

17 files changed

+79
-21
lines changed

package-lock.json

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"@angular/platform-browser-dynamic": "^12.2.1",
3838
"@angular/router": "^12.2.1",
3939
"@apollo/client": "^3.4.13",
40+
"@fullstory/browser": "^1.4.9",
4041
"@hypertrace/hyperdash": "^1.2.1",
4142
"@hypertrace/hyperdash-angular": "^2.6.0",
4243
"@types/d3-hierarchy": "^2.0.0",
@@ -62,12 +63,11 @@
6263
"graphql-tag": "^2.12.5",
6364
"iso8601-duration": "^1.3.0",
6465
"lodash-es": "^4.17.21",
66+
"mixpanel-browser": "^2.41.0",
6567
"rxjs": "~6.6.7",
6668
"tslib": "^2.3.1",
6769
"uuid": "^8.3.2",
68-
"zone.js": "~0.11.4",
69-
"@fullstory/browser": "^1.4.9",
70-
"mixpanel-browser": "^2.41.0"
70+
"zone.js": "~0.11.4"
7171
},
7272
"devDependencies": {
7373
"@angular-builders/jest": "^11.2.0",
@@ -92,6 +92,7 @@
9292
"@types/d3-zoom": "^1.7.5",
9393
"@types/jest": "^26.0.24",
9494
"@types/lodash-es": "^4.17.4",
95+
"@types/mixpanel-browser": "^2.35.7",
9596
"@types/node": "^16.7.10",
9697
"@types/uuid": "^8.3.1",
9798
"@types/webpack-env": "^1.16.2",

projects/common/src/public-api.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,17 @@ export * from './utilities/rxjs/subscription-lifeycle.service';
9898
export * from './utilities/types/angular-change-object';
9999
export * from './utilities/types/types';
100100

101+
// Telemetry
102+
export * from './telemetry/user-telemetry.module';
103+
export * from './telemetry/track/user-telemetry-tracking.module';
104+
export * from './telemetry/track/track.directive';
105+
export * from './telemetry/user-telemetry.service';
106+
export * from './telemetry/telemetry';
107+
export { FullStoryTelemetry } from './telemetry/providers/fullstory/full-story-provider';
108+
export { FreshPaintTelemetry } from './telemetry/providers/freshpaint/freshpaint-provider';
109+
export { MixPanelTelemetry } from './telemetry/providers/mixpanel/mixpanel-provider';
110+
export { TrackDirective } from './telemetry/track/track.directive';
111+
101112
// Time
102113
export * from './time/fixed-time-range';
103114
export * from './time/interval-duration.service';

projects/common/src/telemetry/providers/freshpaint/load-snippet/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// tslint:disable
22

3-
export const loadFreshPaint = () => {
3+
const loadFreshPaint = () => {
44
if (window.freshpaint) {
55
return window.freshpaint;
66
}
@@ -79,3 +79,7 @@ export const loadFreshPaint = () => {
7979

8080
return freshpaint;
8181
};
82+
83+
module.exports = {
84+
loadFreshPaint
85+
};

projects/common/src/telemetry/providers/google-analytics/load-snippet/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// tslint:disable
22

3-
export const loadGA = () => {
3+
const loadGA = () => {
44
/**
55
* Creates a temporary global ga object and loads analytics.js.
66
* Parameters o, a, and m are all used internally. They could have been
@@ -49,3 +49,7 @@ export const loadGA = () => {
4949

5050
return ga;
5151
};
52+
53+
module.exports = {
54+
loadGA
55+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { CommonModule } from '@angular/common';
2+
import { NgModule } from '@angular/core';
3+
import { TrackDirective } from './track.directive';
4+
5+
@NgModule({
6+
imports: [CommonModule],
7+
declarations: [TrackDirective],
8+
exports: [TrackDirective]
9+
})
10+
export class UserTelemetryTrackingModule {}

projects/common/src/telemetry/user-telemetry-impl.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Injectable, Injector } from '@angular/core';
1+
import { Injectable, Injector, Optional } from '@angular/core';
22
import { NavigationEnd, Router } from '@angular/router';
33
import { filter } from 'rxjs/operators';
44
import { Dictionary } from '../utilities/types/types';
@@ -9,7 +9,7 @@ import { UserTelemetryService } from './user-telemetry.service';
99
export class UserTelemetryImplService extends UserTelemetryService {
1010
private telemetryProviders: UserTelemetryInternalConfig[] = [];
1111

12-
public constructor(private readonly injector: Injector, private readonly router: Router) {
12+
public constructor(private readonly injector: Injector, @Optional() private readonly router?: Router) {
1313
super();
1414
this.setupAutomaticPageTracking();
1515
}
@@ -69,7 +69,7 @@ export class UserTelemetryImplService extends UserTelemetryService {
6969
}
7070

7171
private setupAutomaticPageTracking(): void {
72-
this.router.events
72+
this.router?.events
7373
.pipe(filter((event): event is NavigationEnd => event instanceof NavigationEnd))
7474
.subscribe(route => this.trackPageEvent(`Visited: ${route.url}`, { url: route.url }));
7575
}

projects/common/src/telemetry/user-telemetry.module.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ import { UserTelemetryRegistrationConfig } from './telemetry';
44
import { UserTelemetryImplService } from './user-telemetry-impl.service';
55
import { UserTelemetryService } from './user-telemetry.service';
66

7+
const USER_TELEMETRY_PROVIDER_TOKENS = new InjectionToken<UserTelemetryRegistrationConfig<unknown>[][]>(
8+
'USER_TELEMETRY_PROVIDER_TOKENS'
9+
);
10+
711
@NgModule()
12+
// tslint:disable:no-unnecessary-class
813
export class UserTelemetryModule {
914
public constructor(
1015
@Inject(USER_TELEMETRY_PROVIDER_TOKENS) providerConfigs: UserTelemetryRegistrationConfig<unknown>[][],
@@ -35,7 +40,3 @@ export class UserTelemetryModule {
3540
};
3641
}
3742
}
38-
39-
const USER_TELEMETRY_PROVIDER_TOKENS = new InjectionToken<UserTelemetryRegistrationConfig<unknown>[][]>(
40-
'USER_TELEMETRY_PROVIDER_TOKENS'
41-
);

projects/components/src/breadcrumbs/breadcrumbs.component.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { HttpClientTestingModule } from '@angular/common/http/testing';
2+
import { RouterTestingModule } from '@angular/router/testing';
23
import { IconLibraryTestingModule } from '@hypertrace/assets-library';
3-
import { NavigationService } from '@hypertrace/common';
4+
import { NavigationService, TrackDirective } from '@hypertrace/common';
45
import { byText, createHostFactory, mockProvider, Spectator } from '@ngneat/spectator/jest';
6+
import { MockDirective } from 'ng-mocks';
57
import { EMPTY } from 'rxjs';
68
import { BreadcrumbsComponent } from './breadcrumbs.component';
79
import { BreadcrumbsModule } from './breadcrumbs.module';
@@ -13,7 +15,8 @@ describe('BreadcrumbsComponent', () => {
1315
const createHost = createHostFactory({
1416
declareComponent: false,
1517
component: BreadcrumbsComponent,
16-
imports: [BreadcrumbsModule, HttpClientTestingModule, IconLibraryTestingModule],
18+
imports: [BreadcrumbsModule, HttpClientTestingModule, IconLibraryTestingModule, RouterTestingModule],
19+
declarations: [MockDirective(TrackDirective)],
1720
providers: [
1821
mockProvider(NavigationService, {
1922
navigation$: EMPTY,

projects/components/src/breadcrumbs/breadcrumbs.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { IconSize } from '../icon/icon-size';
1515
[ngClass]="{ navigable: breadcrumb.url !== undefined }"
1616
*ngFor="let breadcrumb of this.breadcrumbs; last as isLast; first as isFirst"
1717
[htTooltip]="this.tooltipMap.get(breadcrumb)"
18+
[htTrack]
19+
[htTrackLabel]="breadcrumb.label"
1820
>
1921
<ht-icon
2022
class="icon"

0 commit comments

Comments
 (0)