Skip to content

Commit 0936a10

Browse files
committed
feat: enrich datadog user recordings attributes
1 parent a509ace commit 0936a10

File tree

11 files changed

+95
-20
lines changed

11 files changed

+95
-20
lines changed

src/components/organisms/deployments/sessions/table/table.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,13 @@ import { PopoverListItem } from "@src/interfaces/components/popover.interface";
1515
import { Session, SessionStateKeyType } from "@src/interfaces/models";
1616
import { useCacheStore, useModalStore, useSharedBetweenProjectsStore, useToastStore } from "@src/store";
1717
import { SessionStatsFilterType } from "@src/types/components";
18-
import { calculateDeploymentSessionsStats, getShortId, initialSessionCounts } from "@src/utilities";
19-
import { ClarityUtils } from "@src/utilities/clarity.utils";
18+
import {
19+
calculateDeploymentSessionsStats,
20+
getShortId,
21+
initialSessionCounts,
22+
ClarityUtils,
23+
DatadogUtils,
24+
} from "@src/utilities";
2025

2126
import { Frame, IconSvg, Loader, ResizeButton, THead, Table, Th, Tr } from "@components/atoms";
2227
import { RefreshButton } from "@components/molecules";
@@ -137,6 +142,7 @@ export const SessionsTable = () => {
137142

138143
if (deploymentId) {
139144
ClarityUtils.setDeploymentId(deploymentId);
145+
DatadogUtils.setDeploymentId(deploymentId);
140146
}
141147
const deploymentStats = calculateDeploymentSessionsStats([deployment]);
142148
if (isEqual(deploymentStats.sessionStats, sessionStats.sessionStats)) return;

src/components/organisms/deployments/sessions/viewer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ import { EventListenerName, SessionState } from "@src/enums";
2222
import { triggerEvent, useEventListener } from "@src/hooks";
2323
import { ViewerSession } from "@src/interfaces/models/session.interface";
2424
import { useActivitiesCacheStore, useOutputsCacheStore, useToastStore } from "@src/store";
25-
import { copyToClipboard } from "@src/utilities";
26-
import { ClarityUtils } from "@src/utilities/clarity.utils";
25+
import { copyToClipboard, ClarityUtils, DatadogUtils } from "@src/utilities";
2726

2827
import { Button, Frame, IconSvg, Loader, LogoCatLarge, Tab, Tooltip } from "@components/atoms";
2928
import { Accordion, IdCopyButton, ValueRenderer } from "@components/molecules";
@@ -127,6 +126,7 @@ export const SessionViewer = () => {
127126
fetchSessionInfo();
128127
if (sessionId) {
129128
ClarityUtils.setSessionId(sessionId);
129+
DatadogUtils.setSessionId(sessionId);
130130
}
131131
// eslint-disable-next-line react-hooks/exhaustive-deps
132132
}, [sessionId]);

src/components/organisms/topbar/project/buttons.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ import {
1717
useToastStore,
1818
useTourStore,
1919
} from "@src/store";
20-
import { validateEntitiesName } from "@src/utilities";
21-
import { ClarityUtils } from "@utilities/clarity.utils";
20+
import { validateEntitiesName, ClarityUtils, DatadogUtils } from "@src/utilities";
2221

2322
import { Button, IconSvg, Loader, Spinner } from "@components/atoms";
2423
import { DropdownButton } from "@components/molecules";
@@ -210,6 +209,10 @@ export const ProjectTopbarButtons = () => {
210209
projectId,
211210
buildId,
212211
});
212+
DatadogUtils.trackEvent("project_validated", {
213+
projectId,
214+
buildId,
215+
});
213216
}
214217
} finally {
215218
setActionInProcess(ProjectActions.build, false);
@@ -266,6 +269,10 @@ export const ProjectTopbarButtons = () => {
266269
deploymentId,
267270
projectId,
268271
});
272+
DatadogUtils.trackEvent("deployment_created", {
273+
deploymentId,
274+
projectId,
275+
});
269276
}
270277
} finally {
271278
setActionInProcess(ProjectActions.deploy, false);

src/components/organisms/topbar/project/manualRun/manualRunButtons.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { namespaces, ProjectActions, tourStepsHTMLIds } from "@src/constants";
99
import { emptySelectItem } from "@src/constants/forms";
1010
import { DrawerName } from "@src/enums/components";
1111
import { useCacheStore, useDrawerStore, useManualRunStore, useProjectStore, useToastStore } from "@src/store/";
12-
import { ClarityUtils } from "@utilities/clarity.utils";
12+
import { ClarityUtils, DatadogUtils } from "@utilities";
1313

1414
import { Button, IconSvg, Spinner } from "@components/atoms";
1515
import { ManualRunSuccessToastMessage } from "@components/organisms/topbar/project";
@@ -83,6 +83,12 @@ export const ManualRunButtons = () => {
8383
deploymentId: activeDeploymentStore?.deploymentId,
8484
entrypoint: entrypointFunction?.value,
8585
});
86+
DatadogUtils.trackEvent("manual_run_executed", {
87+
sessionId,
88+
projectId,
89+
deploymentId: activeDeploymentStore?.deploymentId,
90+
entrypoint: entrypointFunction?.value,
91+
});
8692
}
8793

8894
setTimeout(() => {

src/components/pages/project.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
useSharedBetweenProjectsStore,
1616
useTourStore,
1717
} from "@src/store";
18-
import { ClarityUtils, calculatePathDepth, cn } from "@src/utilities";
18+
import { ClarityUtils, DatadogUtils, calculatePathDepth, cn } from "@src/utilities";
1919

2020
import { IconButton, IconSvg, PageTitle, Tab } from "@components/atoms";
2121
import { PopoverTrigger } from "@components/molecules";
@@ -73,6 +73,7 @@ export const Project = () => {
7373
}
7474
if (project) {
7575
ClarityUtils.setProject(project.id, project);
76+
DatadogUtils.setProject(project.id, project);
7677
}
7778
setPageTitle(t("template", { page: project!.name }));
7879
};

src/hooks/useEvent.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { DeploymentStateVariant } from "@src/enums";
99
import { SelectOption } from "@src/interfaces/components";
1010
import { useProjectStore } from "@src/store";
1111
import { EnrichedEvent } from "@src/types/models";
12-
import { ClarityUtils } from "@src/utilities/clarity.utils";
12+
import { ClarityUtils, DatadogUtils } from "@utilities";
1313

1414
export const useEvent = (eventId?: string) => {
1515
const { t: tErrors } = useTranslation("errors");
@@ -101,6 +101,7 @@ export const useEvent = (eventId?: string) => {
101101
setIsLoading(false);
102102
if (eventId) {
103103
ClarityUtils.setEventId(eventId);
104+
DatadogUtils.setEventId(eventId);
104105
}
105106
// eslint-disable-next-line react-hooks/exhaustive-deps
106107
}, [eventId]);

src/hooks/useProjectActions.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ import { ModalName } from "@src/enums/components";
1616
import { fileOperations } from "@src/factories";
1717
import { Manifest } from "@src/interfaces/models";
1818
import { FileStructure } from "@src/interfaces/utilities";
19-
import { unpackFileZip } from "@src/utilities";
20-
import { ClarityUtils } from "@utilities/clarity.utils";
19+
import { unpackFileZip, ClarityUtils, DatadogUtils } from "@src/utilities";
2120

2221
import { useConnectionStore, useModalStore, useProjectStore, useToastStore } from "@store";
2322

@@ -70,6 +69,10 @@ export const useProjectActions = () => {
7069
projectId,
7170
projectName: name,
7271
});
72+
DatadogUtils.trackEvent("project_created", {
73+
projectId,
74+
projectName: name,
75+
});
7376
}
7477

7578
navigate(`/projects/${projectId}/code`, {

src/mainApp.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import React, { useEffect } from "react";
22

3-
import { datadogRum } from "@datadog/browser-rum";
43
import { BrowserRouter } from "react-router-dom";
54

65
import "@utilities/getApiBaseUrl.utils";
76

87
import { App } from "./app";
98
import { descopeProjectId } from "@constants";
109
import { VersionService } from "@services";
10+
import { DatadogUtils } from "@utilities";
1111

1212
import { useOrganizationStore } from "@store";
1313

@@ -24,18 +24,13 @@ export const MainApp = () => {
2424

2525
useEffect(() => {
2626
if (user?.id) {
27-
datadogRum.setUser({
28-
id: user.id,
29-
email: user.email,
30-
name: user.name,
31-
});
27+
DatadogUtils.setUser(user.id, user);
3228
}
3329
}, [user]);
3430

3531
useEffect(() => {
3632
if (currentOrganization?.id) {
37-
datadogRum.setGlobalContextProperty("organization.id", currentOrganization.id);
38-
datadogRum.setGlobalContextProperty("organization.name", currentOrganization.displayName);
33+
DatadogUtils.setOrg(currentOrganization.id, currentOrganization);
3934
}
4035
}, [currentOrganization]);
4136

src/store/useOrganizationStore.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { AuthService, BillingService, LoggerService, OrganizationsService, Users
1010
import { namespaces, cookieRefreshInterval } from "@src/constants";
1111
import { EnrichedMember, EnrichedOrganization, Organization, User } from "@src/types/models";
1212
import { OrganizationStore, OrganizationStoreState } from "@src/types/stores";
13-
import { requiresRefresh, retryAsyncOperation, ClarityUtils } from "@src/utilities";
13+
import { requiresRefresh, retryAsyncOperation, ClarityUtils, DatadogUtils } from "@src/utilities";
1414

1515
const defaultState: OrganizationStoreState = {
1616
organizations: {},
@@ -643,6 +643,7 @@ const store: StateCreator<OrganizationStore> = (set, get) => ({
643643
}
644644

645645
ClarityUtils.setPlanType(userUsage.data.plan);
646+
DatadogUtils.setPlanType(userUsage.data.plan);
646647

647648
const { error: errorEnrichedOrganization } = await get().getEnrichedOrganizations(true);
648649

src/utilities/datadog.utils.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { datadogRum } from "@datadog/browser-rum";
2+
3+
import { Organization, Project, User } from "@src/types/models";
4+
5+
export const DatadogUtils = {
6+
setUser: (userId: string, userInfo: User) => {
7+
datadogRum.setUser({
8+
id: userId,
9+
email: userInfo.email,
10+
name: userInfo.name,
11+
});
12+
datadogRum.setGlobalContextProperty("user.id", userId);
13+
datadogRum.setGlobalContextProperty("user.email", userInfo.email);
14+
datadogRum.setGlobalContextProperty("user.name", userInfo.name);
15+
},
16+
17+
setOrg: (orgId: string, orgInfo: Organization) => {
18+
datadogRum.setGlobalContextProperty("organization.id", orgId);
19+
datadogRum.setGlobalContextProperty("organization.name", orgInfo.displayName);
20+
datadogRum.setGlobalContextProperty("organization.uniqueName", orgInfo.uniqueName);
21+
},
22+
23+
setProject: (projectId: string, projectInfo: Project) => {
24+
datadogRum.setGlobalContextProperty("project.id", projectId);
25+
datadogRum.setGlobalContextProperty("project.name", projectInfo.name);
26+
if (projectInfo.organizationId) {
27+
datadogRum.setGlobalContextProperty("project.organizationId", projectInfo.organizationId);
28+
}
29+
},
30+
31+
setUserRole: (role: string) => {
32+
datadogRum.setGlobalContextProperty("user.role", role);
33+
},
34+
35+
setPlanType: (planType: string) => {
36+
datadogRum.setGlobalContextProperty("billing.planType", planType);
37+
},
38+
39+
setDeploymentId: (deploymentId: string) => {
40+
datadogRum.setGlobalContextProperty("deployment.id", deploymentId);
41+
},
42+
43+
trackEvent: (eventName: string, properties?: Record<string, any>) => {
44+
datadogRum.addAction(eventName, properties);
45+
},
46+
47+
setSessionId: (sessionId: string) => {
48+
datadogRum.setGlobalContextProperty("session.id", sessionId);
49+
},
50+
51+
setEventId: (eventId: string) => {
52+
datadogRum.setGlobalContextProperty("event.id", eventId);
53+
},
54+
};

0 commit comments

Comments
 (0)