Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add measure tracing API #9637

Open
wants to merge 2 commits into
base: v2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 18 additions & 8 deletions packages/core/core/src/PackagerRunner.js
Original file line number Diff line number Diff line change
Expand Up @@ -398,9 +398,14 @@ export default class PackagerRunner {
let {name, resolveFrom, plugin} = packager;
let measurement;
try {
measurement = tracer.createMeasurement(name, 'packaging', bundle.name, {
type: bundle.type,
});
measurement =
tracer.enabled &&
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know moving this check to the consumer avoids the function call at all, but is the only reason to change the create signature from individual params to an object? I'm still not sure what the benefit is apart from the naming?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's the naming and flexibility mostly, yeah

tracer.createTraceMeasurement({
name,
args: {bundle: {name: bundle.name, type: bundle.type}},
categories: ['packaging'],
});

return await plugin.package({
config: configs.get(name)?.result,
bundleConfig: bundleConfigs.get(name)?.result,
Expand Down Expand Up @@ -446,6 +451,7 @@ export default class PackagerRunner {
});
} finally {
measurement && measurement.end();

// Add dev dependency for the packager. This must be done AFTER running it due to
// the potential for lazy require() that aren't executed until the request runs.
let devDepRequest = await createDevDependency(
Expand Down Expand Up @@ -505,11 +511,14 @@ export default class PackagerRunner {
for (let optimizer of optimizers) {
let measurement;
try {
measurement = tracer.createMeasurement(
optimizer.name,
'optimize',
bundle.name,
);
measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: optimizer.name,
args: {bundle: bundle.name},
categories: ['optimize'],
});

let next = await optimizer.plugin.optimize({
config: configs.get(optimizer.name)?.result,
bundleConfig: bundleConfigs.get(optimizer.name)?.result,
Expand Down Expand Up @@ -540,6 +549,7 @@ export default class PackagerRunner {
});
} finally {
measurement && measurement.end();

// Add dev dependency for the optimizer. This must be done AFTER running it due to
// the potential for lazy require() that aren't executed until the request runs.
let devDepRequest = await createDevDependency(
Expand Down
10 changes: 8 additions & 2 deletions packages/core/core/src/ReporterRunner.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,15 @@ export default class ReporterRunner {
try {
// To avoid an infinite loop we don't measure trace events, as they'll
// result in another trace!
if (event.type !== 'trace') {
measurement = tracer.createMeasurement(reporter.name, 'reporter');
if (event.type !== 'trace' && event.type !== 'traceStart') {
measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: reporter.name,
categories: ['reporter'],
});
}

await reporter.plugin.report({
event,
options: this.pluginOptions,
Expand Down
14 changes: 9 additions & 5 deletions packages/core/core/src/Transformation.js
Original file line number Diff line number Diff line change
Expand Up @@ -374,11 +374,15 @@ export default class Transformation {
}

try {
const measurement = tracer.createMeasurement(
transformer.name,
'transform',
fromProjectPathRelative(initialAsset.value.filePath),
);
let measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: transformer.name,
args: {
filename: fromProjectPathRelative(initialAsset.value.filePath),
},
categories: ['transform'],
});

let transformerResults = await this.runTransformer(
pipeline,
Expand Down
14 changes: 9 additions & 5 deletions packages/core/core/src/applyRuntimes.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,15 @@ export default async function applyRuntimes<TResult>({
let measurement;
try {
const namedBundle = NamedBundle.get(bundle, bundleGraph, options);
measurement = tracer.createMeasurement(
runtime.name,
'applyRuntime',
namedBundle.displayName,
);

measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: runtime.name,
args: {bundle: namedBundle.displayName},
categories: ['applyRuntime'],
});

let applied = await runtime.plugin.apply({
bundle: namedBundle,
bundleGraph: new BundleGraph<INamedBundle>(
Expand Down
91 changes: 61 additions & 30 deletions packages/core/core/src/requests/BundleGraphRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,14 @@ export default function createBundleGraphRequest(
run: async input => {
let {options, api, invalidateReason} = input;
let {optionsRef, requestedAssetIds, signal} = input.input;
let measurement = tracer.createMeasurement('building');

let measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: 'building',
categories: ['core'],
});

let request = createAssetGraphRequest({
name: 'Main',
entries: options.entries,
Expand All @@ -103,13 +110,16 @@ export default function createBundleGraphRequest(
lazyExcludes: options.lazyExcludes,
requestedAssetIds,
});

let {assetGraph, changedAssets, assetRequests} = await api.runRequest(
request,
{
force: options.shouldBuildLazily && requestedAssetIds.size > 0,
},
);

measurement && measurement.end();

assertSignalNotAborted(signal);

// If any subrequests are invalid (e.g. dev dep requests or config requests),
Expand Down Expand Up @@ -137,14 +147,22 @@ export default function createBundleGraphRequest(
let {devDeps, invalidDevDeps} = await getDevDepRequests(input.api);
invalidateDevDeps(invalidDevDeps, input.options, parcelConfig);

let bundlingMeasurement = tracer.createMeasurement('bundling');
measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: 'bundling',
categories: ['core'],
});

let builder = new BundlerRunner(input, parcelConfig, devDeps);
let res: BundleGraphResult = await builder.bundle({
graph: assetGraph,
changedAssets: changedAssets,
assetRequests,
});
bundlingMeasurement && bundlingMeasurement.end();

measurement && measurement.end();

for (let [id, asset] of changedAssets) {
res.changedAssets.set(id, asset);
}
Expand Down Expand Up @@ -255,8 +273,11 @@ class BundlerRunner {

await this.loadConfigs();

let plugin = await this.config.getBundler();
let {plugin: bundler, name, resolveFrom} = plugin;
let {
plugin: bundler,
name: pluginName,
resolveFrom,
} = await this.config.getBundler();

// if a previous asset graph hash is passed in, check if the bundle graph is also available
let previousBundleGraphResult: ?BundleGraphRequestResult;
Expand All @@ -273,9 +294,9 @@ class BundlerRunner {

let internalBundleGraph;

let logger = new PluginLogger({origin: name});
let logger = new PluginLogger({origin: pluginName});
let tracer = new PluginTracer({
origin: name,
origin: pluginName,
category: 'bundle',
});
try {
Expand Down Expand Up @@ -307,24 +328,26 @@ class BundlerRunner {
this.options,
);

let measurement;
let measurementFilename;
let filename;
if (tracer.enabled) {
measurementFilename = graph
filename = graph
.getEntryAssets()
.map(asset => fromProjectPathRelative(asset.filePath))
.join(', ');
measurement = tracer.createMeasurement(
plugin.name,
'bundling:bundle',
measurementFilename,
);
}

let measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: pluginName,
categories: ['bundling:bundle'],
args: {filename},
});

// this the normal bundle workflow (bundle, optimizing, run-times, naming)
await bundler.bundle({
bundleGraph: mutableBundleGraph,
config: this.configs.get(plugin.name)?.result,
config: this.configs.get(pluginName)?.result,
options: this.pluginOptions,
logger,
tracer,
Expand All @@ -333,29 +356,30 @@ class BundlerRunner {
measurement && measurement.end();

if (this.pluginOptions.mode === 'production') {
let optimizeMeasurement;
try {
if (tracer.enabled) {
optimizeMeasurement = tracer.createMeasurement(
plugin.name,
'bundling:optimize',
nullthrows(measurementFilename),
);
}
measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: pluginName,
categories: ['bundling:optimize'],
args: {filename},
});

await bundler.optimize({
bundleGraph: mutableBundleGraph,
config: this.configs.get(plugin.name)?.result,
config: this.configs.get(pluginName)?.result,
options: this.pluginOptions,
logger,
});
} catch (e) {
throw new ThrowableDiagnostic({
diagnostic: errorToDiagnostic(e, {
origin: plugin.name,
origin: pluginName,
}),
});
} finally {
optimizeMeasurement && optimizeMeasurement.end();
measurement && measurement.end();

await dumpGraphToGraphViz(
// $FlowFixMe[incompatible-call]
internalBundleGraph._graph,
Expand All @@ -368,7 +392,7 @@ class BundlerRunner {
// the potential for lazy require() that aren't executed until the request runs.
let devDepRequest = await createDevDependency(
{
specifier: name,
specifier: pluginName,
resolveFrom,
},
this.previousDevDeps,
Expand All @@ -390,7 +414,7 @@ class BundlerRunner {

throw new ThrowableDiagnostic({
diagnostic: errorToDiagnostic(e, {
origin: name,
origin: pluginName,
}),
});
} finally {
Expand Down Expand Up @@ -500,7 +524,14 @@ class BundlerRunner {
for (let namer of namers) {
let measurement;
try {
measurement = tracer.createMeasurement(namer.name, 'namer', bundle.id);
measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: namer.name,
args: {bundle: bundle.id},
categories: ['namer'],
});

let name = await namer.plugin.name({
bundle,
bundleGraph,
Expand Down
11 changes: 9 additions & 2 deletions packages/core/core/src/requests/ParcelBuildRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,21 @@ async function run({input, api, options}) {
),
});

let packagingMeasurement = tracer.createMeasurement('packaging');
let measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: 'packaging',
categories: ['core'],
});

let writeBundlesRequest = createWriteBundlesRequest({
bundleGraph,
optionsRef,
});

let bundleInfo = await api.runRequest(writeBundlesRequest);
packagingMeasurement && packagingMeasurement.end();
measurement && measurement.end();

assertSignalNotAborted(signal);

return {bundleGraph, bundleInfo, changedAssets, assetRequests};
Expand Down
14 changes: 8 additions & 6 deletions packages/core/core/src/requests/PathRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -284,11 +284,14 @@ export class ResolverRunner {
for (let resolver of resolvers) {
let measurement;
try {
measurement = tracer.createMeasurement(
resolver.name,
'resolve',
specifier,
);
measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: resolver.name,
args: {specifier},
categories: ['resolve'],
});

let result = await resolver.plugin.resolve({
specifier,
pipeline,
Expand All @@ -301,7 +304,6 @@ export class ResolverRunner {
}),
config: this.configs.get(resolver.name)?.result,
});
measurement && measurement.end();

if (result) {
if (result.meta) {
Expand Down
18 changes: 12 additions & 6 deletions packages/core/core/src/requests/WriteBundleRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -248,16 +248,22 @@ async function runCompressor(
) {
let measurement;
try {
measurement = tracer.createMeasurement(
compressor.name,
'compress',
path.relative(options.projectRoot, filePath),
);
measurement =
tracer.enabled &&
tracer.createTraceMeasurement({
name: compressor.name,
args: {filename: path.relative(options.projectRoot, filePath)},
categories: ['compress'],
});

let res = await compressor.plugin.compress({
stream,
options: new PluginOptions(options),
logger: new PluginLogger({origin: compressor.name}),
tracer: new PluginTracer({origin: compressor.name, category: 'compress'}),
tracer: new PluginTracer({
origin: compressor.name,
category: 'compress',
}),
});

if (res != null) {
Expand Down