@atlaskit/react-ufo 4.7.0 → 4.7.1
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/create-interaction-extra-metrics-payload/index.js +82 -15
- package/dist/cjs/create-payload/index.js +26 -218
- package/dist/cjs/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.js +20 -0
- package/dist/cjs/create-payload/utils/get-visibility-state-from-performance.js +35 -0
- package/dist/cjs/create-payload/utils/optimize-apdex.js +25 -0
- package/dist/cjs/create-payload/utils/optimize-custom-timings.js +22 -0
- package/dist/cjs/create-payload/utils/optimize-hold-info.js +41 -0
- package/dist/cjs/create-payload/utils/optimize-marks.js +24 -0
- package/dist/cjs/create-payload/utils/optimize-react-profiler-timings.js +53 -0
- package/dist/cjs/create-payload/utils/optimize-request-info.js +32 -0
- package/dist/cjs/create-payload/utils/optimize-spans.js +30 -0
- package/dist/cjs/interaction-metrics-init/index.js +1 -1
- package/dist/es2019/create-interaction-extra-metrics-payload/index.js +62 -9
- package/dist/es2019/create-payload/index.js +10 -205
- package/dist/es2019/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.js +13 -0
- package/dist/es2019/create-payload/utils/get-visibility-state-from-performance.js +28 -0
- package/dist/es2019/create-payload/utils/optimize-apdex.js +14 -0
- package/dist/es2019/create-payload/utils/optimize-custom-timings.js +16 -0
- package/dist/es2019/create-payload/utils/optimize-hold-info.js +35 -0
- package/dist/es2019/create-payload/utils/optimize-marks.js +12 -0
- package/dist/es2019/create-payload/utils/optimize-react-profiler-timings.js +46 -0
- package/dist/es2019/create-payload/utils/optimize-request-info.js +26 -0
- package/dist/es2019/create-payload/utils/optimize-spans.js +24 -0
- package/dist/es2019/interaction-metrics-init/index.js +1 -1
- package/dist/esm/create-interaction-extra-metrics-payload/index.js +83 -16
- package/dist/esm/create-payload/index.js +18 -208
- package/dist/esm/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.js +13 -0
- package/dist/esm/create-payload/utils/get-visibility-state-from-performance.js +29 -0
- package/dist/esm/create-payload/utils/optimize-apdex.js +18 -0
- package/dist/esm/create-payload/utils/optimize-custom-timings.js +16 -0
- package/dist/esm/create-payload/utils/optimize-hold-info.js +34 -0
- package/dist/esm/create-payload/utils/optimize-marks.js +17 -0
- package/dist/esm/create-payload/utils/optimize-react-profiler-timings.js +46 -0
- package/dist/esm/create-payload/utils/optimize-request-info.js +25 -0
- package/dist/esm/create-payload/utils/optimize-spans.js +23 -0
- package/dist/esm/interaction-metrics-init/index.js +1 -1
- package/dist/types/create-interaction-extra-metrics-payload/index.d.ts +56 -0
- package/dist/types/create-payload/index.d.ts +0 -3
- package/dist/types/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.d.ts +2 -0
- package/dist/types/create-payload/utils/get-visibility-state-from-performance.d.ts +1 -0
- package/dist/types/create-payload/utils/optimize-apdex.d.ts +12 -0
- package/dist/types/create-payload/utils/optimize-custom-timings.d.ts +7 -0
- package/dist/types/create-payload/utils/optimize-hold-info.d.ts +3 -0
- package/dist/types/create-payload/utils/optimize-marks.d.ts +12 -0
- package/dist/types/create-payload/utils/optimize-react-profiler-timings.d.ts +3 -0
- package/dist/types/create-payload/utils/optimize-request-info.d.ts +8 -0
- package/dist/types/create-payload/utils/optimize-spans.d.ts +9 -0
- package/dist/types-ts4.5/create-interaction-extra-metrics-payload/index.d.ts +56 -0
- package/dist/types-ts4.5/create-payload/index.d.ts +0 -3
- package/dist/types-ts4.5/create-payload/utils/get-more-accurate-page-visibility-up-to-ttai.d.ts +2 -0
- package/dist/types-ts4.5/create-payload/utils/get-visibility-state-from-performance.d.ts +1 -0
- package/dist/types-ts4.5/create-payload/utils/optimize-apdex.d.ts +12 -0
- package/dist/types-ts4.5/create-payload/utils/optimize-custom-timings.d.ts +7 -0
- package/dist/types-ts4.5/create-payload/utils/optimize-hold-info.d.ts +3 -0
- package/dist/types-ts4.5/create-payload/utils/optimize-marks.d.ts +12 -0
- package/dist/types-ts4.5/create-payload/utils/optimize-react-profiler-timings.d.ts +3 -0
- package/dist/types-ts4.5/create-payload/utils/optimize-request-info.d.ts +8 -0
- package/dist/types-ts4.5/create-payload/utils/optimize-spans.d.ts +9 -0
- package/package.json +1 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.optimizeMarks = optimizeMarks;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
+
var _utils = require("../common/utils");
|
|
11
|
+
var _excluded = ["labelStack", "time"];
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
+
function optimizeMarks(marks, reactUFOVersion) {
|
|
15
|
+
return marks.map(function (_ref) {
|
|
16
|
+
var labelStack = _ref.labelStack,
|
|
17
|
+
time = _ref.time,
|
|
18
|
+
others = (0, _objectWithoutProperties2.default)(_ref, _excluded);
|
|
19
|
+
return _objectSpread(_objectSpread({}, others), {}, {
|
|
20
|
+
labelStack: labelStack && (0, _utils.optimizeLabelStack)(labelStack, reactUFOVersion),
|
|
21
|
+
time: Math.round(time)
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.optimizeReactProfilerTimings = optimizeReactProfilerTimings;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
10
|
+
var _interactionMetrics = require("../../interaction-metrics");
|
|
11
|
+
var _utils = require("../common/utils");
|
|
12
|
+
function optimizeReactProfilerTimings(reactProfilerTimings, interactionStart, reactUFOVersion) {
|
|
13
|
+
var reactProfilerTimingsMap = reactProfilerTimings.reduce(function (result, _ref) {
|
|
14
|
+
var labelStack = _ref.labelStack,
|
|
15
|
+
startTime = _ref.startTime,
|
|
16
|
+
commitTime = _ref.commitTime,
|
|
17
|
+
actualDuration = _ref.actualDuration,
|
|
18
|
+
type = _ref.type;
|
|
19
|
+
if (labelStack && startTime >= interactionStart) {
|
|
20
|
+
var label = (0, _utils.stringifyLabelStackFully)(labelStack);
|
|
21
|
+
var start = Math.round(startTime);
|
|
22
|
+
var end = Math.round(commitTime);
|
|
23
|
+
var timing = result.get(label) || {
|
|
24
|
+
labelStack: (0, _utils.optimizeLabelStack)(labelStack, reactUFOVersion),
|
|
25
|
+
startTime: start,
|
|
26
|
+
endTime: end,
|
|
27
|
+
mountCount: 0,
|
|
28
|
+
rerenderCount: 0,
|
|
29
|
+
renderDuration: 0
|
|
30
|
+
};
|
|
31
|
+
if (start < timing.startTime) {
|
|
32
|
+
timing.startTime = start;
|
|
33
|
+
}
|
|
34
|
+
if (end > timing.endTime) {
|
|
35
|
+
timing.endTime = end;
|
|
36
|
+
}
|
|
37
|
+
if (type === 'mount') {
|
|
38
|
+
timing.mountCount += 1;
|
|
39
|
+
}
|
|
40
|
+
if (type === 'update') {
|
|
41
|
+
timing.rerenderCount += 1;
|
|
42
|
+
}
|
|
43
|
+
if (_interactionMetrics.segmentUnmountCache.has(label) && (0, _platformFeatureFlags.fg)('platform_ufo_segment_unmount_count')) {
|
|
44
|
+
timing.unmountCount = _interactionMetrics.segmentUnmountCache.get(label) || 0;
|
|
45
|
+
_interactionMetrics.segmentUnmountCache.delete(label);
|
|
46
|
+
}
|
|
47
|
+
timing.renderDuration += Math.round(actualDuration);
|
|
48
|
+
result.set(label, timing);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}, new Map());
|
|
52
|
+
return (0, _toConsumableArray2.default)(reactProfilerTimingsMap.values());
|
|
53
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.optimizeRequestInfo = optimizeRequestInfo;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _utils = require("../common/utils");
|
|
10
|
+
function optimizeRequestInfo(requestInfo, interactionStart, reactUFOVersion) {
|
|
11
|
+
var updatedRequestInfo = requestInfo.reduce(function (result, reqInfo) {
|
|
12
|
+
var labelStack = reqInfo.labelStack,
|
|
13
|
+
name = reqInfo.name,
|
|
14
|
+
start = reqInfo.start,
|
|
15
|
+
end = reqInfo.end,
|
|
16
|
+
networkStart = reqInfo.networkStart,
|
|
17
|
+
networkComplete = reqInfo.networkComplete;
|
|
18
|
+
var startTime = networkStart !== null && networkStart !== void 0 ? networkStart : start;
|
|
19
|
+
var endTime = networkComplete !== null && networkComplete !== void 0 ? networkComplete : end;
|
|
20
|
+
if (labelStack && start >= interactionStart && endTime) {
|
|
21
|
+
result.push({
|
|
22
|
+
labelStack: (0, _utils.optimizeLabelStack)([].concat((0, _toConsumableArray2.default)(labelStack), [{
|
|
23
|
+
name: name
|
|
24
|
+
}]), reactUFOVersion),
|
|
25
|
+
startTime: Math.round(startTime),
|
|
26
|
+
endTime: Math.round(endTime)
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}, []);
|
|
31
|
+
return updatedRequestInfo;
|
|
32
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.optimizeSpans = optimizeSpans;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _utils = require("../common/utils");
|
|
10
|
+
function optimizeSpans(spans, interactionStart, reactUFOVersion) {
|
|
11
|
+
var updatedSpans = spans.reduce(function (result, span) {
|
|
12
|
+
var labelStack = span.labelStack,
|
|
13
|
+
type = span.type,
|
|
14
|
+
name = span.name,
|
|
15
|
+
start = span.start,
|
|
16
|
+
end = span.end;
|
|
17
|
+
if (labelStack && start >= interactionStart) {
|
|
18
|
+
result.push({
|
|
19
|
+
labelStack: (0, _utils.optimizeLabelStack)([].concat((0, _toConsumableArray2.default)(labelStack), [{
|
|
20
|
+
name: name
|
|
21
|
+
}]), reactUFOVersion),
|
|
22
|
+
startTime: Math.round(start),
|
|
23
|
+
endTime: Math.round(end),
|
|
24
|
+
type: type
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}, []);
|
|
29
|
+
return updatedSpans;
|
|
30
|
+
}
|
|
@@ -135,7 +135,7 @@ function init(analyticsWebClientAsync, config) {
|
|
|
135
135
|
startTime: 0
|
|
136
136
|
});
|
|
137
137
|
}
|
|
138
|
-
if (config !== null && config !== void 0 && (_config$extraInteract = config.extraInteractionMetrics) !== null && _config$extraInteract !== void 0 && _config$extraInteract.enabled
|
|
138
|
+
if (config !== null && config !== void 0 && (_config$extraInteract = config.extraInteractionMetrics) !== null && _config$extraInteract !== void 0 && _config$extraInteract.enabled) {
|
|
139
139
|
_interactionMetrics.interactionExtraMetrics.initializeVCObserver(vcOptions);
|
|
140
140
|
}
|
|
141
141
|
}
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
2
2
|
import coinflip from '../coinflip';
|
|
3
|
-
import { getConfig, getExtraInteractionRate } from '../config';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { DEFAULT_TTVC_REVISION, getConfig, getExtraInteractionRate, getMostRecentVCRevision } from '../config';
|
|
4
|
+
import { buildSegmentTree, getOldSegmentsLabelStack, optimizeLabelStack, sanitizeUfoName } from '../create-payload/common/utils';
|
|
5
|
+
import { getMoreAccuratePageVisibilityUpToTTAI } from '../create-payload/utils/get-more-accurate-page-visibility-up-to-ttai';
|
|
6
6
|
import getPageVisibilityUpToTTAI from '../create-payload/utils/get-page-visibility-up-to-ttai';
|
|
7
7
|
import getPayloadSize from '../create-payload/utils/get-payload-size';
|
|
8
8
|
import { getReactUFOPayloadVersion } from '../create-payload/utils/get-react-ufo-payload-version';
|
|
9
9
|
import getTTAI from '../create-payload/utils/get-ttai';
|
|
10
10
|
import getVCMetrics from '../create-payload/utils/get-vc-metrics';
|
|
11
|
+
import { optimizeApdex } from '../create-payload/utils/optimize-apdex';
|
|
12
|
+
import { optimizeCustomTimings } from '../create-payload/utils/optimize-custom-timings';
|
|
13
|
+
import { optimizeHoldInfo } from '../create-payload/utils/optimize-hold-info';
|
|
14
|
+
import { optimizeMarks } from '../create-payload/utils/optimize-marks';
|
|
15
|
+
import { optimizeReactProfilerTimings } from '../create-payload/utils/optimize-react-profiler-timings';
|
|
16
|
+
import { optimizeRequestInfo } from '../create-payload/utils/optimize-request-info';
|
|
17
|
+
import { optimizeSpans } from '../create-payload/utils/optimize-spans';
|
|
18
|
+
import { interactionSpans as atlaskitInteractionSpans } from '../interaction-metrics';
|
|
11
19
|
async function createInteractionExtraLogPayload(interactionId, interaction) {
|
|
12
|
-
var _getTTAI,
|
|
20
|
+
var _getTTAI, _getMostRecentVCRevis, _window$location;
|
|
13
21
|
const config = getConfig();
|
|
14
22
|
if (!config) {
|
|
15
23
|
throw Error('UFO Configuration not provided');
|
|
@@ -42,9 +50,49 @@ async function createInteractionExtraLogPayload(interactionId, interaction) {
|
|
|
42
50
|
const moreAccuratePageVisibilityAtTTAI = calculatePageVisibilityFromTheStartOfPageLoad ? getMoreAccuratePageVisibilityUpToTTAI(interaction) : null;
|
|
43
51
|
const extraTTAI = (_getTTAI = getTTAI(interaction)) !== null && _getTTAI !== void 0 ? _getTTAI : undefined;
|
|
44
52
|
const newUFOName = sanitizeUfoName(ufoName);
|
|
53
|
+
const mostRecentVCRevision = (_getMostRecentVCRevis = getMostRecentVCRevision(newUFOName)) !== null && _getMostRecentVCRevis !== void 0 ? _getMostRecentVCRevis : DEFAULT_TTVC_REVISION;
|
|
45
54
|
const finalVCMetrics = await getVCMetrics(interaction, true);
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
|
|
56
|
+
// Helper function to check if labelStack contains third-party type
|
|
57
|
+
const isThirdParty = labelStack => {
|
|
58
|
+
var _labelStack$some;
|
|
59
|
+
return (_labelStack$some = labelStack === null || labelStack === void 0 ? void 0 : labelStack.some(entry => 'type' in entry && entry.type === 'third-party')) !== null && _labelStack$some !== void 0 ? _labelStack$some : false;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// Pre-filter 3p data
|
|
63
|
+
const filteredData = {
|
|
64
|
+
errors: interaction.errors.filter(error => isThirdParty(error.labelStack)),
|
|
65
|
+
spans: [...interaction.spans, ...atlaskitInteractionSpans].filter(span => isThirdParty(span.labelStack)),
|
|
66
|
+
requestInfo: interaction.requestInfo.filter(req => isThirdParty(req.labelStack)),
|
|
67
|
+
customTimings: interaction.customTimings.filter(timing => isThirdParty(timing.labelStack)),
|
|
68
|
+
apdex: interaction.apdex.filter(apdex => isThirdParty(apdex.labelStack)),
|
|
69
|
+
reactProfilerTimings: interaction.reactProfilerTimings.filter(timing => isThirdParty(timing.labelStack)),
|
|
70
|
+
customData: interaction.customData.filter(data => isThirdParty(data.labelStack)),
|
|
71
|
+
segments: knownSegments.filter(segment => isThirdParty(segment.labelStack)),
|
|
72
|
+
marks: interaction.marks.filter(mark => isThirdParty(mark.labelStack))
|
|
73
|
+
};
|
|
74
|
+
// Clear atlaskit spans after filtering
|
|
75
|
+
atlaskitInteractionSpans.length = 0;
|
|
76
|
+
|
|
77
|
+
// Detailed payload
|
|
78
|
+
const getDetailedInteractionMetrics = () => {
|
|
79
|
+
var _interaction$hold3pIn;
|
|
80
|
+
return {
|
|
81
|
+
errors: filteredData.errors.map(({
|
|
82
|
+
labelStack,
|
|
83
|
+
...others
|
|
84
|
+
}) => ({
|
|
85
|
+
...others,
|
|
86
|
+
labelStack: labelStack && optimizeLabelStack(labelStack, getReactUFOPayloadVersion(interaction.type))
|
|
87
|
+
})),
|
|
88
|
+
holdActive: interaction.hold3pActive ? [...interaction.hold3pActive.values()] : [],
|
|
89
|
+
holdInfo: optimizeHoldInfo((_interaction$hold3pIn = interaction.hold3pInfo) !== null && _interaction$hold3pIn !== void 0 ? _interaction$hold3pIn : [], start, getReactUFOPayloadVersion(interaction.type)),
|
|
90
|
+
spans: optimizeSpans(filteredData.spans, start, getReactUFOPayloadVersion(interaction.type)),
|
|
91
|
+
requestInfo: optimizeRequestInfo(filteredData.requestInfo, start, getReactUFOPayloadVersion(interaction.type)),
|
|
92
|
+
customTimings: optimizeCustomTimings(filteredData.customTimings, start)
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
const segments3p = !fg('platform_ufo_remove_deprecated_config_fields') && config.killswitchNestedSegments ? [] : filteredData.segments;
|
|
48
96
|
const segmentTree = getReactUFOPayloadVersion(interaction.type) === '2.0.0' ? buildSegmentTree(segments3p.map(segment => segment.labelStack)) : {};
|
|
49
97
|
const payload = {
|
|
50
98
|
actionSubject: 'experience',
|
|
@@ -85,9 +133,14 @@ async function createInteractionExtraLogPayload(interactionId, interaction) {
|
|
|
85
133
|
start: Math.round(start),
|
|
86
134
|
'metric:ttai:3p': extraTTAI,
|
|
87
135
|
...finalVCMetrics,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
136
|
+
segments: getReactUFOPayloadVersion(interaction.type) === '2.0.0' ? segmentTree : getOldSegmentsLabelStack(segments3p, interaction.type),
|
|
137
|
+
marks: optimizeMarks(filteredData.marks, getReactUFOPayloadVersion(interaction.type)),
|
|
138
|
+
apdex: optimizeApdex(filteredData.apdex, getReactUFOPayloadVersion(interaction.type)),
|
|
139
|
+
reactProfilerTimings: optimizeReactProfilerTimings(filteredData.reactProfilerTimings, start, getReactUFOPayloadVersion(interaction.type)),
|
|
140
|
+
customData: filteredData.customData,
|
|
141
|
+
...getDetailedInteractionMetrics()
|
|
142
|
+
},
|
|
143
|
+
'vc:effective:revision': mostRecentVCRevision
|
|
91
144
|
}
|
|
92
145
|
}
|
|
93
146
|
};
|
|
@@ -13,7 +13,7 @@ import { getBm3Timings } from '../custom-timings';
|
|
|
13
13
|
import { getGlobalErrorCount } from '../global-error-handler';
|
|
14
14
|
import { getPageVisibilityState } from '../hidden-timing';
|
|
15
15
|
import * as initialPageLoadExtraTiming from '../initial-page-load-extra-timing';
|
|
16
|
-
import { interactionSpans as atlaskitInteractionSpans
|
|
16
|
+
import { interactionSpans as atlaskitInteractionSpans } from '../interaction-metrics';
|
|
17
17
|
import { createMemoryStateReport, createPressureStateReport } from '../machine-utilisation';
|
|
18
18
|
import * as resourceTiming from '../resource-timing';
|
|
19
19
|
import { filterResourceTimings } from '../resource-timing/common/utils/resource-timing-buffer';
|
|
@@ -24,6 +24,7 @@ import { createCriticalMetricsPayloads } from './critical-metrics-payload';
|
|
|
24
24
|
import { addPerformanceMeasures } from './utils/add-performance-measures';
|
|
25
25
|
import { getBrowserMetadataToLegacyFormat } from './utils/get-browser-metadata';
|
|
26
26
|
import getInteractionStatus from './utils/get-interaction-status';
|
|
27
|
+
import { getMoreAccuratePageVisibilityUpToTTAI } from './utils/get-more-accurate-page-visibility-up-to-ttai';
|
|
27
28
|
import { getNavigationMetricsToLegacyFormat } from './utils/get-navigation-metrics';
|
|
28
29
|
import getPageVisibilityUpToTTAI from './utils/get-page-visibility-up-to-ttai';
|
|
29
30
|
import { getPaintMetricsToLegacyFormat } from './utils/get-paint-metrics';
|
|
@@ -33,6 +34,14 @@ import getSSRDoneTimeValue from './utils/get-ssr-done-time-value';
|
|
|
33
34
|
import getSSRSuccessUtil from './utils/get-ssr-success';
|
|
34
35
|
import getTTAI from './utils/get-ttai';
|
|
35
36
|
import getVCMetrics from './utils/get-vc-metrics';
|
|
37
|
+
import { getVisibilityStateFromPerformance } from './utils/get-visibility-state-from-performance';
|
|
38
|
+
import { optimizeApdex } from './utils/optimize-apdex';
|
|
39
|
+
import { optimizeCustomTimings } from './utils/optimize-custom-timings';
|
|
40
|
+
import { optimizeHoldInfo } from './utils/optimize-hold-info';
|
|
41
|
+
import { optimizeMarks } from './utils/optimize-marks';
|
|
42
|
+
import { optimizeReactProfilerTimings } from './utils/optimize-react-profiler-timings';
|
|
43
|
+
import { optimizeRequestInfo } from './utils/optimize-request-info';
|
|
44
|
+
import { optimizeSpans } from './utils/optimize-spans';
|
|
36
45
|
function getUfoNameOverride(interaction) {
|
|
37
46
|
const {
|
|
38
47
|
ufoName,
|
|
@@ -81,34 +90,6 @@ function getPageVisibilityUpToTTI(interaction) {
|
|
|
81
90
|
const bm3EndTimeOrInteractionEndTime = getBm3EndTimeOrFallbackValue(interaction);
|
|
82
91
|
return getPageVisibilityState(start, bm3EndTimeOrInteractionEndTime);
|
|
83
92
|
}
|
|
84
|
-
function getVisibilityStateFromPerformance(stop) {
|
|
85
|
-
try {
|
|
86
|
-
const results = performance.getEntriesByType('visibility-state');
|
|
87
|
-
if (!results || results.length === 0) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
return results.reduce((acc = null, {
|
|
91
|
-
name,
|
|
92
|
-
startTime
|
|
93
|
-
}) => {
|
|
94
|
-
if (startTime > stop) {
|
|
95
|
-
return acc;
|
|
96
|
-
}
|
|
97
|
-
if (acc === null && name === null) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
if (acc === null) {
|
|
101
|
-
return name;
|
|
102
|
-
}
|
|
103
|
-
if (acc !== name) {
|
|
104
|
-
return 'mixed';
|
|
105
|
-
}
|
|
106
|
-
return acc;
|
|
107
|
-
}, null);
|
|
108
|
-
} catch (e) {
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
93
|
function getMoreAccuratePageVisibilityUpToTTI(interaction) {
|
|
113
94
|
const old = getPageVisibilityUpToTTI(interaction);
|
|
114
95
|
const tti = getEarliestLegacyStopTime(interaction, []);
|
|
@@ -124,17 +105,6 @@ function getMoreAccuratePageVisibilityUpToTTI(interaction) {
|
|
|
124
105
|
}
|
|
125
106
|
return old;
|
|
126
107
|
}
|
|
127
|
-
export function getMoreAccuratePageVisibilityUpToTTAI(interaction) {
|
|
128
|
-
const old = getPageVisibilityUpToTTAI(interaction);
|
|
129
|
-
const buffered = getVisibilityStateFromPerformance(interaction.end);
|
|
130
|
-
if (!buffered) {
|
|
131
|
-
return old;
|
|
132
|
-
}
|
|
133
|
-
if (buffered !== old) {
|
|
134
|
-
return 'mixed';
|
|
135
|
-
}
|
|
136
|
-
return old;
|
|
137
|
-
}
|
|
138
108
|
function getResourceTimings(start, end) {
|
|
139
109
|
var _resourceTiming$getRe;
|
|
140
110
|
return (_resourceTiming$getRe = resourceTiming.getResourceTimings(start, end)) !== null && _resourceTiming$getRe !== void 0 ? _resourceTiming$getRe : undefined;
|
|
@@ -291,49 +261,6 @@ function optimizeCustomData(interaction) {
|
|
|
291
261
|
}
|
|
292
262
|
return [...customDataMap.values()];
|
|
293
263
|
}
|
|
294
|
-
function optimizeReactProfilerTimings(reactProfilerTimings, interactionStart, reactUFOVersion) {
|
|
295
|
-
const reactProfilerTimingsMap = reactProfilerTimings.reduce((result, {
|
|
296
|
-
labelStack,
|
|
297
|
-
startTime,
|
|
298
|
-
commitTime,
|
|
299
|
-
actualDuration,
|
|
300
|
-
type
|
|
301
|
-
}) => {
|
|
302
|
-
if (labelStack && startTime >= interactionStart) {
|
|
303
|
-
const label = stringifyLabelStackFully(labelStack);
|
|
304
|
-
const start = Math.round(startTime);
|
|
305
|
-
const end = Math.round(commitTime);
|
|
306
|
-
const timing = result.get(label) || {
|
|
307
|
-
labelStack: optimizeLabelStack(labelStack, reactUFOVersion),
|
|
308
|
-
startTime: start,
|
|
309
|
-
endTime: end,
|
|
310
|
-
mountCount: 0,
|
|
311
|
-
rerenderCount: 0,
|
|
312
|
-
renderDuration: 0
|
|
313
|
-
};
|
|
314
|
-
if (start < timing.startTime) {
|
|
315
|
-
timing.startTime = start;
|
|
316
|
-
}
|
|
317
|
-
if (end > timing.endTime) {
|
|
318
|
-
timing.endTime = end;
|
|
319
|
-
}
|
|
320
|
-
if (type === 'mount') {
|
|
321
|
-
timing.mountCount += 1;
|
|
322
|
-
}
|
|
323
|
-
if (type === 'update') {
|
|
324
|
-
timing.rerenderCount += 1;
|
|
325
|
-
}
|
|
326
|
-
if (segmentUnmountCache.has(label) && fg('platform_ufo_segment_unmount_count')) {
|
|
327
|
-
timing.unmountCount = segmentUnmountCache.get(label) || 0;
|
|
328
|
-
segmentUnmountCache.delete(label);
|
|
329
|
-
}
|
|
330
|
-
timing.renderDuration += Math.round(actualDuration);
|
|
331
|
-
result.set(label, timing);
|
|
332
|
-
}
|
|
333
|
-
return result;
|
|
334
|
-
}, new Map());
|
|
335
|
-
return [...reactProfilerTimingsMap.values()];
|
|
336
|
-
}
|
|
337
264
|
function optimizeRedirects(redirects, interactionStart) {
|
|
338
265
|
let lastRedirectTime = interactionStart;
|
|
339
266
|
const updatedRedirects = redirects.sort((a, b) => a.time - b.time).reduce((result, redirect) => {
|
|
@@ -355,128 +282,6 @@ function optimizeRedirects(redirects, interactionStart) {
|
|
|
355
282
|
}, []);
|
|
356
283
|
return updatedRedirects;
|
|
357
284
|
}
|
|
358
|
-
export function optimizeHoldInfo(holdInfo, interactionStart, reactUFOVersion) {
|
|
359
|
-
const holdInfoMap = holdInfo.reduce((result, hold) => {
|
|
360
|
-
const {
|
|
361
|
-
labelStack,
|
|
362
|
-
name,
|
|
363
|
-
start,
|
|
364
|
-
end,
|
|
365
|
-
ignoreOnSubmit
|
|
366
|
-
} = hold;
|
|
367
|
-
if (labelStack && !ignoreOnSubmit && start >= interactionStart) {
|
|
368
|
-
const label = stringifyLabelStackFully([...labelStack, {
|
|
369
|
-
name
|
|
370
|
-
}]);
|
|
371
|
-
const startTime = Math.round(start);
|
|
372
|
-
const endTime = Math.round(end);
|
|
373
|
-
const timing = result.get(label) || {
|
|
374
|
-
labelStack: optimizeLabelStack([...labelStack, {
|
|
375
|
-
name
|
|
376
|
-
}], reactUFOVersion),
|
|
377
|
-
startTime,
|
|
378
|
-
endTime
|
|
379
|
-
};
|
|
380
|
-
if (startTime < timing.startTime) {
|
|
381
|
-
timing.startTime = startTime;
|
|
382
|
-
}
|
|
383
|
-
if (endTime > timing.endTime) {
|
|
384
|
-
timing.endTime = endTime;
|
|
385
|
-
}
|
|
386
|
-
result.set(label, timing);
|
|
387
|
-
}
|
|
388
|
-
return result;
|
|
389
|
-
}, new Map());
|
|
390
|
-
return [...holdInfoMap.values()];
|
|
391
|
-
}
|
|
392
|
-
function optimizeSpans(spans, interactionStart, reactUFOVersion) {
|
|
393
|
-
const updatedSpans = spans.reduce((result, span) => {
|
|
394
|
-
const {
|
|
395
|
-
labelStack,
|
|
396
|
-
type,
|
|
397
|
-
name,
|
|
398
|
-
start,
|
|
399
|
-
end
|
|
400
|
-
} = span;
|
|
401
|
-
if (labelStack && start >= interactionStart) {
|
|
402
|
-
result.push({
|
|
403
|
-
labelStack: optimizeLabelStack([...labelStack, {
|
|
404
|
-
name
|
|
405
|
-
}], reactUFOVersion),
|
|
406
|
-
startTime: Math.round(start),
|
|
407
|
-
endTime: Math.round(end),
|
|
408
|
-
type
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
return result;
|
|
412
|
-
}, []);
|
|
413
|
-
return updatedSpans;
|
|
414
|
-
}
|
|
415
|
-
function optimizeRequestInfo(requestInfo, interactionStart, reactUFOVersion) {
|
|
416
|
-
const updatedRequestInfo = requestInfo.reduce((result, reqInfo) => {
|
|
417
|
-
const {
|
|
418
|
-
labelStack,
|
|
419
|
-
name,
|
|
420
|
-
start,
|
|
421
|
-
end,
|
|
422
|
-
networkStart,
|
|
423
|
-
networkComplete
|
|
424
|
-
} = reqInfo;
|
|
425
|
-
const startTime = networkStart !== null && networkStart !== void 0 ? networkStart : start;
|
|
426
|
-
const endTime = networkComplete !== null && networkComplete !== void 0 ? networkComplete : end;
|
|
427
|
-
if (labelStack && start >= interactionStart && endTime) {
|
|
428
|
-
result.push({
|
|
429
|
-
labelStack: optimizeLabelStack([...labelStack, {
|
|
430
|
-
name
|
|
431
|
-
}], reactUFOVersion),
|
|
432
|
-
startTime: Math.round(startTime),
|
|
433
|
-
endTime: Math.round(endTime)
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
return result;
|
|
437
|
-
}, []);
|
|
438
|
-
return updatedRequestInfo;
|
|
439
|
-
}
|
|
440
|
-
function optimizeCustomTimings(customTimings, interactionStart) {
|
|
441
|
-
return customTimings.reduce((result, item) => {
|
|
442
|
-
Object.keys(item.data).forEach(key => {
|
|
443
|
-
if (item.data[key].startTime >= interactionStart) {
|
|
444
|
-
result.push({
|
|
445
|
-
labelStack: [{
|
|
446
|
-
n: key
|
|
447
|
-
}],
|
|
448
|
-
startTime: Math.round(item.data[key].startTime),
|
|
449
|
-
endTime: Math.round(item.data[key].endTime)
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
});
|
|
453
|
-
return result;
|
|
454
|
-
}, []);
|
|
455
|
-
}
|
|
456
|
-
function optimizeMarks(marks, reactUFOVersion) {
|
|
457
|
-
return marks.map(({
|
|
458
|
-
labelStack,
|
|
459
|
-
time,
|
|
460
|
-
...others
|
|
461
|
-
}) => ({
|
|
462
|
-
...others,
|
|
463
|
-
labelStack: labelStack && optimizeLabelStack(labelStack, reactUFOVersion),
|
|
464
|
-
time: Math.round(time)
|
|
465
|
-
}));
|
|
466
|
-
}
|
|
467
|
-
function optimizeApdex(apdex, reactUFOVersion) {
|
|
468
|
-
return apdex.map(({
|
|
469
|
-
stopTime,
|
|
470
|
-
labelStack,
|
|
471
|
-
...others
|
|
472
|
-
}) => ({
|
|
473
|
-
...others,
|
|
474
|
-
stopTime: Math.round(stopTime),
|
|
475
|
-
...(labelStack ? {
|
|
476
|
-
labelStack: optimizeLabelStack(labelStack, reactUFOVersion)
|
|
477
|
-
} : {})
|
|
478
|
-
}));
|
|
479
|
-
}
|
|
480
285
|
function objectToArray(obj = {}) {
|
|
481
286
|
return Object.keys(obj).reduce((result, key) => {
|
|
482
287
|
result.push({
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import getPageVisibilityUpToTTAI from './get-page-visibility-up-to-ttai';
|
|
2
|
+
import { getVisibilityStateFromPerformance } from './get-visibility-state-from-performance';
|
|
3
|
+
export function getMoreAccuratePageVisibilityUpToTTAI(interaction) {
|
|
4
|
+
const old = getPageVisibilityUpToTTAI(interaction);
|
|
5
|
+
const buffered = getVisibilityStateFromPerformance(interaction.end);
|
|
6
|
+
if (!buffered) {
|
|
7
|
+
return old;
|
|
8
|
+
}
|
|
9
|
+
if (buffered !== old) {
|
|
10
|
+
return 'mixed';
|
|
11
|
+
}
|
|
12
|
+
return old;
|
|
13
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function getVisibilityStateFromPerformance(stop) {
|
|
2
|
+
try {
|
|
3
|
+
const results = performance.getEntriesByType('visibility-state');
|
|
4
|
+
if (!results || results.length === 0) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
return results.reduce((acc = null, {
|
|
8
|
+
name,
|
|
9
|
+
startTime
|
|
10
|
+
}) => {
|
|
11
|
+
if (startTime > stop) {
|
|
12
|
+
return acc;
|
|
13
|
+
}
|
|
14
|
+
if (acc === null && name === null) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
if (acc === null) {
|
|
18
|
+
return name;
|
|
19
|
+
}
|
|
20
|
+
if (acc !== name) {
|
|
21
|
+
return 'mixed';
|
|
22
|
+
}
|
|
23
|
+
return acc;
|
|
24
|
+
}, null);
|
|
25
|
+
} catch (e) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { optimizeLabelStack } from '../common/utils';
|
|
2
|
+
export function optimizeApdex(apdex, reactUFOVersion) {
|
|
3
|
+
return apdex.map(({
|
|
4
|
+
stopTime,
|
|
5
|
+
labelStack,
|
|
6
|
+
...others
|
|
7
|
+
}) => ({
|
|
8
|
+
...others,
|
|
9
|
+
stopTime: Math.round(stopTime),
|
|
10
|
+
...(labelStack ? {
|
|
11
|
+
labelStack: optimizeLabelStack(labelStack, reactUFOVersion)
|
|
12
|
+
} : {})
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function optimizeCustomTimings(customTimings, interactionStart) {
|
|
2
|
+
return customTimings.reduce((result, item) => {
|
|
3
|
+
Object.keys(item.data).forEach(key => {
|
|
4
|
+
if (item.data[key].startTime >= interactionStart) {
|
|
5
|
+
result.push({
|
|
6
|
+
labelStack: [{
|
|
7
|
+
n: key
|
|
8
|
+
}],
|
|
9
|
+
startTime: Math.round(item.data[key].startTime),
|
|
10
|
+
endTime: Math.round(item.data[key].endTime)
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
return result;
|
|
15
|
+
}, []);
|
|
16
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { optimizeLabelStack, stringifyLabelStackFully } from '../common/utils';
|
|
2
|
+
export function optimizeHoldInfo(holdInfo, interactionStart, reactUFOVersion) {
|
|
3
|
+
const holdInfoMap = holdInfo.reduce((result, hold) => {
|
|
4
|
+
const {
|
|
5
|
+
labelStack,
|
|
6
|
+
name,
|
|
7
|
+
start,
|
|
8
|
+
end,
|
|
9
|
+
ignoreOnSubmit
|
|
10
|
+
} = hold;
|
|
11
|
+
if (labelStack && !ignoreOnSubmit && start >= interactionStart) {
|
|
12
|
+
const label = stringifyLabelStackFully([...labelStack, {
|
|
13
|
+
name
|
|
14
|
+
}]);
|
|
15
|
+
const startTime = Math.round(start);
|
|
16
|
+
const endTime = Math.round(end);
|
|
17
|
+
const timing = result.get(label) || {
|
|
18
|
+
labelStack: optimizeLabelStack([...labelStack, {
|
|
19
|
+
name
|
|
20
|
+
}], reactUFOVersion),
|
|
21
|
+
startTime,
|
|
22
|
+
endTime
|
|
23
|
+
};
|
|
24
|
+
if (startTime < timing.startTime) {
|
|
25
|
+
timing.startTime = startTime;
|
|
26
|
+
}
|
|
27
|
+
if (endTime > timing.endTime) {
|
|
28
|
+
timing.endTime = endTime;
|
|
29
|
+
}
|
|
30
|
+
result.set(label, timing);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}, new Map());
|
|
34
|
+
return [...holdInfoMap.values()];
|
|
35
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { optimizeLabelStack } from '../common/utils';
|
|
2
|
+
export function optimizeMarks(marks, reactUFOVersion) {
|
|
3
|
+
return marks.map(({
|
|
4
|
+
labelStack,
|
|
5
|
+
time,
|
|
6
|
+
...others
|
|
7
|
+
}) => ({
|
|
8
|
+
...others,
|
|
9
|
+
labelStack: labelStack && optimizeLabelStack(labelStack, reactUFOVersion),
|
|
10
|
+
time: Math.round(time)
|
|
11
|
+
}));
|
|
12
|
+
}
|