diff --git a/.github/scripts/chrome.mts b/.github/scripts/chrome.mts index ac5466ff3e..27c7f0ca39 100644 --- a/.github/scripts/chrome.mts +++ b/.github/scripts/chrome.mts @@ -53,12 +53,16 @@ export type WebSocketConnection = { closedAt?: number; sentFrameCount: number; receivedFrameCount: number; + sentBytes: number; + receivedBytes: number; errorCount: number; }; export type NetworkSummary = { requestCount: number; webSocketConnectionCount: number; + webSocketSentBytes: number; + webSocketReceivedBytes: number; finishedRequestCount: number; failedRequestCount: number; cachedRequestCount: number; @@ -267,6 +271,12 @@ function normalizeHeaders(headers: Record | undefined) { return normalized; } +function webSocketFramePayloadBytes(frame: { opcode?: number; payloadData?: string } | undefined) { + if (frame?.payloadData == null) return 0; + if (frame.opcode === 1) return Buffer.byteLength(frame.payloadData, 'utf8'); + return Buffer.byteLength(frame.payloadData, 'base64'); +} + class CdpClient { private nextId = 1; private callbacks = new Map { const row = webSockets.get(params.requestId); if (row == null) return; row.receivedFrameCount += 1; + row.receivedBytes += webSocketFramePayloadBytes(params.response); }); this.cdp.on('Network.webSocketFrameError', params => { @@ -708,6 +722,8 @@ export function summarizeNetwork(requestRows: NetworkRequest[], baseUrl: string, webSocketConnectionCount: webSocketRows == null ? rows.filter(row => row.resourceType === 'WebSocket').length : webSocketRows.length, + webSocketSentBytes: webSocketRows?.reduce((sum, row) => sum + row.sentBytes, 0) ?? 0, + webSocketReceivedBytes: webSocketRows?.reduce((sum, row) => sum + row.receivedBytes, 0) ?? 0, finishedRequestCount: rows.filter(row => row.finished).length, failedRequestCount: rows.filter(row => row.failed).length, cachedRequestCount: rows.filter(row => row.fromDiskCache).length, diff --git a/.github/scripts/frontend-browser-report.mts b/.github/scripts/frontend-browser-report.mts index d27e278ba7..98fcf266c1 100644 --- a/.github/scripts/frontend-browser-report.mts +++ b/.github/scripts/frontend-browser-report.mts @@ -18,7 +18,9 @@ export type BrowserMeasurement = { durationMs: number; network: { requestCount: number; - webSocketConnectionCount?: number; + webSocketConnectionCount: number; + webSocketSentBytes: number; + webSocketReceivedBytes: number; finishedRequestCount: number; failedRequestCount: number; cachedRequestCount: number; @@ -158,10 +160,6 @@ function resourceTypeSampleBytes(sample: BrowserMeasurementSample, resourceTypes return resourceTypeBytes(sample, resourceTypes); } -function webSocketConnectionCount(report: BrowserMeasurement) { - return report.network.webSocketConnectionCount ?? report.network.byResourceType.WebSocket?.requests ?? 0; -} - function getMetric(report: BrowserMeasurement, key: string) { return report.performance.cdpMetrics[key]; } @@ -170,7 +168,6 @@ function renderSummaryTable(base: BrowserMetricsReport, head: BrowserMetricsRepo const rows = [ //metricRow('Scenario duration', base, head, summary => summary.durationMs, sample => sample.durationMs, formatMs), metricRow('Requests', base, head, summary => summary.network.requestCount, sample => sample.network.requestCount, util.formatNumber), - metricRow('WebSocket connections', base, head, webSocketConnectionCount, webSocketConnectionCount, util.formatNumber), //metricRow('Failed requests', base, head, summary => summary.network.failedRequestCount, sample => sample.network.failedRequestCount, util.formatNumber), metricRow('Encoded network', base, head, summary => summary.network.totalEncodedBytes, sample => sample.network.totalEncodedBytes, util.formatBytes, 10000), metricRow('Decoded body', base, head, summary => summary.network.totalDecodedBodyBytes, sample => sample.network.totalDecodedBodyBytes, util.formatBytes, 10000), @@ -196,6 +193,9 @@ function renderSummaryTable(base: BrowserMetricsReport, head: BrowserMetricsRepo //metricRow('Recalc style count', base, head, summary => getMetric(summary, 'RecalcStyleCount'), sample => getMetric(sample, 'RecalcStyleCount'), util.formatNumber), //metricRow('Script duration', base, head, summary => getMetric(summary, 'ScriptDuration'), sample => getMetric(sample, 'ScriptDuration'), formatSecondsAsMs), //metricRow('Task duration', base, head, summary => getMetric(summary, 'TaskDuration'), sample => getMetric(sample, 'TaskDuration'), formatSecondsAsMs), + metricRow('WebSocket connections', base, head, summary => summary.network.webSocketConnectionCount, sample => sample.network.webSocketConnectionCount, util.formatNumber), + metricRow('WebSocket sent', base, head, summary => summary.network.webSocketSentBytes, sample => sample.network.webSocketSentBytes, util.formatBytes, 10000), + metricRow('WebSocket received', base, head, summary => summary.network.webSocketReceivedBytes, sample => sample.network.webSocketReceivedBytes, util.formatBytes, 10000), ].filter(row => row != null); return [ diff --git a/.github/scripts/measure-frontend-browser-comparison.mts b/.github/scripts/measure-frontend-browser-comparison.mts index 18f2a87874..8c3cf749ed 100644 --- a/.github/scripts/measure-frontend-browser-comparison.mts +++ b/.github/scripts/measure-frontend-browser-comparison.mts @@ -133,6 +133,8 @@ function summarizeNetworkSamples(samples: BrowserMeasurementSample[]): NetworkSu return { requestCount: finiteMedian(samples.map(sample => sample.network.requestCount)), webSocketConnectionCount: finiteMedian(samples.map(sample => sample.network.webSocketConnectionCount)), + webSocketSentBytes: finiteMedian(samples.map(sample => sample.network.webSocketSentBytes)), + webSocketReceivedBytes: finiteMedian(samples.map(sample => sample.network.webSocketReceivedBytes)), finishedRequestCount: finiteMedian(samples.map(sample => sample.network.finishedRequestCount)), failedRequestCount: finiteMedian(samples.map(sample => sample.network.failedRequestCount)), cachedRequestCount: finiteMedian(samples.map(sample => sample.network.cachedRequestCount)),