@elastic/synthetics 1.0.0-beta.8 → 1.0.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/README.md +5 -4
- package/dist/cli.js +139 -165
- package/dist/cli.js.map +1 -1
- package/dist/common_types.d.ts +158 -34
- package/dist/common_types.d.ts.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -6
- package/dist/config.js.map +1 -1
- package/dist/core/browser-service.d.ts +1 -1
- package/dist/core/browser-service.d.ts.map +1 -1
- package/dist/core/browser-service.js +7 -6
- package/dist/core/browser-service.js.map +1 -1
- package/dist/core/expect.d.ts +25 -25
- package/dist/core/expect.d.ts.map +1 -1
- package/dist/core/expect.js.map +1 -1
- package/dist/core/gatherer.d.ts +5 -8
- package/dist/core/gatherer.d.ts.map +1 -1
- package/dist/core/gatherer.js +75 -17
- package/dist/core/gatherer.js.map +1 -1
- package/dist/core/index.d.ts +5 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +23 -11
- package/dist/core/index.js.map +1 -1
- package/dist/core/logger.d.ts +0 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +10 -17
- package/dist/core/logger.js.map +1 -1
- package/dist/core/runner.d.ts +12 -63
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +159 -92
- package/dist/core/runner.js.map +1 -1
- package/dist/core/transform.d.ts +37 -0
- package/dist/core/transform.d.ts.map +1 -0
- package/dist/core/transform.js +148 -0
- package/dist/core/transform.js.map +1 -0
- package/dist/dsl/index.js +5 -1
- package/dist/dsl/index.js.map +1 -1
- package/dist/dsl/journey.d.ts +9 -7
- package/dist/dsl/journey.d.ts.map +1 -1
- package/dist/dsl/journey.js +32 -39
- package/dist/dsl/journey.js.map +1 -1
- package/dist/dsl/monitor.d.ts +93 -0
- package/dist/dsl/monitor.d.ts.map +1 -0
- package/dist/dsl/monitor.js +110 -0
- package/dist/dsl/monitor.js.map +1 -0
- package/dist/dsl/step.d.ts +3 -2
- package/dist/dsl/step.d.ts.map +1 -1
- package/dist/dsl/step.js +6 -1
- package/dist/dsl/step.js.map +1 -1
- package/dist/formatter/javascript.d.ts +115 -0
- package/dist/formatter/javascript.d.ts.map +1 -0
- package/dist/formatter/javascript.js +331 -0
- package/dist/formatter/javascript.js.map +1 -0
- package/dist/generator/index.d.ts +24 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +241 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/{reporters/reporter.js → generator/utils.d.ts} +5 -3
- package/dist/generator/utils.d.ts.map +1 -0
- package/dist/generator/utils.js +84 -0
- package/dist/generator/utils.js.map +1 -0
- package/dist/helpers.d.ts +36 -9
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +170 -24
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -26
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +34 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +153 -0
- package/dist/loader.js.map +1 -0
- package/dist/locations/index.d.ts +45 -0
- package/dist/locations/index.d.ts.map +1 -0
- package/dist/locations/index.js +83 -0
- package/dist/locations/index.js.map +1 -0
- package/dist/{reporters/reporter.d.ts → locations/public-locations.d.ts} +12 -8
- package/dist/locations/public-locations.d.ts.map +1 -0
- package/dist/locations/public-locations.js +41 -0
- package/dist/locations/public-locations.js.map +1 -0
- package/dist/options.d.ts +42 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +146 -0
- package/dist/options.js.map +1 -0
- package/dist/plugins/browser-console.d.ts +5 -4
- package/dist/plugins/browser-console.d.ts.map +1 -1
- package/dist/plugins/browser-console.js +47 -24
- package/dist/plugins/browser-console.js.map +1 -1
- package/dist/plugins/index.js +5 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/network.d.ts +24 -31
- package/dist/plugins/network.d.ts.map +1 -1
- package/dist/plugins/network.js +226 -229
- package/dist/plugins/network.js.map +1 -1
- package/dist/plugins/performance.d.ts +4 -19
- package/dist/plugins/performance.d.ts.map +1 -1
- package/dist/plugins/performance.js +6 -5
- package/dist/plugins/performance.js.map +1 -1
- package/dist/plugins/plugin-manager.d.ts +9 -5
- package/dist/plugins/plugin-manager.d.ts.map +1 -1
- package/dist/plugins/plugin-manager.js +46 -30
- package/dist/plugins/plugin-manager.js.map +1 -1
- package/dist/plugins/tracing.d.ts +6 -6
- package/dist/plugins/tracing.d.ts.map +1 -1
- package/dist/plugins/tracing.js +13 -7
- package/dist/plugins/tracing.js.map +1 -1
- package/dist/push/bundler.d.ts +35 -0
- package/dist/push/bundler.d.ts.map +1 -0
- package/dist/push/bundler.js +131 -0
- package/dist/push/bundler.js.map +1 -0
- package/dist/push/index.d.ts +10 -0
- package/dist/push/index.d.ts.map +1 -0
- package/dist/push/index.js +235 -0
- package/dist/push/index.js.map +1 -0
- package/dist/push/kibana_api.d.ts +56 -0
- package/dist/push/kibana_api.d.ts.map +1 -0
- package/dist/push/kibana_api.js +135 -0
- package/dist/push/kibana_api.js.map +1 -0
- package/dist/push/monitor.d.ts +55 -0
- package/dist/push/monitor.d.ts.map +1 -0
- package/dist/push/monitor.js +268 -0
- package/dist/push/monitor.js.map +1 -0
- package/dist/{parse_args.d.ts → push/plugin.d.ts} +9 -6
- package/dist/push/plugin.d.ts.map +1 -0
- package/dist/push/plugin.js +66 -0
- package/dist/push/plugin.js.map +1 -0
- package/dist/push/request.d.ts +45 -0
- package/dist/push/request.d.ts.map +1 -0
- package/dist/push/request.js +109 -0
- package/dist/push/request.js.map +1 -0
- package/dist/push/utils.d.ts +31 -0
- package/dist/push/utils.d.ts.map +1 -0
- package/dist/push/utils.js +64 -0
- package/dist/push/utils.js.map +1 -0
- package/dist/reporters/base.d.ts +14 -6
- package/dist/reporters/base.d.ts.map +1 -1
- package/dist/reporters/base.js +58 -50
- package/dist/reporters/base.js.map +1 -1
- package/dist/reporters/index.d.ts +18 -8
- package/dist/reporters/index.d.ts.map +1 -1
- package/dist/reporters/index.js.map +1 -1
- package/dist/reporters/json.d.ts +17 -62
- package/dist/reporters/json.d.ts.map +1 -1
- package/dist/reporters/json.js +147 -177
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/junit.d.ts +7 -1
- package/dist/reporters/junit.d.ts.map +1 -1
- package/dist/reporters/junit.js +90 -95
- package/dist/reporters/junit.js.map +1 -1
- package/dist/sdk/lh-trace-processor.d.ts +35 -9
- package/dist/sdk/lh-trace-processor.d.ts.map +1 -1
- package/dist/sdk/lh-trace-processor.js +114 -53
- package/dist/sdk/lh-trace-processor.js.map +1 -1
- package/dist/sdk/trace-metrics.d.ts +4 -4
- package/dist/sdk/trace-metrics.d.ts.map +1 -1
- package/dist/sdk/trace-metrics.js +3 -4
- package/dist/sdk/trace-metrics.js.map +1 -1
- package/dist/sdk/trace-processor.d.ts +11 -3
- package/dist/sdk/trace-processor.d.ts.map +1 -1
- package/dist/sdk/trace-processor.js +17 -9
- package/dist/sdk/trace-processor.js.map +1 -1
- package/package.json +38 -30
- package/src/cli.ts +223 -158
- package/src/common_types.ts +191 -34
- package/src/config.ts +1 -1
- package/src/core/expect.ts +58 -24
- package/src/core/gatherer.ts +92 -25
- package/src/core/index.ts +36 -15
- package/src/core/logger.ts +8 -12
- package/src/core/runner.ts +158 -148
- package/src/core/transform.ts +160 -0
- package/src/dsl/journey.ts +41 -21
- package/src/dsl/monitor.ts +152 -0
- package/src/dsl/step.ts +9 -2
- package/src/formatter/javascript.ts +414 -0
- package/src/generator/index.ts +308 -0
- package/src/generator/utils.ts +84 -0
- package/src/helpers.ts +182 -16
- package/src/index.ts +21 -22
- package/src/loader.ts +171 -0
- package/src/locations/index.ts +95 -0
- package/src/{reporters/reporter.ts → locations/public-locations.ts} +12 -9
- package/src/options.ts +175 -0
- package/src/plugins/browser-console.ts +33 -8
- package/src/plugins/network.ts +266 -284
- package/src/plugins/performance.ts +6 -22
- package/src/plugins/plugin-manager.ts +49 -31
- package/src/plugins/tracing.ts +11 -9
- package/src/push/bundler.ts +112 -0
- package/src/push/index.ts +291 -0
- package/src/push/kibana_api.ts +191 -0
- package/src/push/monitor.ts +307 -0
- package/src/push/plugin.ts +66 -0
- package/src/push/request.ts +141 -0
- package/src/push/utils.ts +77 -0
- package/src/reporters/base.ts +63 -52
- package/src/reporters/index.ts +26 -3
- package/src/reporters/json.ts +181 -201
- package/src/reporters/junit.ts +98 -93
- package/src/sdk/lh-trace-processor.ts +132 -68
- package/src/sdk/trace-metrics.ts +8 -4
- package/src/sdk/trace-processor.ts +28 -13
- package/templates/.github/workflows/run-synthetics.yml +27 -0
- package/templates/README.md +21 -0
- package/templates/journeys/advanced-example-helpers.ts +54 -0
- package/templates/journeys/advanced-example.journey.ts +43 -0
- package/templates/journeys/example.journey.ts +18 -0
- package/templates/lightweight/heartbeat.yml +9 -0
- package/templates/synthetics.config.ts +35 -0
- package/CHANGELOG.md +0 -181
- package/NOTICE.txt +0 -221
- package/dist/parse_args.d.ts.map +0 -1
- package/dist/parse_args.js +0 -98
- package/dist/parse_args.js.map +0 -1
- package/dist/reporters/reporter.d.ts.map +0 -1
- package/dist/reporters/reporter.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1895
- package/src/parse_args.ts +0 -146
package/dist/plugins/network.js
CHANGED
|
@@ -24,273 +24,270 @@
|
|
|
24
24
|
*
|
|
25
25
|
*/
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
-
exports.NetworkManager = void 0;
|
|
27
|
+
exports.NetworkManager = exports.NETWORK_ENTRY_SUMBOL = void 0;
|
|
28
|
+
const logger_1 = require("../core/logger");
|
|
28
29
|
const helpers_1 = require("../helpers");
|
|
30
|
+
/**
|
|
31
|
+
* Kibana UI expects the requestStartTime and loadEndTime to be baseline
|
|
32
|
+
* in seconds as they have the logic to convert it to milliseconds before
|
|
33
|
+
* using for offset calculation
|
|
34
|
+
*/
|
|
35
|
+
function epochTimeInSeconds() {
|
|
36
|
+
return (0, helpers_1.getTimestamp)() / 1e6;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Find the first positive number in an array for Resource timing data
|
|
40
|
+
*/
|
|
41
|
+
const firstPositive = (numbers) => {
|
|
42
|
+
for (let i = 0; i < numbers.length; ++i) {
|
|
43
|
+
if (numbers[i] > 0) {
|
|
44
|
+
return numbers[i];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
};
|
|
49
|
+
const roundMilliSecs = (value) => {
|
|
50
|
+
return Math.floor(value * 1000) / 1000;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Used as a key in each Network Request to identify the
|
|
54
|
+
* associated request across distinct lifecycle events
|
|
55
|
+
*/
|
|
56
|
+
exports.NETWORK_ENTRY_SUMBOL = Symbol.for('NetworkEntry');
|
|
29
57
|
class NetworkManager {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
58
|
+
driver;
|
|
59
|
+
_browser;
|
|
60
|
+
_barrierPromises = new Set();
|
|
61
|
+
results = [];
|
|
62
|
+
_currentStep = null;
|
|
63
|
+
constructor(driver) {
|
|
64
|
+
this.driver = driver;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Adds a protection barrier aganist all asynchronous extract operations from
|
|
68
|
+
* request/response object that are happening during page lifecycle, If the
|
|
69
|
+
* page is closed during the extraction, the barrier enforces those operations
|
|
70
|
+
* to not result in exception
|
|
71
|
+
*/
|
|
72
|
+
_addBarrier(page, promise) {
|
|
73
|
+
if (!page)
|
|
74
|
+
return;
|
|
75
|
+
const race = Promise.race([
|
|
76
|
+
new Promise(resolve => page.on('close', () => {
|
|
77
|
+
this._barrierPromises.delete(race);
|
|
78
|
+
resolve();
|
|
79
|
+
})),
|
|
80
|
+
promise,
|
|
81
|
+
]);
|
|
82
|
+
this._barrierPromises.add(race);
|
|
83
|
+
race.then(() => this._barrierPromises.delete(race));
|
|
34
84
|
}
|
|
35
|
-
async start(
|
|
85
|
+
async start() {
|
|
86
|
+
(0, logger_1.log)(`Plugins: started collecting network events`);
|
|
87
|
+
const { client, context } = this.driver;
|
|
36
88
|
const { product } = await client.send('Browser.getVersion');
|
|
37
89
|
const [name, version] = product.split('/');
|
|
38
90
|
this._browser = { name, version };
|
|
39
|
-
await client.send('Network.enable');
|
|
40
91
|
/**
|
|
41
|
-
* Listen for all network events
|
|
92
|
+
* Listen for all network events from PW context
|
|
42
93
|
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
client.on('Network.loadingFinished', this._onLoadingFinished.bind(this));
|
|
48
|
-
client.on('Network.loadingFailed', this._onLoadingFailed.bind(this));
|
|
94
|
+
context.on('request', this._onRequest.bind(this));
|
|
95
|
+
context.on('response', this._onResponse.bind(this));
|
|
96
|
+
context.on('requestfinished', this._onRequestCompleted.bind(this));
|
|
97
|
+
context.on('requestfailed', this._onRequestCompleted.bind(this));
|
|
49
98
|
}
|
|
50
|
-
|
|
51
|
-
return
|
|
99
|
+
_findNetworkEntry(request) {
|
|
100
|
+
return request[exports.NETWORK_ENTRY_SUMBOL];
|
|
52
101
|
}
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
const { url, method } = request;
|
|
102
|
+
_onRequest(request) {
|
|
103
|
+
const url = request.url();
|
|
56
104
|
/**
|
|
57
105
|
* Data URI should not show up as network requests
|
|
58
106
|
*/
|
|
59
107
|
if (url.startsWith('data:')) {
|
|
60
108
|
return;
|
|
61
109
|
}
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
/**
|
|
65
|
-
* On redirects, another `requestWillBeSent` event will be fired for the
|
|
66
|
-
* same requestId. We calculate the timings for the redirect request using
|
|
67
|
-
* the `redirectedResponse` from the redirected request.
|
|
68
|
-
*/
|
|
69
|
-
if (record) {
|
|
70
|
-
if (event.redirectResponse) {
|
|
71
|
-
const response = event.redirectResponse;
|
|
72
|
-
const data = Object.assign(event, {
|
|
73
|
-
type: event.type,
|
|
74
|
-
response,
|
|
75
|
-
encodedDataLength: response.encodedDataLength,
|
|
76
|
-
});
|
|
77
|
-
this._onResponseReceived(data);
|
|
78
|
-
this._onLoadingFinished(data);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
/**
|
|
82
|
-
* Edge case, we handle it to proceed with next navigation
|
|
83
|
-
*/
|
|
84
|
-
this._onLoadingFailed(Object.assign(event, {
|
|
85
|
-
type: event.type,
|
|
86
|
-
errorText: 'redirectResponse data is not available',
|
|
87
|
-
}));
|
|
88
|
-
}
|
|
89
|
-
const redirectedRecord = this._findNetworkRecord(requestId);
|
|
90
|
-
/**
|
|
91
|
-
* Rewrite the map with new redirect id to not reset
|
|
92
|
-
* the redirect request with original request
|
|
93
|
-
*/
|
|
94
|
-
this._InflightRequestMap.delete(requestId);
|
|
95
|
-
this._InflightRequestMap.set(`redirect:${timestamp}:${requestId}`, redirectedRecord);
|
|
96
|
-
}
|
|
97
|
-
this._InflightRequestMap.set(requestId, {
|
|
110
|
+
const timestamp = (0, helpers_1.getTimestamp)();
|
|
111
|
+
const networkEntry = {
|
|
98
112
|
browser: this._browser,
|
|
99
113
|
step: this._currentStep,
|
|
100
|
-
timestamp
|
|
114
|
+
timestamp,
|
|
101
115
|
url,
|
|
102
|
-
request,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
116
|
+
type: request.resourceType(),
|
|
117
|
+
request: {
|
|
118
|
+
url,
|
|
119
|
+
method: request.method(),
|
|
120
|
+
headers: request.headers(),
|
|
121
|
+
body: {
|
|
122
|
+
bytes: request.postDataBuffer()?.length || 0,
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
response: {
|
|
126
|
+
status: -1,
|
|
127
|
+
headers: {},
|
|
128
|
+
mimeType: 'x-unknown',
|
|
129
|
+
redirectURL: '',
|
|
130
|
+
},
|
|
131
|
+
isNavigationRequest: request.isNavigationRequest(),
|
|
132
|
+
requestSentTime: epochTimeInSeconds(),
|
|
108
133
|
loadEndTime: -1,
|
|
109
134
|
responseReceivedTime: -1,
|
|
110
|
-
response: null,
|
|
111
135
|
resourceSize: 0,
|
|
112
136
|
transferSize: 0,
|
|
113
|
-
timings:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
* Enhance request headers with additional information
|
|
124
|
-
*/
|
|
125
|
-
record.request.headers = {
|
|
126
|
-
...record.request.headers,
|
|
127
|
-
...headers,
|
|
137
|
+
timings: {
|
|
138
|
+
blocked: -1,
|
|
139
|
+
dns: -1,
|
|
140
|
+
ssl: -1,
|
|
141
|
+
connect: -1,
|
|
142
|
+
send: -1,
|
|
143
|
+
wait: -1,
|
|
144
|
+
receive: -1,
|
|
145
|
+
total: -1,
|
|
146
|
+
},
|
|
128
147
|
};
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (!record) {
|
|
134
|
-
return;
|
|
148
|
+
if (request.redirectedFrom()) {
|
|
149
|
+
const fromEntry = this._findNetworkEntry(request.redirectedFrom());
|
|
150
|
+
if (fromEntry)
|
|
151
|
+
fromEntry.response.redirectURL = request.url();
|
|
135
152
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
record.transferSize += encodedDataLength;
|
|
153
|
+
request[exports.NETWORK_ENTRY_SUMBOL] = networkEntry;
|
|
154
|
+
this.results.push(networkEntry);
|
|
139
155
|
}
|
|
140
|
-
|
|
141
|
-
const
|
|
142
|
-
const
|
|
143
|
-
if (!
|
|
156
|
+
async _onResponse(response) {
|
|
157
|
+
const request = response.request();
|
|
158
|
+
const networkEntry = this._findNetworkEntry(request);
|
|
159
|
+
if (!networkEntry)
|
|
144
160
|
return;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
response,
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
161
|
+
networkEntry.responseReceivedTime = epochTimeInSeconds();
|
|
162
|
+
networkEntry.response = {
|
|
163
|
+
url: response.url(),
|
|
164
|
+
status: response.status(),
|
|
165
|
+
statusText: response.statusText(),
|
|
166
|
+
headers: {},
|
|
167
|
+
mimeType: 'x-unknown',
|
|
168
|
+
redirectURL: networkEntry.response.redirectURL,
|
|
169
|
+
};
|
|
170
|
+
// Gather all resource timing information up until the
|
|
171
|
+
// TTFB(Time to first byte) is received
|
|
172
|
+
const timing = request.timing();
|
|
173
|
+
const blocked = roundMilliSecs(firstPositive([
|
|
174
|
+
timing.domainLookupStart,
|
|
175
|
+
timing.connectStart,
|
|
176
|
+
timing.requestStart,
|
|
177
|
+
])) || -1;
|
|
178
|
+
const dns = timing.domainLookupEnd !== -1
|
|
179
|
+
? roundMilliSecs(timing.domainLookupEnd - timing.domainLookupStart)
|
|
180
|
+
: -1;
|
|
181
|
+
const connect = timing.connectEnd !== -1
|
|
182
|
+
? roundMilliSecs(timing.connectEnd - timing.connectStart)
|
|
183
|
+
: -1;
|
|
184
|
+
const ssl = timing.secureConnectionStart !== -1
|
|
185
|
+
? roundMilliSecs(timing.connectEnd - timing.secureConnectionStart)
|
|
186
|
+
: -1;
|
|
187
|
+
const wait = timing.responseStart !== -1
|
|
188
|
+
? roundMilliSecs(timing.responseStart - timing.requestStart)
|
|
189
|
+
: -1;
|
|
190
|
+
networkEntry.timings = {
|
|
191
|
+
blocked,
|
|
192
|
+
dns,
|
|
193
|
+
ssl,
|
|
194
|
+
connect,
|
|
195
|
+
send: 0,
|
|
196
|
+
wait,
|
|
197
|
+
receive: -1,
|
|
198
|
+
total: -1,
|
|
199
|
+
};
|
|
200
|
+
this._calcTotalTime(networkEntry, timing);
|
|
201
|
+
const page = request.frame().page();
|
|
202
|
+
this._addBarrier(page, request.allHeaders().then(reqHeaders => {
|
|
203
|
+
networkEntry.request.headers = reqHeaders;
|
|
204
|
+
networkEntry.request.referrer = reqHeaders?.referer;
|
|
205
|
+
}));
|
|
206
|
+
this._addBarrier(page, response.allHeaders().then(resHeaders => {
|
|
207
|
+
networkEntry.response.headers = resHeaders;
|
|
208
|
+
const contentType = resHeaders['content-type'];
|
|
209
|
+
if (contentType)
|
|
210
|
+
networkEntry.response.mimeType = contentType.split(';')[0];
|
|
211
|
+
}));
|
|
212
|
+
this._addBarrier(page, response.serverAddr().then(server => {
|
|
213
|
+
networkEntry.response.remoteIPAddress = server?.ipAddress;
|
|
214
|
+
networkEntry.response.remotePort = server?.port;
|
|
215
|
+
}));
|
|
216
|
+
this._addBarrier(page, response.securityDetails().then(details => {
|
|
217
|
+
if (details)
|
|
218
|
+
networkEntry.response.securityDetails = details;
|
|
219
|
+
}));
|
|
160
220
|
}
|
|
161
|
-
|
|
162
|
-
const
|
|
163
|
-
if (!
|
|
221
|
+
async _onRequestCompleted(request) {
|
|
222
|
+
const networkEntry = this._findNetworkEntry(request);
|
|
223
|
+
if (!networkEntry)
|
|
224
|
+
return;
|
|
225
|
+
networkEntry.loadEndTime = epochTimeInSeconds();
|
|
226
|
+
// responseEnd is fired after the last byte of the response is received.
|
|
227
|
+
const timing = request.timing();
|
|
228
|
+
const receive = timing.responseEnd !== -1
|
|
229
|
+
? roundMilliSecs(timing.responseEnd - timing.responseStart)
|
|
230
|
+
: -1;
|
|
231
|
+
networkEntry.timings.receive = receive;
|
|
232
|
+
this._calcTotalTime(networkEntry, timing);
|
|
233
|
+
// For aborted/failed requests sizes will not be present
|
|
234
|
+
if (timing.startTime <= 0) {
|
|
164
235
|
return;
|
|
165
236
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
237
|
+
const page = request.frame().page();
|
|
238
|
+
this._addBarrier(page, request.sizes().then(sizes => {
|
|
239
|
+
networkEntry.request.bytes =
|
|
240
|
+
sizes.requestHeadersSize + sizes.requestBodySize;
|
|
241
|
+
networkEntry.request.body = {
|
|
242
|
+
bytes: sizes.requestBodySize,
|
|
243
|
+
};
|
|
244
|
+
const transferSize = sizes.responseHeadersSize + sizes.responseBodySize;
|
|
245
|
+
networkEntry.transferSize = transferSize;
|
|
246
|
+
networkEntry.response.bytes = transferSize;
|
|
247
|
+
networkEntry.response.body = {
|
|
248
|
+
bytes: sizes.responseBodySize,
|
|
249
|
+
};
|
|
250
|
+
}));
|
|
177
251
|
}
|
|
178
252
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
253
|
+
* Calculates the total time for the network request based on the ResourceTiming
|
|
254
|
+
* data from Playwright. Fallbacks to the event timings if ResourceTiming data
|
|
255
|
+
* is not available.
|
|
181
256
|
*/
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (startTime
|
|
193
|
-
|
|
257
|
+
_calcTotalTime(entry, rtiming) {
|
|
258
|
+
const timings = entry.timings;
|
|
259
|
+
entry.timings.total = [
|
|
260
|
+
timings.blocked,
|
|
261
|
+
timings.dns,
|
|
262
|
+
timings.connect,
|
|
263
|
+
timings.wait,
|
|
264
|
+
timings.receive,
|
|
265
|
+
].reduce((pre, cur) => ((cur || -1) > 0 ? cur + pre : pre), 0);
|
|
266
|
+
// fallback when ResourceTiming data is not available
|
|
267
|
+
if (rtiming.startTime <= 0) {
|
|
268
|
+
const end = entry.loadEndTime ||
|
|
269
|
+
entry.responseReceivedTime ||
|
|
270
|
+
entry.requestSentTime;
|
|
271
|
+
const total = roundMilliSecs((end - entry.requestSentTime) * 1000);
|
|
272
|
+
entry.timings.total = total <= 0 ? -1 : total;
|
|
194
273
|
}
|
|
195
|
-
return responseReceivedTime;
|
|
196
274
|
}
|
|
197
|
-
|
|
198
|
-
* The timing calculations are based on the chrome devtools frontend
|
|
199
|
-
* https://github.com/ChromeDevTools/devtools-frontend/blob/7f5478d8ceb7586f23f4073ab5c2085dac1ec26a/front_end/network/RequestTimingView.js#L98-L193
|
|
200
|
-
*/
|
|
201
|
-
calculateTimings(record) {
|
|
202
|
-
const result = {
|
|
203
|
-
blocked: -1,
|
|
204
|
-
queueing: -1,
|
|
205
|
-
proxy: -1,
|
|
206
|
-
dns: -1,
|
|
207
|
-
ssl: -1,
|
|
208
|
-
connect: -1,
|
|
209
|
-
send: -1,
|
|
210
|
-
wait: -1,
|
|
211
|
-
receive: -1,
|
|
212
|
-
total: -1,
|
|
213
|
-
};
|
|
214
|
-
const { requestSentTime, loadEndTime, responseReceivedTime } = record;
|
|
215
|
-
/**
|
|
216
|
-
* Handle when request failed and no responseReceived event was
|
|
217
|
-
* fired for that particular request
|
|
218
|
-
* Eg: connection refused by remote host
|
|
219
|
-
*/
|
|
220
|
-
const response = record.response || {
|
|
221
|
-
timing: null,
|
|
222
|
-
fromServiceWorker: false,
|
|
223
|
-
};
|
|
224
|
-
const toMilliseconds = (time) => (time === -1 ? -1 : time * 1000);
|
|
225
|
-
const calculateDiffInMs = (name, start, end) => {
|
|
226
|
-
if (start < Number.MAX_VALUE && start <= end) {
|
|
227
|
-
result[name] = toMilliseconds(end - start);
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
const firstPositive = (numbers) => {
|
|
231
|
-
for (let i = 0; i < numbers.length; ++i) {
|
|
232
|
-
if (numbers[i] > 0) {
|
|
233
|
-
return numbers[i];
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
return null;
|
|
237
|
-
};
|
|
275
|
+
async stop() {
|
|
238
276
|
/**
|
|
239
|
-
*
|
|
240
|
-
* from
|
|
277
|
+
* Waiting for all network events is error prone and might hang the tests
|
|
278
|
+
* from getting closed forever when there are upstream bugs in browsers or
|
|
279
|
+
* Playwright. So we log and drop these events once the test run is completed
|
|
241
280
|
*/
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
calculateDiffInMs(name, startTime + start / 1000, startTime + end / 1000);
|
|
245
|
-
}
|
|
246
|
-
};
|
|
247
|
-
const timing = response.timing;
|
|
248
|
-
const actResRcvdTime = this.getResponseReceivedTime(timing, responseReceivedTime);
|
|
249
|
-
const issueTime = requestSentTime;
|
|
250
|
-
const startTime = timing == null ? -1 : timing.requestTime;
|
|
251
|
-
const endTime = firstPositive([loadEndTime, actResRcvdTime]) || startTime;
|
|
252
|
-
if (timing == null) {
|
|
253
|
-
const start = issueTime !== -1 ? issueTime : startTime !== -1 ? startTime : 0;
|
|
254
|
-
const middle = actResRcvdTime === -1 ? Number.MAX_VALUE : actResRcvdTime;
|
|
255
|
-
const end = endTime === -1 ? Number.MAX_VALUE : endTime;
|
|
256
|
-
calculateDiffInMs('total', start, end);
|
|
257
|
-
calculateDiffInMs('blocked', start, middle);
|
|
258
|
-
calculateDiffInMs('receive', middle, end);
|
|
259
|
-
// Check if the request is blocked/stalled for the whole timeframe and
|
|
260
|
-
// calculate timings appropriately for that request
|
|
261
|
-
if (!isFinite(result['blocked'])) {
|
|
262
|
-
result['blocked'] = result['total'];
|
|
263
|
-
}
|
|
264
|
-
return result;
|
|
265
|
-
}
|
|
266
|
-
calculateDiffInMs('total', issueTime < startTime ? issueTime : startTime, endTime);
|
|
267
|
-
if (issueTime < startTime) {
|
|
268
|
-
calculateDiffInMs('queueing', issueTime, startTime);
|
|
281
|
+
if (this._barrierPromises.size > 0) {
|
|
282
|
+
(0, logger_1.log)(`Plugins: dropping ${this._barrierPromises.size} network events`);
|
|
269
283
|
}
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
timing.dnsStart,
|
|
278
|
-
timing.connectStart,
|
|
279
|
-
timing.sendStart,
|
|
280
|
-
responseReceived,
|
|
281
|
-
]) || 0;
|
|
282
|
-
addOffsetRange('blocked', 0, blockingEnd);
|
|
283
|
-
addOffsetRange('proxy', timing.proxyStart, timing.proxyEnd);
|
|
284
|
-
addOffsetRange('dns', timing.dnsStart, timing.dnsEnd);
|
|
285
|
-
addOffsetRange('connect', timing.connectStart, timing.connectEnd);
|
|
286
|
-
addOffsetRange('ssl', timing.sslStart, timing.sslEnd);
|
|
287
|
-
addOffsetRange('send', timing.sendStart, timing.sendEnd);
|
|
288
|
-
addOffsetRange('wait', Math.max(timing.sendEnd, timing.connectEnd, timing.dnsEnd, timing.proxyEnd, blockingEnd), responseReceived);
|
|
289
|
-
}
|
|
290
|
-
calculateDiffInMs('receive', actResRcvdTime, endTime);
|
|
291
|
-
return result;
|
|
292
|
-
}
|
|
293
|
-
stop() {
|
|
284
|
+
const context = this.driver.context;
|
|
285
|
+
context.off('request', this._onRequest.bind(this));
|
|
286
|
+
context.off('response', this._onResponse.bind(this));
|
|
287
|
+
context.off('requestfinished', this._onRequestCompleted.bind(this));
|
|
288
|
+
context.off('requestfailed', this._onRequestCompleted.bind(this));
|
|
289
|
+
this._barrierPromises.clear();
|
|
290
|
+
(0, logger_1.log)(`Plugins: stopped collecting network events`);
|
|
294
291
|
return this.results;
|
|
295
292
|
}
|
|
296
293
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/plugins/network.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/plugins/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,28 +22,13 @@
|
|
|
22
22
|
* THE SOFTWARE.
|
|
23
23
|
*
|
|
24
24
|
*/
|
|
25
|
-
import {
|
|
26
|
-
export interface Metrics {
|
|
27
|
-
Timestamp?: number;
|
|
28
|
-
Documents?: number;
|
|
29
|
-
Frames?: number;
|
|
30
|
-
JSEventListeners?: number;
|
|
31
|
-
Nodes?: number;
|
|
32
|
-
LayoutCount?: number;
|
|
33
|
-
RecalcStyleCount?: number;
|
|
34
|
-
LayoutDuration?: number;
|
|
35
|
-
RecalcStyleDuration?: number;
|
|
36
|
-
ScriptDuration?: number;
|
|
37
|
-
TaskDuration?: number;
|
|
38
|
-
JSHeapUsedSize?: number;
|
|
39
|
-
JSHeapTotalSize?: number;
|
|
40
|
-
}
|
|
25
|
+
import { Driver, PageMetrics } from '../common_types';
|
|
41
26
|
export declare class PerformanceManager {
|
|
42
|
-
private
|
|
43
|
-
constructor(
|
|
27
|
+
private driver;
|
|
28
|
+
constructor(driver: Driver);
|
|
44
29
|
start(): Promise<void>;
|
|
45
30
|
stop(): Promise<void>;
|
|
46
|
-
getMetrics(): Promise<
|
|
31
|
+
getMetrics(): Promise<PageMetrics>;
|
|
47
32
|
private buildMetricsObject;
|
|
48
33
|
}
|
|
49
34
|
//# sourceMappingURL=performance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../src/plugins/performance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../src/plugins/performance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAkBtD,qBAAa,kBAAkB;IACjB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE5B,KAAK;IAIL,IAAI;IAIJ,UAAU;IAKhB,OAAO,CAAC,kBAAkB;CAO3B"}
|
|
@@ -41,17 +41,18 @@ const supportedMetrics = new Set([
|
|
|
41
41
|
'JSHeapTotalSize',
|
|
42
42
|
]);
|
|
43
43
|
class PerformanceManager {
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
driver;
|
|
45
|
+
constructor(driver) {
|
|
46
|
+
this.driver = driver;
|
|
46
47
|
}
|
|
47
48
|
async start() {
|
|
48
|
-
await this.client.send('Performance.enable');
|
|
49
|
+
await this.driver.client.send('Performance.enable');
|
|
49
50
|
}
|
|
50
51
|
async stop() {
|
|
51
|
-
await this.client.send('Performance.disable');
|
|
52
|
+
await this.driver.client.send('Performance.disable');
|
|
52
53
|
}
|
|
53
54
|
async getMetrics() {
|
|
54
|
-
const { metrics } = await this.client.send('Performance.getMetrics');
|
|
55
|
+
const { metrics } = await this.driver.client.send('Performance.getMetrics');
|
|
55
56
|
return this.buildMetricsObject(metrics);
|
|
56
57
|
}
|
|
57
58
|
buildMetricsObject(metrics = []) {
|