@newrelic/browser-agent 1.258.2 → 1.259.0
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/CHANGELOG.md +7 -0
- package/dist/cjs/cdn/polyfills.js +3 -1
- package/dist/cjs/common/constants/env.cdn.js +1 -1
- package/dist/cjs/common/constants/env.npm.js +1 -1
- package/dist/cjs/common/drain/drain.js +1 -1
- package/dist/cjs/common/harvest/harvest-scheduler.js +4 -2
- package/dist/cjs/features/ajax/constants.js +3 -2
- package/dist/cjs/features/jserrors/aggregate/index.js +2 -1
- package/dist/cjs/features/metrics/aggregate/index.js +0 -8
- package/dist/cjs/features/page_view_event/aggregate/index.js +1 -1
- package/dist/cjs/features/session_replay/aggregate/index.js +31 -36
- package/dist/cjs/features/session_replay/constants.js +5 -2
- package/dist/cjs/features/session_replay/instrument/index.js +53 -13
- package/dist/cjs/features/session_replay/shared/utils.js +3 -5
- package/dist/cjs/features/session_trace/aggregate/index.js +181 -527
- package/dist/cjs/features/session_trace/aggregate/trace/node.js +19 -0
- package/dist/cjs/features/session_trace/aggregate/trace/storage.js +289 -0
- package/dist/cjs/features/session_trace/constants.js +3 -2
- package/dist/cjs/features/session_trace/instrument/index.js +7 -3
- package/dist/cjs/features/utils/aggregate-base.js +1 -0
- package/dist/cjs/features/utils/feature-gates.js +17 -0
- package/dist/cjs/features/utils/instrument-base.js +2 -1
- package/dist/cjs/loaders/agent-base.js +4 -0
- package/dist/cjs/loaders/api/api-methods.js +1 -1
- package/dist/cjs/loaders/api/api.js +2 -2
- package/dist/cjs/loaders/configure/configure.js +1 -0
- package/dist/esm/cdn/polyfills.js +3 -1
- package/dist/esm/common/constants/env.cdn.js +1 -1
- package/dist/esm/common/constants/env.npm.js +1 -1
- package/dist/esm/common/drain/drain.js +1 -1
- package/dist/esm/common/harvest/harvest-scheduler.js +4 -2
- package/dist/esm/features/ajax/constants.js +2 -1
- package/dist/esm/features/jserrors/aggregate/index.js +2 -1
- package/dist/esm/features/metrics/aggregate/index.js +0 -8
- package/dist/esm/features/page_view_event/aggregate/index.js +1 -1
- package/dist/esm/features/session_replay/aggregate/index.js +32 -37
- package/dist/esm/features/session_replay/constants.js +4 -1
- package/dist/esm/features/session_replay/instrument/index.js +54 -14
- package/dist/esm/features/session_replay/shared/utils.js +4 -6
- package/dist/esm/features/session_trace/aggregate/index.js +182 -527
- package/dist/esm/features/session_trace/aggregate/trace/node.js +12 -0
- package/dist/esm/features/session_trace/aggregate/trace/storage.js +282 -0
- package/dist/esm/features/session_trace/constants.js +2 -1
- package/dist/esm/features/session_trace/instrument/index.js +7 -3
- package/dist/esm/features/utils/aggregate-base.js +1 -0
- package/dist/esm/features/utils/feature-gates.js +11 -0
- package/dist/esm/features/utils/instrument-base.js +3 -2
- package/dist/esm/loaders/agent-base.js +4 -0
- package/dist/esm/loaders/api/api-methods.js +1 -1
- package/dist/esm/loaders/api/api.js +2 -2
- package/dist/esm/loaders/configure/configure.js +1 -0
- package/dist/types/common/harvest/harvest-scheduler.d.ts +1 -0
- package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
- package/dist/types/features/ajax/constants.d.ts +1 -0
- package/dist/types/features/ajax/constants.d.ts.map +1 -1
- package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/aggregate/index.d.ts +1 -1
- package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/constants.d.ts +3 -0
- package/dist/types/features/session_replay/instrument/index.d.ts +0 -1
- package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/shared/utils.d.ts +1 -1
- package/dist/types/features/session_replay/shared/utils.d.ts.map +1 -1
- package/dist/types/features/session_trace/aggregate/index.d.ts +39 -52
- package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_trace/aggregate/trace/node.d.ts +12 -0
- package/dist/types/features/session_trace/aggregate/trace/node.d.ts.map +1 -0
- package/dist/types/features/session_trace/aggregate/trace/storage.d.ts +43 -0
- package/dist/types/features/session_trace/aggregate/trace/storage.d.ts.map +1 -0
- package/dist/types/features/session_trace/constants.d.ts +1 -0
- package/dist/types/features/session_trace/constants.d.ts.map +1 -1
- package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
- package/dist/types/features/utils/aggregate-base.d.ts +1 -0
- package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
- package/dist/types/features/utils/feature-gates.d.ts +2 -0
- package/dist/types/features/utils/feature-gates.d.ts.map +1 -0
- package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
- package/dist/types/loaders/agent-base.d.ts +1 -0
- package/dist/types/loaders/agent-base.d.ts.map +1 -1
- package/dist/types/loaders/configure/configure.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cdn/polyfills.js +2 -0
- package/src/common/drain/drain.js +1 -1
- package/src/common/harvest/harvest-scheduler.js +4 -2
- package/src/features/ajax/constants.js +2 -0
- package/src/features/jserrors/aggregate/index.js +2 -1
- package/src/features/metrics/aggregate/index.js +0 -8
- package/src/features/page_view_event/aggregate/index.js +1 -1
- package/src/features/session_replay/aggregate/index.js +30 -39
- package/src/features/session_replay/constants.js +4 -0
- package/src/features/session_replay/instrument/index.js +48 -8
- package/src/features/session_replay/shared/__mocks__/utils.js +0 -1
- package/src/features/session_replay/shared/utils.js +4 -7
- package/src/features/session_trace/aggregate/index.js +157 -493
- package/src/features/session_trace/aggregate/trace/node.js +12 -0
- package/src/features/session_trace/aggregate/trace/storage.js +287 -0
- package/src/features/session_trace/constants.js +1 -0
- package/src/features/session_trace/instrument/index.js +7 -2
- package/src/features/utils/__mocks__/feature-gates.js +1 -0
- package/src/features/utils/aggregate-base.js +1 -0
- package/src/features/utils/feature-gates.js +11 -0
- package/src/features/utils/instrument-base.js +3 -2
- package/src/loaders/agent-base.js +4 -0
- package/src/loaders/api/api-methods.js +1 -1
- package/src/loaders/api/api.js +2 -2
- package/src/loaders/configure/configure.js +1 -0
- package/dist/cjs/features/session_replay/shared/replay-mode.js +0 -28
- package/dist/cjs/features/utils/handler-cache.js +0 -70
- package/dist/esm/features/session_replay/shared/replay-mode.js +0 -23
- package/dist/esm/features/utils/handler-cache.js +0 -63
- package/dist/types/features/session_replay/shared/replay-mode.d.ts +0 -9
- package/dist/types/features/session_replay/shared/replay-mode.d.ts.map +0 -1
- package/dist/types/features/utils/handler-cache.d.ts +0 -23
- package/dist/types/features/utils/handler-cache.d.ts.map +0 -1
- package/src/features/session_replay/shared/replay-mode.js +0 -23
- package/src/features/utils/handler-cache.js +0 -65
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { globalScope } from '../../../../common/constants/runtime';
|
|
2
|
+
import { MODE } from '../../../../common/session/constants';
|
|
3
|
+
import { now } from '../../../../common/timing/now';
|
|
4
|
+
import { parseUrl } from '../../../../common/url/parse-url';
|
|
5
|
+
import { MAX_NODES_PER_HARVEST } from '../../constants';
|
|
6
|
+
import { TraceNode } from './node';
|
|
7
|
+
const ERROR_MODE_SECONDS_WINDOW = 30 * 1000; // sliding window of nodes to track when simply monitoring (but not harvesting) in error mode
|
|
8
|
+
const SUPPORTS_PERFORMANCE_OBSERVER = typeof globalScope.PerformanceObserver === 'function';
|
|
9
|
+
const ignoredEvents = {
|
|
10
|
+
// we find that certain events make the data too noisy to be useful
|
|
11
|
+
global: {
|
|
12
|
+
mouseup: true,
|
|
13
|
+
mousedown: true
|
|
14
|
+
},
|
|
15
|
+
// certain events are present both in the window and in PVT metrics. PVT metrics are prefered so the window events should be ignored
|
|
16
|
+
window: {
|
|
17
|
+
load: true,
|
|
18
|
+
pagehide: true
|
|
19
|
+
},
|
|
20
|
+
// when ajax instrumentation is disabled, all XMLHttpRequest events will return with origin = xhrOriginMissing and should be ignored
|
|
21
|
+
xhrOriginMissing: {
|
|
22
|
+
ignoreAll: true
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const toAggregate = {
|
|
26
|
+
typing: [1000, 2000],
|
|
27
|
+
scrolling: [100, 1000],
|
|
28
|
+
mousing: [1000, 2000],
|
|
29
|
+
touching: [1000, 2000]
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** The purpose of this class is to manage, normalize, and retrieve ST nodes as needed without polluting the main ST modules */
|
|
33
|
+
export class TraceStorage {
|
|
34
|
+
nodeCount = 0;
|
|
35
|
+
trace = {};
|
|
36
|
+
earliestTimeStamp = Infinity;
|
|
37
|
+
latestTimeStamp = 0;
|
|
38
|
+
tempStorage = [];
|
|
39
|
+
prevStoredEvents = new Set();
|
|
40
|
+
constructor(parent) {
|
|
41
|
+
this.parent = parent;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Central function called by all the other store__ & addToTrace API to append a trace node. */
|
|
45
|
+
storeSTN(stn) {
|
|
46
|
+
if (this.parent.blocked) return;
|
|
47
|
+
if (this.nodeCount >= MAX_NODES_PER_HARVEST) {
|
|
48
|
+
// limit the amount of pending data awaiting next harvest
|
|
49
|
+
if (this.parent.agentRuntime.session.state.sessionTraceMode !== MODE.ERROR) return;
|
|
50
|
+
const openedSpace = this.trimSTNs(ERROR_MODE_SECONDS_WINDOW); // but maybe we could make some space by discarding irrelevant nodes if we're in sessioned Error mode
|
|
51
|
+
if (openedSpace === 0) return;
|
|
52
|
+
}
|
|
53
|
+
while (this.tempStorage.length) {
|
|
54
|
+
this.storeSTN(this.tempStorage.shift());
|
|
55
|
+
}
|
|
56
|
+
if (this.trace[stn.n]) this.trace[stn.n].push(stn);else this.trace[stn.n] = [stn];
|
|
57
|
+
if (stn.s < this.earliestTimeStamp) this.earliestTimeStamp = stn.s;
|
|
58
|
+
if (stn.s > this.latestTimeStamp) this.latestTimeStamp = stn.s;
|
|
59
|
+
this.nodeCount++;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Trim the collection of nodes awaiting harvest such that those seen outside a certain span of time are discarded.
|
|
64
|
+
* @param {number} lookbackDuration Past length of time until now for which we care about nodes, in milliseconds
|
|
65
|
+
* @returns {number} However many nodes were discarded after trimming.
|
|
66
|
+
*/
|
|
67
|
+
trimSTNs(lookbackDuration) {
|
|
68
|
+
let prunedNodes = 0;
|
|
69
|
+
const cutoffHighResTime = Math.max(now() - lookbackDuration, 0);
|
|
70
|
+
Object.keys(this.trace).forEach(nameCategory => {
|
|
71
|
+
const nodeList = this.trace[nameCategory];
|
|
72
|
+
/* Notice nodes are appending under their name's list as they end and are stored. This means each list is already (roughly) sorted in chronological order by end time.
|
|
73
|
+
* This isn't exact since nodes go through some processing & EE handlers chain, but it's close enough as we still capture nodes whose duration overlaps the lookback window.
|
|
74
|
+
* ASSUMPTION: all 'end' timings stored are relative to timeOrigin (DOMHighResTimeStamp) and not Unix epoch based. */
|
|
75
|
+
let cutoffIdx = nodeList.findIndex(node => cutoffHighResTime <= node.e);
|
|
76
|
+
if (cutoffIdx === 0) return;else if (cutoffIdx < 0) {
|
|
77
|
+
// whole list falls outside lookback window and is irrelevant
|
|
78
|
+
cutoffIdx = nodeList.length;
|
|
79
|
+
delete this.trace[nameCategory];
|
|
80
|
+
} else nodeList.splice(0, cutoffIdx); // chop off everything outside our window i.e. before the last <lookbackDuration> timeframe
|
|
81
|
+
|
|
82
|
+
this.nodeCount -= cutoffIdx;
|
|
83
|
+
prunedNodes += cutoffIdx;
|
|
84
|
+
});
|
|
85
|
+
return prunedNodes;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Used by session trace's harvester to create the payload body. */
|
|
89
|
+
takeSTNs() {
|
|
90
|
+
if (!SUPPORTS_PERFORMANCE_OBSERVER) {
|
|
91
|
+
// if PO isn't supported, this checks resourcetiming buffer every harvest.
|
|
92
|
+
this.storeResources(globalScope.performance?.getEntriesByType?.('resource'));
|
|
93
|
+
}
|
|
94
|
+
const stns = Object.entries(this.trace).flatMap(_ref => {
|
|
95
|
+
let [name, listOfSTNodes] = _ref;
|
|
96
|
+
// basically take the "this.trace" map-obj and concat all the list-type values
|
|
97
|
+
if (!(name in toAggregate)) return listOfSTNodes;
|
|
98
|
+
// Special processing for event nodes dealing with user inputs:
|
|
99
|
+
const reindexByOriginFn = this.smearEvtsByOrigin(name);
|
|
100
|
+
const partitionListByOriginMap = listOfSTNodes.sort((a, b) => a.s - b.s).reduce(reindexByOriginFn, {});
|
|
101
|
+
return Object.values(partitionListByOriginMap).flat(); // join the partitions back into 1-D, now ordered by origin then start time
|
|
102
|
+
}, this);
|
|
103
|
+
if (stns.length === 0) return {};
|
|
104
|
+
this.trace = {};
|
|
105
|
+
this.nodeCount = 0;
|
|
106
|
+
const earliestTimeStamp = this.earliestTimeStamp;
|
|
107
|
+
this.earliestTimeStamp = Infinity;
|
|
108
|
+
const latestTimeStamp = this.latestTimeStamp;
|
|
109
|
+
this.latestTimeStamp = 0;
|
|
110
|
+
return {
|
|
111
|
+
stns,
|
|
112
|
+
earliestTimeStamp,
|
|
113
|
+
latestTimeStamp
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
smearEvtsByOrigin(name) {
|
|
117
|
+
const maxGap = toAggregate[name][0];
|
|
118
|
+
const maxLen = toAggregate[name][1];
|
|
119
|
+
const lastO = {};
|
|
120
|
+
return (byOrigin, evtNode) => {
|
|
121
|
+
let lastArr = byOrigin[evtNode.o];
|
|
122
|
+
if (!lastArr) lastArr = byOrigin[evtNode.o] = [];
|
|
123
|
+
const last = lastO[evtNode.o];
|
|
124
|
+
if (name === 'scrolling' && !trivial(evtNode)) {
|
|
125
|
+
lastO[evtNode.o] = null;
|
|
126
|
+
evtNode.n = 'scroll';
|
|
127
|
+
lastArr.push(evtNode);
|
|
128
|
+
} else if (last && evtNode.s - last.s < maxLen && last.e > evtNode.s - maxGap) {
|
|
129
|
+
last.e = evtNode.e;
|
|
130
|
+
} else {
|
|
131
|
+
lastO[evtNode.o] = evtNode;
|
|
132
|
+
lastArr.push(evtNode);
|
|
133
|
+
}
|
|
134
|
+
return byOrigin;
|
|
135
|
+
};
|
|
136
|
+
function trivial(node) {
|
|
137
|
+
const limit = 4;
|
|
138
|
+
return !!(node && typeof node.e === 'number' && typeof node.s === 'number' && node.e - node.s < limit);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
processPVT(name, value, attrs) {
|
|
142
|
+
this.storeTiming({
|
|
143
|
+
[name]: value
|
|
144
|
+
});
|
|
145
|
+
if (hasFID(name, attrs)) this.storeEvent({
|
|
146
|
+
type: 'fid',
|
|
147
|
+
target: 'document'
|
|
148
|
+
}, 'document', value, value + attrs.fid);
|
|
149
|
+
function hasFID(name, attrs) {
|
|
150
|
+
return name === 'fi' && !!attrs && typeof attrs.fid === 'number';
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
storeTiming(timingEntry) {
|
|
154
|
+
if (!timingEntry) return;
|
|
155
|
+
|
|
156
|
+
// loop iterates through prototype also (for FF)
|
|
157
|
+
for (let key in timingEntry) {
|
|
158
|
+
let val = timingEntry[key];
|
|
159
|
+
|
|
160
|
+
// ignore size and status type nodes that do not map to timestamp metrics
|
|
161
|
+
const lck = key.toLowerCase();
|
|
162
|
+
if (lck.indexOf('size') >= 0 || lck.indexOf('status') >= 0) continue;
|
|
163
|
+
|
|
164
|
+
// ignore inherited methods, meaningless 0 values, and bogus timestamps
|
|
165
|
+
// that are in the future (Microsoft Edge seems to sometimes produce these)
|
|
166
|
+
if (!(typeof val === 'number' && val >= 0)) continue;
|
|
167
|
+
val = Math.round(val);
|
|
168
|
+
this.storeSTN(new TraceNode(key, val, val, 'document', 'timing'));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Tracks the events and their listener's duration on objects wrapped by wrap-events.
|
|
173
|
+
storeEvent(currentEvent, target, start, end) {
|
|
174
|
+
if (this.shouldIgnoreEvent(currentEvent, target)) return;
|
|
175
|
+
if (this.prevStoredEvents.has(currentEvent)) return; // prevent multiple listeners of an event from creating duplicate trace nodes per occurrence. Cleared every harvest. near-zero chance for re-duplication after clearing per harvest since the timestamps of the event are considered for uniqueness.
|
|
176
|
+
this.prevStoredEvents.add(currentEvent);
|
|
177
|
+
const evt = new TraceNode(this.evtName(currentEvent.type), start, end, undefined, 'event');
|
|
178
|
+
try {
|
|
179
|
+
// webcomponents-lite.js can trigger an exception on currentEvent.target getter because
|
|
180
|
+
// it does not check currentEvent.currentTarget before calling getRootNode() on it
|
|
181
|
+
evt.o = this.evtOrigin(currentEvent.target, target);
|
|
182
|
+
} catch (e) {
|
|
183
|
+
evt.o = this.evtOrigin(null, target);
|
|
184
|
+
}
|
|
185
|
+
this.storeSTN(evt);
|
|
186
|
+
}
|
|
187
|
+
shouldIgnoreEvent(event, target) {
|
|
188
|
+
const origin = this.evtOrigin(event.target, target);
|
|
189
|
+
if (event.type in ignoredEvents.global) return true;
|
|
190
|
+
if (!!ignoredEvents[origin] && ignoredEvents[origin].ignoreAll) return true;
|
|
191
|
+
return !!(!!ignoredEvents[origin] && event.type in ignoredEvents[origin]);
|
|
192
|
+
}
|
|
193
|
+
evtName(type) {
|
|
194
|
+
switch (type) {
|
|
195
|
+
case 'keydown':
|
|
196
|
+
case 'keyup':
|
|
197
|
+
case 'keypress':
|
|
198
|
+
return 'typing';
|
|
199
|
+
case 'mousemove':
|
|
200
|
+
case 'mouseenter':
|
|
201
|
+
case 'mouseleave':
|
|
202
|
+
case 'mouseover':
|
|
203
|
+
case 'mouseout':
|
|
204
|
+
return 'mousing';
|
|
205
|
+
case 'scroll':
|
|
206
|
+
return 'scrolling';
|
|
207
|
+
case 'touchstart':
|
|
208
|
+
case 'touchmove':
|
|
209
|
+
case 'touchend':
|
|
210
|
+
case 'touchcancel':
|
|
211
|
+
case 'touchenter':
|
|
212
|
+
case 'touchleave':
|
|
213
|
+
return 'touching';
|
|
214
|
+
default:
|
|
215
|
+
return type;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
evtOrigin(t, target) {
|
|
219
|
+
let origin = 'unknown';
|
|
220
|
+
if (t && t instanceof XMLHttpRequest) {
|
|
221
|
+
const params = this.parent.ee.context(t).params;
|
|
222
|
+
if (!params || !params.status || !params.method || !params.host || !params.pathname) return 'xhrOriginMissing';
|
|
223
|
+
origin = params.status + ' ' + params.method + ': ' + params.host + params.pathname;
|
|
224
|
+
} else if (t && typeof t.tagName === 'string') {
|
|
225
|
+
origin = t.tagName.toLowerCase();
|
|
226
|
+
if (t.id) origin += '#' + t.id;
|
|
227
|
+
if (t.className) {
|
|
228
|
+
for (let i = 0; i < t.classList.length; i++) origin += '.' + t.classList[i];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (origin === 'unknown') {
|
|
232
|
+
if (typeof target === 'string') origin = target;else if (target === document) origin = 'document';else if (target === window) origin = 'window';else if (target instanceof FileReader) origin = 'FileReader';
|
|
233
|
+
}
|
|
234
|
+
return origin;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Tracks when the window history API specified by wrap-history is used.
|
|
238
|
+
storeHist(path, old, time) {
|
|
239
|
+
this.storeSTN(new TraceNode('history.pushState', time, time, path, old));
|
|
240
|
+
}
|
|
241
|
+
#laststart = 0;
|
|
242
|
+
// Processes all the PerformanceResourceTiming entries captured (by observer).
|
|
243
|
+
storeResources(resources) {
|
|
244
|
+
if (!resources || resources.length === 0) return;
|
|
245
|
+
resources.forEach(currentResource => {
|
|
246
|
+
if ((currentResource.fetchStart | 0) <= this.#laststart) return; // don't recollect already-seen resources
|
|
247
|
+
|
|
248
|
+
const {
|
|
249
|
+
initiatorType,
|
|
250
|
+
fetchStart,
|
|
251
|
+
responseEnd,
|
|
252
|
+
entryType
|
|
253
|
+
} = currentResource;
|
|
254
|
+
const {
|
|
255
|
+
protocol,
|
|
256
|
+
hostname,
|
|
257
|
+
port,
|
|
258
|
+
pathname
|
|
259
|
+
} = parseUrl(currentResource.name);
|
|
260
|
+
const res = new TraceNode(initiatorType, fetchStart | 0, responseEnd | 0, "".concat(protocol, "://").concat(hostname, ":").concat(port).concat(pathname), entryType);
|
|
261
|
+
this.storeSTN(res);
|
|
262
|
+
});
|
|
263
|
+
this.#laststart = resources[resources.length - 1].fetchStart | 0;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// JavascriptError (FEATURE) events pipes into ST here.
|
|
267
|
+
storeErrorAgg(type, name, params, metrics) {
|
|
268
|
+
if (type !== 'err') return; // internal errors are purposefully ignored
|
|
269
|
+
this.storeSTN(new TraceNode('error', metrics.time, metrics.time, params.message, params.stackHash));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Ajax (FEATURE) events--XML & fetches--pipes into ST here.
|
|
273
|
+
storeXhrAgg(type, name, params, metrics) {
|
|
274
|
+
if (type !== 'xhr') return;
|
|
275
|
+
this.storeSTN(new TraceNode('Ajax', metrics.time, metrics.time + metrics.duration, "".concat(params.status, " ").concat(params.method, ": ").concat(params.host).concat(params.pathname)));
|
|
276
|
+
}
|
|
277
|
+
restoreNode(name, listOfSTNodes) {
|
|
278
|
+
if (this.nodeCount >= MAX_NODES_PER_HARVEST) return;
|
|
279
|
+
this.nodeCount += listOfSTNodes.length;
|
|
280
|
+
this.trace[name] = this.trace[name] ? listOfSTNodes.concat(this.trace[name]) : listOfSTNodes;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
@@ -7,7 +7,8 @@ import { wrapHistory, wrapEvents } from '../../../common/wrap';
|
|
|
7
7
|
import { InstrumentBase } from '../../utils/instrument-base';
|
|
8
8
|
import * as CONSTANTS from '../constants';
|
|
9
9
|
import { FEATURE_NAMES } from '../../../loaders/features/features';
|
|
10
|
-
import {
|
|
10
|
+
import { deregisterDrain } from '../../../common/drain/drain';
|
|
11
|
+
import { canEnableSessionTracking } from '../../utils/feature-gates';
|
|
11
12
|
import { now } from '../../../common/timing/now';
|
|
12
13
|
const {
|
|
13
14
|
BST_RESOURCE,
|
|
@@ -24,8 +25,11 @@ export class Instrument extends InstrumentBase {
|
|
|
24
25
|
constructor(agentIdentifier, aggregator) {
|
|
25
26
|
let auto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
26
27
|
super(agentIdentifier, aggregator, FEATURE_NAME, auto);
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
const canTrackSession = canEnableSessionTracking(this.agentIdentifier);
|
|
29
|
+
if (!canTrackSession) {
|
|
30
|
+
deregisterDrain(this.agentIdentifier, this.featureName);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
29
33
|
const thisInstrumentEE = this.ee;
|
|
30
34
|
wrapHistory(thisInstrumentEE);
|
|
31
35
|
this.eventsEE = wrapEvents(thisInstrumentEE);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { getConfigurationValue } from '../../common/config/config';
|
|
2
|
+
import { isBrowserScope } from '../../common/constants/runtime';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Checks if session can be tracked, affects session entity and dependent features
|
|
6
|
+
* @param {string} agentId
|
|
7
|
+
* @returns {boolean}
|
|
8
|
+
*/
|
|
9
|
+
export const canEnableSessionTracking = agentId => {
|
|
10
|
+
return isBrowserScope && getConfigurationValue(agentId, 'privacy.cookies_enabled') === true;
|
|
11
|
+
};
|
|
@@ -11,7 +11,8 @@ import { isBrowserScope } from '../../common/constants/runtime';
|
|
|
11
11
|
import { warn } from '../../common/util/console';
|
|
12
12
|
import { FEATURE_NAMES } from '../../loaders/features/features';
|
|
13
13
|
import { getConfigurationValue } from '../../common/config/config';
|
|
14
|
-
import { canImportReplayAgg
|
|
14
|
+
import { canImportReplayAgg } from '../session_replay/shared/utils';
|
|
15
|
+
import { canEnableSessionTracking } from './feature-gates';
|
|
15
16
|
import { single } from '../../common/util/invoke';
|
|
16
17
|
|
|
17
18
|
/**
|
|
@@ -78,7 +79,7 @@ export class InstrumentBase extends FeatureBase {
|
|
|
78
79
|
const importLater = async () => {
|
|
79
80
|
let session;
|
|
80
81
|
try {
|
|
81
|
-
if (
|
|
82
|
+
if (canEnableSessionTracking(this.agentIdentifier)) {
|
|
82
83
|
// would require some setup before certain features start
|
|
83
84
|
const {
|
|
84
85
|
setupAgentSession
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { warn } from '../common/util/console';
|
|
4
4
|
import { SR_EVENT_EMITTER_TYPES } from '../features/session_replay/constants';
|
|
5
5
|
import { generateRandomHexString } from '../common/ids/unique-id';
|
|
6
|
+
import { ee } from '../common/event-emitter/contextual-ee';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @typedef {import('./api/interaction-types').InteractionInstance} InteractionInstance
|
|
@@ -13,6 +14,9 @@ export class AgentBase {
|
|
|
13
14
|
constructor() {
|
|
14
15
|
let agentIdentifier = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : generateRandomHexString(16);
|
|
15
16
|
this.agentIdentifier = agentIdentifier;
|
|
17
|
+
|
|
18
|
+
// Assign the observation context to the event emitter, so it knows how to create observation contexts
|
|
19
|
+
this.ee = ee.get(agentIdentifier);
|
|
16
20
|
}
|
|
17
21
|
|
|
18
22
|
/**
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { SR_EVENT_EMITTER_TYPES } from '../../features/session_replay/constants';
|
|
2
|
-
export const apiMethods = ['setErrorHandler', 'finished', 'addToTrace', 'addRelease', 'addPageAction', 'setCurrentRouteName', 'setPageViewName', 'setCustomAttribute', 'interaction', 'noticeError', 'setUserId', 'setApplicationVersion', 'start',
|
|
2
|
+
export const apiMethods = ['setErrorHandler', 'finished', 'addToTrace', 'addRelease', 'addPageAction', 'setCurrentRouteName', 'setPageViewName', 'setCustomAttribute', 'interaction', 'noticeError', 'setUserId', 'setApplicationVersion', 'start', SR_EVENT_EMITTER_TYPES.RECORD, SR_EVENT_EMITTER_TYPES.PAUSE];
|
|
3
3
|
export const asyncApiMethods = ['setErrorHandler', 'finished', 'addToTrace', 'addRelease'];
|
|
@@ -198,8 +198,8 @@ export function setAPI(agentIdentifier, forceDrain) {
|
|
|
198
198
|
} = _ref;
|
|
199
199
|
setAPI(agentIdentifier);
|
|
200
200
|
drain(agentIdentifier, 'api');
|
|
201
|
-
}).catch(
|
|
202
|
-
warn('Downloading runtime APIs failed...');
|
|
201
|
+
}).catch(err => {
|
|
202
|
+
warn('Downloading runtime APIs failed...', err);
|
|
203
203
|
instanceEE.abort();
|
|
204
204
|
});
|
|
205
205
|
}
|
|
@@ -54,6 +54,7 @@ export function configure(agent) {
|
|
|
54
54
|
agent.runSoftNavOverSpa &&= updatedInit.soft_navigations.enabled === true && updatedInit.feature_flags.includes('soft_nav');
|
|
55
55
|
}
|
|
56
56
|
runtime.denyList = [...(updatedInit.ajax.deny_list || []), ...(updatedInit.ajax.block_internal ? internalTrafficList : [])];
|
|
57
|
+
runtime.ptid = agent.agentIdentifier;
|
|
57
58
|
setRuntime(agent.agentIdentifier, runtime);
|
|
58
59
|
if (agent.api === undefined) agent.api = setAPI(agent.agentIdentifier, forceDrain, agent.runSoftNavOverSpa);
|
|
59
60
|
if (agent.exposed === undefined) agent.exposed = exposed;
|
|
@@ -31,6 +31,7 @@ export class HarvestScheduler extends SharedContext {
|
|
|
31
31
|
started: boolean;
|
|
32
32
|
timeoutHandle: any;
|
|
33
33
|
aborted: boolean;
|
|
34
|
+
harvesting: boolean;
|
|
34
35
|
harvest: Harvest;
|
|
35
36
|
/**
|
|
36
37
|
* This function is only meant for the last outgoing harvest cycle of a page. It trickles down to using sendBeacon, which should not be used
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harvest-scheduler.d.ts","sourceRoot":"","sources":["../../../../src/common/harvest/harvest-scheduler.js"],"names":[],"mappings":"AAWA;;GAEG;AACH;IACE;;;;;;;;;;SAUK;IACL,sBATa,MAAM;QAES,UAAU;QACV,UAAU;QACZ,UAAU,EAAvB,MAAM;QACQ,GAAG,EAAjB,OAAO;QACM,SAAS,EAAtB,MAAM;oBAoBlB;IAfC,iBAAwB;IACxB;;;oBARW,MAAM;aACN,OAAO;mBACP,MAAM;MAMK;IACtB,iBAAoB;IACpB,mBAAyB;IACzB,iBAAoB;
|
|
1
|
+
{"version":3,"file":"harvest-scheduler.d.ts","sourceRoot":"","sources":["../../../../src/common/harvest/harvest-scheduler.js"],"names":[],"mappings":"AAWA;;GAEG;AACH;IACE;;;;;;;;;;SAUK;IACL,sBATa,MAAM;QAES,UAAU;QACV,UAAU;QACZ,UAAU,EAAvB,MAAM;QACQ,GAAG,EAAjB,OAAO;QACM,SAAS,EAAtB,MAAM;oBAoBlB;IAfC,iBAAwB;IACxB;;;oBARW,MAAM;aACN,OAAO;mBACP,MAAM;MAMK;IACtB,iBAAoB;IACpB,mBAAyB;IACzB,iBAAoB;IACpB,oBAAuB;IACvB,iBAA8C;IAWhD;;;OAGG;IACH,eAKC;IAED,mDAIC;IAHC,cAAwB;IAK1B,uCAMC;IAED,6CAUC;IAED,yCAgEC;IAED,gDAiBC;CACF;8BAhK6B,2BAA2B;wBACjC,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/features/ajax/constants.js"],"names":[],"mappings":"AAEA,kCAA8C"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/features/ajax/constants.js"],"names":[],"mappings":"AAEA,kCAA8C;AAE9C,uCAAuC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/jserrors/aggregate/index.js"],"names":[],"mappings":"AAyBA;;GAEG;AAEH;IACE,2BAAiC;IACjC,mDAgCC;IA7BC,kBAAuB;IACvB,eAAoB;IACpB,qBAA0B;IAC1B,2BAAgC;IAChC,mCAA4B;IAC5B,qBAAwB;IA0B1B;;;MAwBC;IAED,qCAWC;IAED,8BAEC;IAED,oEAMC;IAED;;;;;;OAMG;IACH,qCAHW,SAAS,GACP,MAAM,CAgBlB;IAED,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/jserrors/aggregate/index.js"],"names":[],"mappings":"AAyBA;;GAEG;AAEH;IACE,2BAAiC;IACjC,mDAgCC;IA7BC,kBAAuB;IACvB,eAAoB;IACpB,qBAA0B;IAC1B,2BAAgC;IAChC,mCAA4B;IAC5B,qBAAwB;IA0B1B;;;MAwBC;IAED,qCAWC;IAED,8BAEC;IAED,oEAMC;IAED;;;;;;OAMG;IACH,qCAHW,SAAS,GACP,MAAM,CAgBlB;IAED,4FA6FC;IA4BD,yDA6BC;IAED,qFAOC;;CAwBF;wBAxSY,OAAO,0BAA0B,EAAE,SAAS;8BAN3B,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/metrics/aggregate/index.js"],"names":[],"mappings":"AAaA;IACE,2BAAiC;IACjC,mDAsBC;IAED,wDAKC;IAED,iDAKC;IAED,qBA6CC;IAED,0BAOC;IAED,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/metrics/aggregate/index.js"],"names":[],"mappings":"AAaA;IACE,2BAAiC;IACjC,mDAsBC;IAED,wDAKC;IAED,iDAKC;IAED,qBA6CC;IAED,0BAOC;IAED,eAkCC;IA/BG,mCAAyB;CAgC9B;8BAtI6B,4BAA4B"}
|
|
@@ -27,7 +27,7 @@ export class Aggregate extends AggregateBase {
|
|
|
27
27
|
* @param {boolean} ignoreSession - whether to force the method to ignore the session state and use just the sample flags
|
|
28
28
|
* @returns {void}
|
|
29
29
|
*/
|
|
30
|
-
initializeRecording(
|
|
30
|
+
initializeRecording(srMode: any, ignoreSession: boolean): void;
|
|
31
31
|
prepUtils(): Promise<void>;
|
|
32
32
|
prepareHarvest({ opts }?: {
|
|
33
33
|
opts: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/aggregate/index.js"],"names":[],"mappings":"AAgCA;IACE,2BAAiC;IAIjC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/aggregate/index.js"],"names":[],"mappings":"AAgCA;IACE,2BAAiC;IAIjC,8DAuGC;IA1GD,aAAe;IAKb,8GAA8G;IAC9G,wBAAgH;IAChH,iFAAiF;IACjF,qBAAwB;IAGxB,2CAA2C;IAC3C,sDAAwB;IACxB,6CAA6C;IAC7C,gDAAmB;IAEnB,0BAA0B;IAC1B,kBAAqB;IACrB,6CAA6C;IAC7C,gBAA2B;IAE3B,cAA8B;IAC9B,kBAA+C;IAoC/C,4BAKQ;IA6CV,0BAMC;IAED,qBAWC;IAED;;;;;;;OAOG;IACH,gDAHW,OAAO,GACL,IAAI,CA8DhB;IAED,2BASC;IAED;;;;;;;;;;;;oBAiDC;IAED,sCAIC;IAED;;;;;;;;;;MAsEC;IAED,qCAOC;IAED;;;;OAIG;IACH,mCAKC;IAED,yDAAyD;IACzD,yBAUC;IAED,yCAGC;CACF;8BA3Y6B,4BAA4B;iCAHzB,2CAA2C"}
|
|
@@ -3,7 +3,6 @@ export class Instrument extends InstrumentBase {
|
|
|
3
3
|
constructor(agentIdentifier: any, aggregator: any, auto?: boolean);
|
|
4
4
|
replayRunning: boolean;
|
|
5
5
|
errorNoticed: boolean;
|
|
6
|
-
recorder: import("../shared/recorder").Recorder | undefined;
|
|
7
6
|
#private;
|
|
8
7
|
}
|
|
9
8
|
import { InstrumentBase } from '../../utils/instrument-base';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/instrument/index.js"],"names":[],"mappings":"AAiBA;IACE,2BAAiC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/instrument/index.js"],"names":[],"mappings":"AAiBA;IACE,2BAAiC;IAGjC,mEA+BC;IA5BC,uBAA0B;IAmBtB,sBAAwB;;CAgE/B;+BA9F8B,6BAA6B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function
|
|
1
|
+
export function hasReplayPrerequisite(agentId: any): boolean;
|
|
2
2
|
export function isPreloadAllowed(agentId: any): boolean;
|
|
3
3
|
export function canImportReplayAgg(agentId: any, sessionMgr: any): boolean;
|
|
4
4
|
export function buildNRMetaNode(timestamp: any, timeKeeper: any): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/shared/utils.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_replay/shared/utils.js"],"names":[],"mappings":"AAIA,6DAIC;AAED,wDAEC;AAED,2EAGC;AAED;;;;;;;EAUC"}
|
|
@@ -1,61 +1,48 @@
|
|
|
1
1
|
export class Aggregate extends AggregateBase {
|
|
2
2
|
static featureName: string;
|
|
3
|
-
constructor(agentIdentifier: any, aggregator: any
|
|
3
|
+
constructor(agentIdentifier: any, aggregator: any);
|
|
4
4
|
agentRuntime: any;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
nodeCount: number;
|
|
9
|
-
sentTrace: {} | null;
|
|
10
|
-
prevStoredEvents: Set<any>;
|
|
5
|
+
agentInfo: any;
|
|
6
|
+
/** A buffer to hold on to harvested traces in the case that a retry must be made later */
|
|
7
|
+
sentTrace: any[] | null | undefined;
|
|
11
8
|
harvestTimeSeconds: any;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
storeSTN(stn: any): void;
|
|
30
|
-
/**
|
|
31
|
-
* Trim the collection of nodes awaiting harvest such that those seen outside a certain span of time are discarded.
|
|
32
|
-
* @param {number} lookbackDuration Past length of time until now for which we care about nodes, in milliseconds
|
|
33
|
-
* @returns {number} However many nodes were discarded after trimming.
|
|
34
|
-
*/
|
|
35
|
-
trimSTNs(lookbackDuration: number): number;
|
|
36
|
-
takeSTNs(retry: any): {
|
|
37
|
-
qs?: undefined;
|
|
38
|
-
body?: undefined;
|
|
39
|
-
} | {
|
|
9
|
+
/** Tied to the entitlement flag response from BCS. Will short circuit operations of the agg if false */
|
|
10
|
+
entitled: any;
|
|
11
|
+
/** A flag used to decide if the 30 node threshold should be ignored on the first harvest to ensure sending on the first payload */
|
|
12
|
+
everHarvested: boolean;
|
|
13
|
+
/** If the harvest module is harvesting */
|
|
14
|
+
harvesting: boolean;
|
|
15
|
+
/** TraceStorage is the mechanism that holds, normalizes and aggregates ST nodes. It will be accessed and purged when harvests occur */
|
|
16
|
+
traceStorage: TraceStorage;
|
|
17
|
+
/** Sets up event listeners, and initializes this module to run in the correct "mode". Can be triggered from a few places, but makes an effort to only set up listeners once */
|
|
18
|
+
initialize(stMode: any, stEntitled: any, ignoreSession: any): void;
|
|
19
|
+
mode: any;
|
|
20
|
+
initialized: boolean | undefined;
|
|
21
|
+
scheduler: HarvestScheduler | undefined;
|
|
22
|
+
/** This module does not auto harvest by default -- it needs to be kicked off. Once this method is called, it will then harvest on an interval */
|
|
23
|
+
startHarvesting(): void;
|
|
24
|
+
/** Called by the harvest scheduler at harvest time to retrieve the payload. This will only actually return a payload if running in full mode */
|
|
25
|
+
prepareHarvest(options?: {}): {
|
|
40
26
|
qs: {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
* so that blob parsing doesn't need to happen to support UI/API functions */
|
|
48
|
-
fts: number;
|
|
49
|
-
/** n === "nodeCount" in NR1, a count of nodes in the ST payload, so that blob parsing doesn't need to happen to support UI/API functions */
|
|
50
|
-
n: number;
|
|
51
|
-
};
|
|
52
|
-
body: {
|
|
53
|
-
res: any[];
|
|
27
|
+
browser_monitoring_key: any;
|
|
28
|
+
type: string;
|
|
29
|
+
app_id: any;
|
|
30
|
+
protocol_version: string;
|
|
31
|
+
timestamp: any;
|
|
32
|
+
attributes: string;
|
|
54
33
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
34
|
+
body: any[] | undefined;
|
|
35
|
+
} | undefined;
|
|
36
|
+
/** When the harvest scheduler finishes, this callback is executed. It's main purpose is to determine if the payload needs to be retried
|
|
37
|
+
* and if so, it will take all data from the temporary buffer and place it back into the traceStorage module
|
|
38
|
+
*/
|
|
39
|
+
onHarvestFinished(result: any): void;
|
|
40
|
+
/** Switch from "off" or "error" to full mode (if entitled) */
|
|
41
|
+
switchToFull(): void;
|
|
42
|
+
/** Stop running for the remainder of the page lifecycle */
|
|
43
|
+
abort(): void;
|
|
58
44
|
}
|
|
59
45
|
import { AggregateBase } from '../../utils/aggregate-base';
|
|
60
|
-
import {
|
|
46
|
+
import { TraceStorage } from './trace/storage';
|
|
47
|
+
import { HarvestScheduler } from '../../../common/harvest/harvest-scheduler';
|
|
61
48
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_trace/aggregate/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/session_trace/aggregate/index.js"],"names":[],"mappings":"AAcA;IACE,2BAAiC;IAEjC,mDAmBC;IAjBC,kBAA+C;IAC/C,eAAyC;IAEzC,0FAA0F;IAC1F,oCAAqB;IACrB,wBAA0G;IAC1G,0GAA0G;IAC1G,cAAyB;IACzB,mIAAmI;IACnI,uBAA0B;IAC1B,0CAA0C;IAC1C,oBAAuB;IACvB,wIAAwI;IACxI,2BAA0C;IAM5C,gLAAgL;IAChL,mEA6DC;IA1CyD,UAA4D;IAGpH,iCAAuB;IAOvB,wCAKQ;IA6BV,kJAAkJ;IAClJ,wBAIC;IAED,iJAAiJ;IACjJ;;;;;;;;;;kBA4DC;IAED;;OAEG;IACH,qCAKC;IAED,8DAA8D;IAC9D,qBAUC;IAED,2DAA2D;IAC3D,cAKC;CACF;8BAtM6B,4BAA4B;6BAC7B,iBAAiB;iCAJb,2CAA2C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* All nodes reported to the consumer must take this shape
|
|
3
|
+
*/
|
|
4
|
+
export class TraceNode {
|
|
5
|
+
constructor(name: any, start: any, end: any, origin: any, type: any);
|
|
6
|
+
n: any;
|
|
7
|
+
s: any;
|
|
8
|
+
e: any;
|
|
9
|
+
o: any;
|
|
10
|
+
t: any;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../../../src/features/session_trace/aggregate/trace/node.js"],"names":[],"mappings":"AAAA;;GAEG;AACH;IACE,qEAMC;IALC,OAAa;IACb,OAAc;IACd,OAAY;IACZ,OAAe;IACf,OAAa;CAEhB"}
|