Skip to content

Commit

Permalink
add detailed resource loading perf metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
EdmondChuiHW committed Jun 1, 2024
1 parent eb2fa0d commit 41fc07c
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
23 changes: 14 additions & 9 deletions front_end/core/host/RNPerfMetrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {type ParsedURL} from '../common/ParsedURL';

import {type DeveloperResourceLoaded} from './UserMetrics';

export type RNReliabilityEventListener = (event: DecoratedReactNativeChromeDevToolsEvent) => void;
Expand Down Expand Up @@ -126,22 +128,23 @@ class RNPerfMetrics {
this.sendEvent({eventName: 'Connection.DebuggingTerminated', params: {reason}});
}

developerResourceLoadingStarted(url: string): void {
const shortUrl = maybeTruncateDeveloperResourceUrl(url);
this.sendEvent({eventName: 'DeveloperResource.LoadingStarted', params: {url: shortUrl}});
developerResourceLoadingStarted(parsedURL: ParsedURL, loadingMethod: DeveloperResourceLoaded): void {
const url = maybeTruncateDeveloperResourceUrl(parsedURL);
this.sendEvent({eventName: 'DeveloperResource.LoadingStarted', params: {url, loadingMethod}});
}

developerResourceLoadingFinished(url: string, result: {
developerResourceLoadingFinished(parsedURL: ParsedURL, loadingMethod: DeveloperResourceLoaded, result: {
success: boolean,
errorDescription?: {
message?: string|null|undefined,
},
}): void {
const shortUrl = maybeTruncateDeveloperResourceUrl(url);
const url = maybeTruncateDeveloperResourceUrl(parsedURL);
this.sendEvent({
eventName: 'DeveloperResource.LoadingFinished',
params: {
url: shortUrl,
url,
loadingMethod,
success: result.success,
errorMessage: result.errorDescription?.message,
},
Expand All @@ -165,9 +168,9 @@ function getPerfTimestamp(): DOMHighResTimeStamp {
return performance.timeOrigin + performance.now();
}

const IS_HTTP = new RegExp('^https?://');
function maybeTruncateDeveloperResourceUrl(url: string): string {
return IS_HTTP.test(url) ? url : `${url.slice(0, 100)} …(omitted ${url.length - 100} characters)`;
function maybeTruncateDeveloperResourceUrl(parsedURL: ParsedURL): string {
const {url} = parsedURL;
return parsedURL.isHttpOrHttps() ? url : `${url.slice(0, 100)} …(omitted ${url.length - 100} characters)`;
}

type CommonEventFields = Readonly<{
Expand Down Expand Up @@ -217,13 +220,15 @@ export type DeveloperResourceLoadingStartedEvent = Readonly<{
eventName: 'DeveloperResource.LoadingStarted',
params: Readonly<{
url: string,
loadingMethod: DeveloperResourceLoaded,
}>,
}>;

export type DeveloperResourceLoadingFinishedEvent = Readonly<{
eventName: 'DeveloperResource.LoadingFinished',
params: Readonly<{
url: string,
loadingMethod: DeveloperResourceLoaded,
success: boolean,
errorMessage: string | null | undefined,
}>,
Expand Down
18 changes: 16 additions & 2 deletions front_end/core/sdk/PageResourceLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,8 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<Event
this.dispatchEventToListeners(Events.Update);
try {
await this.acquireLoadSlot(initiator.target);
Host.rnPerfMetrics.developerResourceLoadingStarted(url);
const resultPromise = this.dispatchLoad(url, initiator);
const result = await resultPromise;
Host.rnPerfMetrics.developerResourceLoadingFinished(url, result);
pageResource.errorMessage = result.errorDescription.message;
pageResource.success = result.success;
if (result.success) {
Expand Down Expand Up @@ -297,26 +295,40 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<Event
try {
if (initiator.target) {
Host.userMetrics.developerResourceLoaded(Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageViaTarget);
Host.rnPerfMetrics.developerResourceLoadingStarted(
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageViaTarget);
const result = await this.loadFromTarget(initiator.target, initiator.frameId, url);
Host.rnPerfMetrics.developerResourceLoadingFinished(
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageViaTarget, result);
return result;
}
const frame = FrameManager.instance().getFrame(initiator.frameId);
if (frame) {
Host.userMetrics.developerResourceLoaded(Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageViaFrame);
Host.rnPerfMetrics.developerResourceLoadingStarted(
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageViaFrame);
const result = await this.loadFromTarget(frame.resourceTreeModel().target(), initiator.frameId, url);
Host.rnPerfMetrics.developerResourceLoadingFinished(
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageViaTarget, result);
return result;
}
} catch (e) {
if (e instanceof Error) {
Host.userMetrics.developerResourceLoaded(Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageFailure);
failureReason = e.message;
}
Host.rnPerfMetrics.developerResourceLoadingFinished(
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageFailure,
{success: false, errorDescription: {message: failureReason}});
}
Host.userMetrics.developerResourceLoaded(Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageFallback);
Host.rnPerfMetrics.developerResourceLoadingStarted(
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.LoadThroughPageFallback);
} else {
const code = getLoadThroughTargetSetting().get() ? Host.UserMetrics.DeveloperResourceLoaded.FallbackPerProtocol :
Host.UserMetrics.DeveloperResourceLoaded.FallbackPerOverride;
Host.userMetrics.developerResourceLoaded(code);
Host.rnPerfMetrics.developerResourceLoadingStarted(parsedURL, code);
}

const result = await MultitargetNetworkManager.instance().loadResource(url);
Expand All @@ -328,6 +340,8 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<Event
result.errorDescription.message =
`Fetch through target failed: ${failureReason}; Fallback: ${result.errorDescription.message}`;
}
Host.rnPerfMetrics.developerResourceLoadingFinished(
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.FallbackAfterFailure, result);
return result;
}

Expand Down

0 comments on commit 41fc07c

Please sign in to comment.