@crimson-education/browser-logger 5.0.3 → 5.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/lib/reporters/analyticsNoise.d.ts +2 -0
- package/lib/reporters/analyticsNoise.d.ts.map +1 -0
- package/lib/reporters/analyticsNoise.js +13 -0
- package/lib/reporters/analyticsNoise.js.map +1 -0
- package/lib/reporters/datadogReporter.d.ts +10 -0
- package/lib/reporters/datadogReporter.d.ts.map +1 -1
- package/lib/reporters/datadogReporter.js +99 -36
- package/lib/reporters/datadogReporter.js.map +1 -1
- package/lib/reporters/datadogReporter.test.d.ts +2 -0
- package/lib/reporters/datadogReporter.test.d.ts.map +1 -0
- package/lib/reporters/datadogReporter.test.js +163 -0
- package/lib/reporters/datadogReporter.test.js.map +1 -0
- package/lib/reporters/posthogReporter.d.ts.map +1 -1
- package/lib/reporters/posthogReporter.js +26 -3
- package/lib/reporters/posthogReporter.js.map +1 -1
- package/lib/reporters/posthogReporter.test.js +116 -0
- package/lib/reporters/posthogReporter.test.js.map +1 -1
- package/lib/types/reporter.d.ts +5 -0
- package/lib/types/reporter.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/reporters/analyticsNoise.ts +15 -0
- package/src/reporters/datadogReporter.test.ts +229 -0
- package/src/reporters/datadogReporter.ts +117 -44
- package/src/reporters/posthogReporter.test.ts +154 -0
- package/src/reporters/posthogReporter.ts +31 -4
- package/src/types/reporter.ts +6 -0
package/README.md
CHANGED
|
@@ -260,6 +260,28 @@ Check out the [`DatadogReporterConfig`](https://github.com/crimson-education/bro
|
|
|
260
260
|
|
|
261
261
|
This automatically adds a Datadog Log Transport that transmits Log data to Datadog, this can be customized in `DatadogReporterConfig` with `logTransport`, or disabled by setting `logTransport` to `false`.
|
|
262
262
|
|
|
263
|
+
If you need to keep browser logs while disabling RUM, or vice versa, use the independent Datadog switches:
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
Logger.init({
|
|
267
|
+
reporters: {
|
|
268
|
+
datadog: {
|
|
269
|
+
applicationId: config.datadogApplicationId,
|
|
270
|
+
clientToken: config.datadogClientToken,
|
|
271
|
+
site: config.datadogSite,
|
|
272
|
+
logsEnabled: true,
|
|
273
|
+
rumEnabled: false,
|
|
274
|
+
logTransport: {
|
|
275
|
+
level: Logger.LogLevel.Info,
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
`logsEnabled` only affects Datadog Browser Logs and the Datadog log transport. `rumEnabled` only affects Datadog Browser
|
|
283
|
+
RUM, browser actions, view tracking, error reporting, and replay controls.
|
|
284
|
+
|
|
263
285
|
#### PostHog
|
|
264
286
|
|
|
265
287
|
To configure PostHog, this requires at least `apiKey` and `apiHost`.
|
|
@@ -284,6 +306,39 @@ Logger.init({
|
|
|
284
306
|
`replaySampleRate` is provided as a compatibility alias for existing Datadog-style config. Values less than or equal to `0` disable session recording at startup, while `Logger.recordSession()` can still enable replay later for allowlisted users.
|
|
285
307
|
|
|
286
308
|
When multiple repos write into the same PostHog project, prefer setting `application` at `Logger.init(...)`. This ensures a stable product-level dimension is present on all events independently of each app's `service` name.
|
|
309
|
+
|
|
310
|
+
#### Filtering technical analytics noise
|
|
311
|
+
|
|
312
|
+
`Logger.trackEvent()` still fans out to every enabled reporter. If a repo wants to keep technical log noise in the log
|
|
313
|
+
reporter while excluding it from Datadog RUM or PostHog, configure `ignoreTrackEventPatterns` explicitly in that
|
|
314
|
+
reporter.
|
|
315
|
+
|
|
316
|
+
Example:
|
|
317
|
+
|
|
318
|
+
```ts
|
|
319
|
+
Logger.init({
|
|
320
|
+
reporters: {
|
|
321
|
+
datadog: {
|
|
322
|
+
applicationId: config.datadogApplicationId,
|
|
323
|
+
clientToken: config.datadogClientToken,
|
|
324
|
+
site: config.datadogSite,
|
|
325
|
+
ignoreTrackEventPatterns: [
|
|
326
|
+
'TIM_LOGIN_SUCCESS',
|
|
327
|
+
/^TIM_MESSAGE_RECEIVED:/,
|
|
328
|
+
/^feedback fetch (triggered|deduped inflight|skipped ttl|success)$/,
|
|
329
|
+
],
|
|
330
|
+
},
|
|
331
|
+
posthog: {
|
|
332
|
+
apiKey: config.posthogApiKey,
|
|
333
|
+
apiHost: config.posthogApiHost,
|
|
334
|
+
ignoreTrackEventPatterns: [
|
|
335
|
+
'TIM_LOGIN_SUCCESS',
|
|
336
|
+
/^TIM_MESSAGE_RECEIVED:/,
|
|
337
|
+
],
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
```
|
|
287
342
|
#### Google Tag Manager
|
|
288
343
|
|
|
289
344
|
To configure GTM, you will need to have loaded the GTM script into your App.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyticsNoise.d.ts","sourceRoot":"","sources":["../../src/reporters/analyticsNoise.ts"],"names":[],"mappings":"AAQA,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAMrG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function patternMatches(message, pattern) {
|
|
2
|
+
if (typeof pattern === 'string') {
|
|
3
|
+
return message === pattern;
|
|
4
|
+
}
|
|
5
|
+
return pattern.test(message);
|
|
6
|
+
}
|
|
7
|
+
export function shouldSuppressAnalyticsEvent(message, patterns) {
|
|
8
|
+
if (!patterns?.length) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return patterns.some((pattern) => patternMatches(message, pattern));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=analyticsNoise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyticsNoise.js","sourceRoot":"","sources":["../../src/reporters/analyticsNoise.ts"],"names":[],"mappings":"AAAA,SAAS,cAAc,CAAC,OAAe,EAAE,OAAwB;IAC/D,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,OAAO,OAAO,KAAK,OAAO,CAAC;KAC5B;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAe,EAAE,QAA8B;IAC1F,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;QACrB,OAAO,KAAK,CAAC;KACd;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -4,6 +4,16 @@ import { LogsInitConfiguration } from '@datadog/browser-logs';
|
|
|
4
4
|
import { DefaultPrivacyLevel, RumInitConfiguration } from '@datadog/browser-rum';
|
|
5
5
|
import { DatadogLogTransportConfig } from '../logger/datadogTransport';
|
|
6
6
|
export interface DatadogReporterConfig extends ReporterConfigBase {
|
|
7
|
+
/**
|
|
8
|
+
* Enable Datadog Browser Logs initialization and log transport wiring.
|
|
9
|
+
* Defaults to true.
|
|
10
|
+
*/
|
|
11
|
+
logsEnabled?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Enable Datadog Browser RUM initialization.
|
|
14
|
+
* Defaults to true.
|
|
15
|
+
*/
|
|
16
|
+
rumEnabled?: boolean;
|
|
7
17
|
/** The RUM application ID. */
|
|
8
18
|
applicationId: string;
|
|
9
19
|
/** A Datadog client token (Generated in the RUM Page) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadogReporter.d.ts","sourceRoot":"","sources":["../../src/reporters/datadogReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAMT,WAAW,EACX,kBAAkB,EAEnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAA4B,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAc,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE7F,OAAO,EAAE,yBAAyB,EAAoB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"datadogReporter.d.ts","sourceRoot":"","sources":["../../src/reporters/datadogReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAMT,WAAW,EACX,kBAAkB,EAEnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAA4B,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAc,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE7F,OAAO,EAAE,yBAAyB,EAAoB,MAAM,4BAA4B,CAAC;AA4FzF,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;;OAIG;IACH,oCAAoC,CAAC,EAAE,OAAO,CAAC;IAE/C;;OAEG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAEhD;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;IACnD;;OAEG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAErD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C;;OAEG;IACH,sBAAsB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACzC;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,qBAAqB,GAAG,SAAS,CAqM3F"}
|
|
@@ -2,6 +2,7 @@ import { datadogLogs, HandlerType } from '@datadog/browser-logs';
|
|
|
2
2
|
import { datadogRum } from '@datadog/browser-rum';
|
|
3
3
|
import { logTransports } from '../logger';
|
|
4
4
|
import { datadogTransport } from '../logger/datadogTransport';
|
|
5
|
+
import { shouldSuppressAnalyticsEvent } from './analyticsNoise';
|
|
5
6
|
// User frustration detection for Datadog Gen2
|
|
6
7
|
class DatadogFrustrationDetector {
|
|
7
8
|
config;
|
|
@@ -81,12 +82,14 @@ class DatadogFrustrationDetector {
|
|
|
81
82
|
}
|
|
82
83
|
export function datadogReporter(info, config) {
|
|
83
84
|
const isLocalhost = window.location.hostname === 'localhost';
|
|
85
|
+
const logsEnabled = config.logsEnabled ?? true;
|
|
86
|
+
const rumEnabled = config.rumEnabled ?? true;
|
|
84
87
|
// Don't forward error logs by default, do enable the log transport by default
|
|
85
88
|
// forwardErrorsToLogs incorrectly is called forwardConsoleLogs, this is for backwards compatibility
|
|
86
89
|
const forwardErrorsToLogs = config.forwardConsoleLogs ?? false;
|
|
87
90
|
const enableLogTransport = config.logTransport !== false;
|
|
88
91
|
// Only init datadog logs if something is using it.
|
|
89
|
-
if (forwardErrorsToLogs === true || enableLogTransport === true) {
|
|
92
|
+
if (logsEnabled && (forwardErrorsToLogs === true || enableLogTransport === true)) {
|
|
90
93
|
datadogLogs.init({
|
|
91
94
|
site: config.site,
|
|
92
95
|
clientToken: config.clientToken,
|
|
@@ -104,37 +107,57 @@ export function datadogReporter(info, config) {
|
|
|
104
107
|
datadogLogs.logger.setHandler(HandlerType.http);
|
|
105
108
|
}
|
|
106
109
|
// Add the datadog log transport
|
|
107
|
-
if (enableLogTransport) {
|
|
110
|
+
if (logsEnabled && enableLogTransport) {
|
|
108
111
|
logTransports.push(datadogTransport(typeof config.logTransport === 'boolean' ? {} : config.logTransport));
|
|
109
112
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
113
|
+
if (rumEnabled) {
|
|
114
|
+
datadogRum.init({
|
|
115
|
+
enableExperimentalFeatures: ['feature_flags'],
|
|
116
|
+
site: config.site,
|
|
117
|
+
clientToken: config.clientToken,
|
|
118
|
+
applicationId: config.applicationId,
|
|
119
|
+
service: info.service,
|
|
120
|
+
env: info.environment,
|
|
121
|
+
version: config.version ?? info.version,
|
|
122
|
+
usePartitionedCrossSiteSessionCookie: config.usePartitionedCrossSiteSessionCookie,
|
|
123
|
+
// Use correct Datadog v6 SDK options
|
|
124
|
+
sessionSampleRate: config.sessionSampleRate ?? config.rumSampleRate ?? config.sampleRate ?? 100,
|
|
125
|
+
sessionReplaySampleRate: config.sessionReplaySampleRate ?? config.replaySampleRate ?? 100,
|
|
126
|
+
// Track interactions (Note: trackFrustrations is not available in Datadog v6)
|
|
127
|
+
trackUserInteractions: config.trackUserInteractions ?? config.trackInteractions ?? false,
|
|
128
|
+
useSecureSessionCookie: config.useSecureSessionCookie ?? !isLocalhost,
|
|
129
|
+
// Note: useCrossSiteSessionCookie is not available in newer Datadog versions
|
|
130
|
+
trackSessionAcrossSubdomains: config.trackSessionAcrossSubdomains,
|
|
131
|
+
trackViewsManually: config.trackViewsManually ?? false,
|
|
132
|
+
actionNameAttribute: config.actionNameAttribute ?? 'data-analytics-name',
|
|
133
|
+
beforeSend: config.beforeSend,
|
|
134
|
+
defaultPrivacyLevel: config.defaultPrivacyLevel ?? 'mask-user-input',
|
|
135
|
+
allowedTracingUrls: config.allowedTracingUrls ?? config.allowedTrackingOrigins,
|
|
136
|
+
excludedActivityUrls: config.excludedActivityUrls,
|
|
137
|
+
});
|
|
138
|
+
// Initialize frustration detector
|
|
139
|
+
new DatadogFrustrationDetector(config);
|
|
140
|
+
}
|
|
141
|
+
function normalizeErrorForLogs(error) {
|
|
142
|
+
if (error instanceof Error) {
|
|
143
|
+
return {
|
|
144
|
+
message: error.message,
|
|
145
|
+
name: error.name,
|
|
146
|
+
stack: error.stack,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
message: String(error),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
136
153
|
const reporter = {
|
|
137
154
|
trackEvent: function (event) {
|
|
155
|
+
if (!rumEnabled) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (shouldSuppressAnalyticsEvent(event.message, config.ignoreTrackEventPatterns)) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
138
161
|
datadogRum.addAction(event.message, {
|
|
139
162
|
level: event.level,
|
|
140
163
|
...event.metadata,
|
|
@@ -143,6 +166,9 @@ export function datadogReporter(info, config) {
|
|
|
143
166
|
});
|
|
144
167
|
},
|
|
145
168
|
addBreadcrumb: function (breadcrumb) {
|
|
169
|
+
if (!rumEnabled) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
146
172
|
datadogRum.addAction(breadcrumb.message, {
|
|
147
173
|
...breadcrumb.metadata,
|
|
148
174
|
category: breadcrumb.category,
|
|
@@ -151,19 +177,30 @@ export function datadogReporter(info, config) {
|
|
|
151
177
|
addMetadata: function (metadata) {
|
|
152
178
|
for (const [key, value] of Object.entries(metadata)) {
|
|
153
179
|
if (value !== null) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
180
|
+
if (rumEnabled) {
|
|
181
|
+
datadogRum.setGlobalContextProperty(key, value);
|
|
182
|
+
}
|
|
183
|
+
if (logsEnabled) {
|
|
184
|
+
// Note, this will add duplicate context data in logs.
|
|
185
|
+
// But this is valuable for logs ingested outside of the browser logger.
|
|
186
|
+
datadogLogs.setGlobalContextProperty(key, value);
|
|
187
|
+
}
|
|
158
188
|
}
|
|
159
189
|
else {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
190
|
+
if (rumEnabled) {
|
|
191
|
+
datadogRum.removeGlobalContextProperty(key);
|
|
192
|
+
}
|
|
193
|
+
if (logsEnabled) {
|
|
194
|
+
// But this is valuable for logs ingested outside of the browser logger.
|
|
195
|
+
datadogLogs.removeGlobalContextProperty(key);
|
|
196
|
+
}
|
|
163
197
|
}
|
|
164
198
|
}
|
|
165
199
|
},
|
|
166
200
|
setUser: function (user) {
|
|
201
|
+
if (!rumEnabled) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
167
204
|
if (user) {
|
|
168
205
|
datadogRum.setUser({
|
|
169
206
|
...user,
|
|
@@ -177,9 +214,15 @@ export function datadogReporter(info, config) {
|
|
|
177
214
|
}
|
|
178
215
|
},
|
|
179
216
|
setRouteName: function (routeName) {
|
|
217
|
+
if (!rumEnabled) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
180
220
|
reporter.addMetadata({ routeName });
|
|
181
221
|
},
|
|
182
222
|
setPageName: function (pageName) {
|
|
223
|
+
if (!rumEnabled) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
183
226
|
if (config.trackViewsManually) {
|
|
184
227
|
datadogRum.startView(pageName);
|
|
185
228
|
}
|
|
@@ -188,15 +231,35 @@ export function datadogReporter(info, config) {
|
|
|
188
231
|
}
|
|
189
232
|
},
|
|
190
233
|
reportError: function (error, metadata) {
|
|
191
|
-
|
|
234
|
+
if (rumEnabled) {
|
|
235
|
+
datadogRum.addError(error, metadata);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (logsEnabled) {
|
|
239
|
+
const normalized = normalizeErrorForLogs(error);
|
|
240
|
+
datadogLogs.logger.error(normalized.message, {
|
|
241
|
+
...metadata,
|
|
242
|
+
errorName: normalized.name,
|
|
243
|
+
errorStack: normalized.stack,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
192
246
|
},
|
|
193
247
|
reportFeatureFlag: function (flag) {
|
|
248
|
+
if (!rumEnabled) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
194
251
|
datadogRum.addFeatureFlagEvaluation(flag.name, flag.value);
|
|
195
252
|
},
|
|
196
253
|
recordSession: function () {
|
|
254
|
+
if (!rumEnabled) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
197
257
|
datadogRum.startSessionReplayRecording();
|
|
198
258
|
},
|
|
199
259
|
recordSessionStop: function () {
|
|
260
|
+
if (!rumEnabled) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
200
263
|
datadogRum.stopSessionReplayRecording();
|
|
201
264
|
},
|
|
202
265
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadogReporter.js","sourceRoot":"","sources":["../../src/reporters/datadogReporter.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAyB,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,UAAU,EAA6C,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAA6B,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"datadogReporter.js","sourceRoot":"","sources":["../../src/reporters/datadogReporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datadogReporter.test.d.ts","sourceRoot":"","sources":["../../src/reporters/datadogReporter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
jest.mock('@datadog/browser-rum', () => ({
|
|
2
|
+
__esModule: true,
|
|
3
|
+
datadogRum: {
|
|
4
|
+
init: jest.fn(),
|
|
5
|
+
addAction: jest.fn(),
|
|
6
|
+
setGlobalContextProperty: jest.fn(),
|
|
7
|
+
removeGlobalContextProperty: jest.fn(),
|
|
8
|
+
setUser: jest.fn(),
|
|
9
|
+
startView: jest.fn(),
|
|
10
|
+
addError: jest.fn(),
|
|
11
|
+
addFeatureFlagEvaluation: jest.fn(),
|
|
12
|
+
startSessionReplayRecording: jest.fn(),
|
|
13
|
+
stopSessionReplayRecording: jest.fn(),
|
|
14
|
+
},
|
|
15
|
+
DefaultPrivacyLevel: {},
|
|
16
|
+
}));
|
|
17
|
+
jest.mock('@datadog/browser-logs', () => ({
|
|
18
|
+
__esModule: true,
|
|
19
|
+
HandlerType: {
|
|
20
|
+
http: 'http',
|
|
21
|
+
},
|
|
22
|
+
datadogLogs: {
|
|
23
|
+
init: jest.fn(),
|
|
24
|
+
setGlobalContextProperty: jest.fn(),
|
|
25
|
+
removeGlobalContextProperty: jest.fn(),
|
|
26
|
+
logger: {
|
|
27
|
+
setHandler: jest.fn(),
|
|
28
|
+
debug: jest.fn(),
|
|
29
|
+
info: jest.fn(),
|
|
30
|
+
warn: jest.fn(),
|
|
31
|
+
error: jest.fn(),
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
}));
|
|
35
|
+
jest.mock('../logger/datadogTransport', () => ({
|
|
36
|
+
__esModule: true,
|
|
37
|
+
datadogTransport: jest.fn(() => ({ log: jest.fn() })),
|
|
38
|
+
}));
|
|
39
|
+
import { datadogLogs } from '@datadog/browser-logs';
|
|
40
|
+
import { datadogRum } from '@datadog/browser-rum';
|
|
41
|
+
import { LogLevel } from '../types';
|
|
42
|
+
import { datadogReporter } from './datadogReporter';
|
|
43
|
+
const datadogLogsMock = datadogLogs;
|
|
44
|
+
const datadogRumMock = datadogRum;
|
|
45
|
+
describe('datadogReporter', () => {
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
jest.clearAllMocks();
|
|
48
|
+
Object.defineProperty(globalThis, 'window', {
|
|
49
|
+
configurable: true,
|
|
50
|
+
value: {
|
|
51
|
+
location: {
|
|
52
|
+
hostname: 'app.crimsoneducation.org',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it('can initialize logs without rum', () => {
|
|
58
|
+
const reporter = datadogReporter({
|
|
59
|
+
service: 'crimson-app-frontend',
|
|
60
|
+
application: 'crimson-app',
|
|
61
|
+
environment: 'production',
|
|
62
|
+
version: '1.2.3',
|
|
63
|
+
}, {
|
|
64
|
+
applicationId: 'app-id',
|
|
65
|
+
clientToken: 'client-token',
|
|
66
|
+
site: 'datadoghq.eu',
|
|
67
|
+
rumEnabled: false,
|
|
68
|
+
logsEnabled: true,
|
|
69
|
+
});
|
|
70
|
+
expect(datadogLogsMock.init).toHaveBeenCalled();
|
|
71
|
+
expect(datadogRumMock.init).not.toHaveBeenCalled();
|
|
72
|
+
reporter.addMetadata({
|
|
73
|
+
namespace: 'production',
|
|
74
|
+
clearMe: null,
|
|
75
|
+
});
|
|
76
|
+
expect(datadogLogsMock.setGlobalContextProperty).toHaveBeenCalledWith('namespace', 'production');
|
|
77
|
+
expect(datadogLogsMock.removeGlobalContextProperty).toHaveBeenCalledWith('clearMe');
|
|
78
|
+
expect(datadogRumMock.setGlobalContextProperty).not.toHaveBeenCalled();
|
|
79
|
+
reporter.reportError?.(new Error('broken'), {
|
|
80
|
+
routeName: 'messages',
|
|
81
|
+
});
|
|
82
|
+
expect(datadogLogsMock.logger.error).toHaveBeenCalledWith('broken', expect.objectContaining({
|
|
83
|
+
routeName: 'messages',
|
|
84
|
+
errorName: 'Error',
|
|
85
|
+
errorStack: expect.any(String),
|
|
86
|
+
}));
|
|
87
|
+
expect(datadogRumMock.addError).not.toHaveBeenCalled();
|
|
88
|
+
});
|
|
89
|
+
it('can initialize rum without logs', () => {
|
|
90
|
+
const reporter = datadogReporter({
|
|
91
|
+
service: 'student-center-frontend',
|
|
92
|
+
application: 'core-student-center',
|
|
93
|
+
environment: 'production',
|
|
94
|
+
version: '2.0.0',
|
|
95
|
+
}, {
|
|
96
|
+
applicationId: 'app-id',
|
|
97
|
+
clientToken: 'client-token',
|
|
98
|
+
site: 'datadoghq.eu',
|
|
99
|
+
rumEnabled: true,
|
|
100
|
+
logsEnabled: false,
|
|
101
|
+
});
|
|
102
|
+
expect(datadogRumMock.init).toHaveBeenCalled();
|
|
103
|
+
expect(datadogLogsMock.init).not.toHaveBeenCalled();
|
|
104
|
+
reporter.trackEvent({
|
|
105
|
+
message: 'message-sent',
|
|
106
|
+
metadata: {
|
|
107
|
+
userId: '123',
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
expect(datadogRumMock.addAction).toHaveBeenCalledWith('message-sent', expect.objectContaining({ userId: '123' }));
|
|
111
|
+
reporter.reportError?.(new Error('broken'));
|
|
112
|
+
expect(datadogRumMock.addError).toHaveBeenCalled();
|
|
113
|
+
expect(datadogLogsMock.logger.error).not.toHaveBeenCalled();
|
|
114
|
+
});
|
|
115
|
+
it('suppresses configured trackEvent messages from rum actions', () => {
|
|
116
|
+
const reporter = datadogReporter({
|
|
117
|
+
service: 'crimson-app-frontend',
|
|
118
|
+
application: 'crimson-app',
|
|
119
|
+
environment: 'production',
|
|
120
|
+
version: '1.2.3',
|
|
121
|
+
}, {
|
|
122
|
+
applicationId: 'app-id',
|
|
123
|
+
clientToken: 'client-token',
|
|
124
|
+
site: 'datadoghq.eu',
|
|
125
|
+
ignoreTrackEventPatterns: ['TIM_LOGIN_SUCCESS'],
|
|
126
|
+
});
|
|
127
|
+
reporter.trackEvent({
|
|
128
|
+
message: 'TIM_LOGIN_SUCCESS',
|
|
129
|
+
level: LogLevel.Info,
|
|
130
|
+
metadata: {
|
|
131
|
+
userId: '123',
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
expect(datadogRumMock.addAction).not.toHaveBeenCalled();
|
|
135
|
+
reporter.trackEvent({
|
|
136
|
+
message: 'message-sent',
|
|
137
|
+
level: LogLevel.Info,
|
|
138
|
+
});
|
|
139
|
+
expect(datadogRumMock.addAction).toHaveBeenCalledWith('message-sent', expect.objectContaining({
|
|
140
|
+
level: LogLevel.Info,
|
|
141
|
+
}));
|
|
142
|
+
});
|
|
143
|
+
it('does not suppress trackEvent messages unless configured', () => {
|
|
144
|
+
const reporter = datadogReporter({
|
|
145
|
+
service: 'crimson-app-frontend',
|
|
146
|
+
application: 'crimson-app',
|
|
147
|
+
environment: 'production',
|
|
148
|
+
version: '1.2.3',
|
|
149
|
+
}, {
|
|
150
|
+
applicationId: 'app-id',
|
|
151
|
+
clientToken: 'client-token',
|
|
152
|
+
site: 'datadoghq.eu',
|
|
153
|
+
});
|
|
154
|
+
reporter.trackEvent({
|
|
155
|
+
message: 'TIM_LOGIN_SUCCESS',
|
|
156
|
+
level: LogLevel.Info,
|
|
157
|
+
});
|
|
158
|
+
expect(datadogRumMock.addAction).toHaveBeenCalledWith('TIM_LOGIN_SUCCESS', expect.objectContaining({
|
|
159
|
+
level: LogLevel.Info,
|
|
160
|
+
}));
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
//# sourceMappingURL=datadogReporter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datadogReporter.test.js","sourceRoot":"","sources":["../../src/reporters/datadogReporter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthogReporter.d.ts","sourceRoot":"","sources":["../../src/reporters/posthogReporter.ts"],"names":[],"mappings":"AAAA,OAAgB,EAA+B,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EACL,SAAS,EACT,QAAQ,EAGR,kBAAkB,EAIlB,WAAW,EACZ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"posthogReporter.d.ts","sourceRoot":"","sources":["../../src/reporters/posthogReporter.ts"],"names":[],"mappings":"AAAA,OAAgB,EAA+B,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EACL,SAAS,EACT,QAAQ,EAGR,kBAAkB,EAIlB,WAAW,EACZ,MAAM,UAAU,CAAC;AAKlB,KAAK,wBAAwB,GAAG,OAAO,CACrC,IAAI,CACF,aAAa,EACX,UAAU,GACV,aAAa,GACb,aAAa,GACb,WAAW,GACX,mBAAmB,GACnB,kBAAkB,GAClB,wBAAwB,GACxB,OAAO,GACP,UAAU,GACV,2BAA2B,GAC3B,QAAQ,GACR,iBAAiB,GACjB,aAAa,GACb,kBAAkB,CACrB,CACF,CAAC;AAEF,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACvC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACrC,yCAAyC;IACzC,UAAU,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC1C,sDAAsD;IACtD,WAAW,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,gFAAgF;IAChF,eAAe,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACpD,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACtD,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC/D,gCAAgC;IAChC,WAAW,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,iCAAiC;IACjC,eAAe,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACpD,iCAAiC;IACjC,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAClD,4CAA4C;IAC5C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wCAAwC;IACxC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,iEAAiE;IACjE,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAgLD,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAc/E;AAcD,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,qBAAqB,GAAG,SAAS,CA0H3F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import posthog from 'posthog-js';
|
|
2
|
+
import { shouldSuppressAnalyticsEvent } from './analyticsNoise';
|
|
2
3
|
function hasActiveUser(user) {
|
|
3
4
|
if (!user) {
|
|
4
5
|
return false;
|
|
@@ -15,6 +16,17 @@ function getCurrentUrl(captureResult) {
|
|
|
15
16
|
}
|
|
16
17
|
return undefined;
|
|
17
18
|
}
|
|
19
|
+
function getStringProperty(properties, key) {
|
|
20
|
+
const value = properties?.[key];
|
|
21
|
+
return typeof value === 'string' && value ? value : undefined;
|
|
22
|
+
}
|
|
23
|
+
function routeMatchesPath(routeName, urlPath) {
|
|
24
|
+
const escapedRoute = routeName
|
|
25
|
+
.split('/')
|
|
26
|
+
.map((segment) => (segment.startsWith(':') ? '[^/]+' : segment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')))
|
|
27
|
+
.join('/');
|
|
28
|
+
return new RegExp(`^${escapedRoute}/?$`).test(urlPath);
|
|
29
|
+
}
|
|
18
30
|
function getUserRoleValue(user, metadata) {
|
|
19
31
|
const candidate = user?.userRole ?? user?.role ?? user?.userRoles ?? user?.roles ?? metadata.userRole ?? metadata.userRoles;
|
|
20
32
|
return normalizeValue(candidate);
|
|
@@ -24,7 +36,14 @@ function buildCompatibilityProperties(info, metadata, user, captureResult) {
|
|
|
24
36
|
const baseOrigin = typeof window !== 'undefined' ? window.location.origin : 'https://example.invalid';
|
|
25
37
|
const urlObject = url ? new URL(url, baseOrigin) : null;
|
|
26
38
|
const urlPath = urlObject?.pathname;
|
|
27
|
-
const
|
|
39
|
+
const isPageview = captureResult.event === '$pageview';
|
|
40
|
+
const capturedPageName = getStringProperty(captureResult.properties, 'pageName');
|
|
41
|
+
const metadataPageName = typeof metadata.pageName === 'string' ? metadata.pageName : undefined;
|
|
42
|
+
const pageName = isPageview ? capturedPageName ?? urlPath : metadataPageName;
|
|
43
|
+
const capturedRouteName = getStringProperty(captureResult.properties, 'routeName');
|
|
44
|
+
const metadataRouteName = typeof metadata.routeName === 'string' ? metadata.routeName : undefined;
|
|
45
|
+
const routeName = capturedRouteName ??
|
|
46
|
+
(urlPath && metadataRouteName && routeMatchesPath(metadataRouteName, urlPath) ? metadataRouteName : undefined);
|
|
28
47
|
return {
|
|
29
48
|
app_name: String(metadata.application ?? info.application ?? info.service),
|
|
30
49
|
domain: String(metadata.domain ?? urlObject?.hostname ?? (typeof window !== 'undefined' ? window.location.hostname : '')),
|
|
@@ -37,6 +56,7 @@ function buildCompatibilityProperties(info, metadata, user, captureResult) {
|
|
|
37
56
|
user_role: getUserRoleValue(user, metadata),
|
|
38
57
|
url,
|
|
39
58
|
url_path: urlPath,
|
|
59
|
+
url_path_group: routeName ?? (isPageview ? urlPath : undefined),
|
|
40
60
|
view_id: posthog.getPageViewId(),
|
|
41
61
|
view_name: pageName,
|
|
42
62
|
browser: captureResult.properties?.$browser,
|
|
@@ -153,6 +173,9 @@ export function posthogReporter(info, config) {
|
|
|
153
173
|
const reporter = {
|
|
154
174
|
...config,
|
|
155
175
|
trackEvent: function (event) {
|
|
176
|
+
if (shouldSuppressAnalyticsEvent(event.message, config.ignoreTrackEventPatterns)) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
156
179
|
posthog.capture(event.message, {
|
|
157
180
|
message: event.message,
|
|
158
181
|
level: event.level,
|
|
@@ -209,13 +232,13 @@ export function posthogReporter(info, config) {
|
|
|
209
232
|
reporter.addMetadata({ routeName });
|
|
210
233
|
},
|
|
211
234
|
setPageName: function (pageName) {
|
|
235
|
+
reporter.addMetadata({ pageName });
|
|
212
236
|
if (manualPageviews) {
|
|
213
237
|
posthog.capture('$pageview', {
|
|
214
238
|
pageName,
|
|
239
|
+
routeName: typeof currentMetadata.routeName === 'string' ? currentMetadata.routeName : undefined,
|
|
215
240
|
});
|
|
216
|
-
return;
|
|
217
241
|
}
|
|
218
|
-
reporter.addMetadata({ pageName });
|
|
219
242
|
},
|
|
220
243
|
reportError: function (error, metadata) {
|
|
221
244
|
posthog.captureException(error, {
|