Skip to content

Commit eec0d7b

Browse files
robhoganfacebook-github-bot
authored andcommittedJun 9, 2022
Add unstable_perfLogger config option
Summary: Extracts and simplifies the configurable `PerfLogger` from `metro-file-map` and lifts it into the base Metro config, so that we can add points and annotations elsewhere within Metro. Reviewed By: motiz88 Differential Revision: D36875825 fbshipit-source-id: 51f7af6a6a7fb598fac94990143ac5fd0a3c8a68
1 parent e741990 commit eec0d7b

File tree

7 files changed

+60
-52
lines changed

7 files changed

+60
-52
lines changed
 

‎packages/metro-config/src/configTypes.flow.js

+18
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,23 @@ export type Middleware = (
6969
((e: ?Error) => mixed),
7070
) => mixed;
7171

72+
type PerfAnnotations = $Shape<{
73+
string: {[key: string]: string},
74+
int: {[key: string]: number},
75+
double: {[key: string]: number},
76+
bool: {[key: string]: boolean},
77+
string_array: {[key: string]: Array<string>},
78+
int_array: {[key: string]: Array<number>},
79+
double_array: {[key: string]: Array<number>},
80+
bool_array: {[key: string]: Array<boolean>},
81+
}>;
82+
83+
export interface PerfLogger {
84+
point(name: string): void;
85+
annotate(annotations: PerfAnnotations): void;
86+
subSpan(label: string): PerfLogger;
87+
}
88+
7289
type ResolverConfigT = {
7390
assetExts: $ReadOnlyArray<string>,
7491
assetResolutions: $ReadOnlyArray<string>,
@@ -121,6 +138,7 @@ type MetalConfigT = {
121138
hasteMapCacheDirectory?: string, // Deprecated, alias of fileMapCacheDirectory
122139
unstable_fileMapCacheManagerFactory?: CacheManagerFactory,
123140
maxWorkers: number,
141+
unstable_perfLogger?: ?PerfLogger,
124142
projectRoot: string,
125143
stickyWorkers: boolean,
126144
transformerPath: string,

‎packages/metro-config/src/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
'use strict';
1212

13+
export type * from './configTypes.flow';
14+
1315
const getDefaultConfig = require('./defaults');
1416
const {loadConfig, mergeConfig, resolveConfig} = require('./loadConfig');
1517

‎packages/metro-file-map/src/crawlers/node.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ module.exports = async function nodeCrawl(options: CrawlerOptions): Promise<{
218218
perfLogger,
219219
roots,
220220
} = options;
221-
perfLogger?.markerPoint('nodeCrawl_start');
221+
perfLogger?.point('nodeCrawl_start');
222222
const useNativeFind = await hasNativeFindSupport(forceNodeFilesystemAPI);
223223

224224
return new Promise(resolve => {
@@ -239,7 +239,7 @@ module.exports = async function nodeCrawl(options: CrawlerOptions): Promise<{
239239
});
240240
data.files = files;
241241

242-
perfLogger?.markerPoint('nodeCrawl_end');
242+
perfLogger?.point('nodeCrawl_end');
243243
resolve({
244244
hasteMap: data,
245245
removedFiles,

‎packages/metro-file-map/src/crawlers/watchman.js

+17-17
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,10 @@ module.exports = async function watchmanCrawl(
112112
const {data, extensions, ignore, rootDir, roots, perfLogger} = options;
113113
const clocks = data.clocks;
114114

115-
perfLogger?.markerPoint('watchmanCrawl_start');
115+
perfLogger?.point('watchmanCrawl_start');
116116
const client = new watchman.Client();
117117

118-
perfLogger?.markerPoint('watchmanCrawl/negotiateCapabilities_start');
118+
perfLogger?.point('watchmanCrawl/negotiateCapabilities_start');
119119
// https://facebook.github.io/watchman/docs/capabilities.html
120120
// Check adds about ~28ms
121121
const capabilities = await capabilityCheck(client, {
@@ -172,21 +172,21 @@ module.exports = async function watchmanCrawl(
172172
}
173173
}
174174

175-
perfLogger?.markerPoint('watchmanCrawl/negotiateCapabilities_end');
175+
perfLogger?.point('watchmanCrawl/negotiateCapabilities_end');
176176

177177
async function getWatchmanRoots(
178178
roots: $ReadOnlyArray<Path>,
179179
): Promise<WatchmanRoots> {
180-
perfLogger?.markerPoint('watchmanCrawl/getWatchmanRoots_start');
180+
perfLogger?.point('watchmanCrawl/getWatchmanRoots_start');
181181
const watchmanRoots = new Map();
182182
await Promise.all(
183183
roots.map(async (root, index) => {
184-
perfLogger?.markerPoint(`watchmanCrawl/watchProject_${index}_start`);
184+
perfLogger?.point(`watchmanCrawl/watchProject_${index}_start`);
185185
const response = await cmd<WatchmanWatchProjectResponse>(
186186
'watch-project',
187187
root,
188188
);
189-
perfLogger?.markerPoint(`watchmanCrawl/watchProject_${index}_end`);
189+
perfLogger?.point(`watchmanCrawl/watchProject_${index}_end`);
190190
const existing = watchmanRoots.get(response.watch);
191191
// A root can only be filtered if it was never seen with a
192192
// relative_path before.
@@ -207,12 +207,12 @@ module.exports = async function watchmanCrawl(
207207
}
208208
}),
209209
);
210-
perfLogger?.markerPoint('watchmanCrawl/getWatchmanRoots_end');
210+
perfLogger?.point('watchmanCrawl/getWatchmanRoots_end');
211211
return watchmanRoots;
212212
}
213213

214214
async function queryWatchmanForDirs(rootProjectDirMappings: WatchmanRoots) {
215-
perfLogger?.markerPoint('watchmanCrawl/queryWatchmanForDirs_start');
215+
perfLogger?.point('watchmanCrawl/queryWatchmanForDirs_start');
216216
const results = new Map<string, WatchmanQueryResponse>();
217217
let isFresh = false;
218218
await Promise.all(
@@ -228,7 +228,7 @@ module.exports = async function watchmanCrawl(
228228
// system and import it, transforming the clock into a local clock.
229229
const since = clocks.get(fastPath.relative(rootDir, root));
230230

231-
perfLogger?.markerAnnotate({
231+
perfLogger?.annotate({
232232
bool: {
233233
[`watchmanCrawl/query_${index}_has_clock`]: since != null,
234234
},
@@ -294,19 +294,19 @@ module.exports = async function watchmanCrawl(
294294
queryGenerator = 'suffix';
295295
}
296296

297-
perfLogger?.markerAnnotate({
297+
perfLogger?.annotate({
298298
string: {
299299
[`watchmanCrawl/query_${index}_generator`]: queryGenerator,
300300
},
301301
});
302302

303-
perfLogger?.markerPoint(`watchmanCrawl/query_${index}_start`);
303+
perfLogger?.point(`watchmanCrawl/query_${index}_start`);
304304
const response = await cmd<WatchmanQueryResponse>(
305305
'query',
306306
root,
307307
query,
308308
);
309-
perfLogger?.markerPoint(`watchmanCrawl/query_${index}_end`);
309+
perfLogger?.point(`watchmanCrawl/query_${index}_end`);
310310

311311
if ('warning' in response) {
312312
console.warn('watchman warning: ', response.warning);
@@ -326,7 +326,7 @@ module.exports = async function watchmanCrawl(
326326
),
327327
);
328328

329-
perfLogger?.markerPoint('watchmanCrawl/queryWatchmanForDirs_end');
329+
perfLogger?.point('watchmanCrawl/queryWatchmanForDirs_end');
330330

331331
return {
332332
isFresh,
@@ -357,11 +357,11 @@ module.exports = async function watchmanCrawl(
357357
}
358358

359359
if (clientError) {
360-
perfLogger?.markerPoint('watchmanCrawl_end');
360+
perfLogger?.point('watchmanCrawl_end');
361361
throw clientError;
362362
}
363363

364-
perfLogger?.markerPoint('watchmanCrawl/processResults_start');
364+
perfLogger?.point('watchmanCrawl/processResults_start');
365365

366366
for (const [watchRoot, response] of results) {
367367
const fsRoot = normalizePathSep(watchRoot);
@@ -438,8 +438,8 @@ module.exports = async function watchmanCrawl(
438438

439439
data.files = files;
440440

441-
perfLogger?.markerPoint('watchmanCrawl/processResults_end');
442-
perfLogger?.markerPoint('watchmanCrawl_end');
441+
perfLogger?.point('watchmanCrawl/processResults_end');
442+
perfLogger?.point('watchmanCrawl_end');
443443
if (didLogWatchmanWaitMessage) {
444444
console.warn('Watchman query finished.');
445445
}

‎packages/metro-file-map/src/flow-types.js

+3-16
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import type HasteFS from './HasteFS';
1414
import type ModuleMap from './ModuleMap';
1515
import type {Stats} from 'graceful-fs';
16+
import type {PerfLogger} from 'metro-config';
17+
18+
export type {PerfLogger};
1619

1720
// These inputs affect the internal data collected for a given filesystem
1821
// state, and changes may invalidate a cache.
@@ -160,22 +163,6 @@ export type ModuleMetaData = [/* path */ string, /* type */ number];
160163

161164
export type Path = string;
162165

163-
export interface PerfLogger {
164-
markerPoint(name: string): void;
165-
markerAnnotate(annotations: PerfAnnotations): void;
166-
}
167-
168-
export type PerfAnnotations = $Shape<{
169-
string: {[key: string]: string},
170-
int: {[key: string]: number},
171-
double: {[key: string]: number},
172-
bool: {[key: string]: boolean},
173-
string_array: {[key: string]: Array<string>},
174-
int_array: {[key: string]: Array<number>},
175-
double_array: {[key: string]: Array<number>},
176-
bool_array: {[key: string]: Array<boolean>},
177-
}>;
178-
179166
export type RawModuleMap = {
180167
rootDir: Path,
181168
duplicates: DuplicatesIndex,

‎packages/metro-file-map/src/index.js

+17-17
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ export default class HasteMap extends EventEmitter {
253253

254254
constructor(options: InputOptions) {
255255
if (options.perfLogger) {
256-
options.perfLogger?.markerPoint('constructor_start');
256+
options.perfLogger?.point('constructor_start');
257257
}
258258
super();
259259

@@ -327,7 +327,7 @@ export default class HasteMap extends EventEmitter {
327327
this._buildPromise = null;
328328
this._watchers = [];
329329
this._worker = null;
330-
this._options.perfLogger?.markerPoint('constructor_end');
330+
this._options.perfLogger?.point('constructor_end');
331331
}
332332

333333
static getCacheFilePath(
@@ -357,7 +357,7 @@ export default class HasteMap extends EventEmitter {
357357
}
358358

359359
build(): Promise<InternalDataObject> {
360-
this._options.perfLogger?.markerPoint('build_start');
360+
this._options.perfLogger?.point('build_start');
361361
if (!this._buildPromise) {
362362
this._buildPromise = (async () => {
363363
const data = await this._buildFileMap();
@@ -395,7 +395,7 @@ export default class HasteMap extends EventEmitter {
395395
})();
396396
}
397397
return this._buildPromise.then(result => {
398-
this._options.perfLogger?.markerPoint('build_end');
398+
this._options.perfLogger?.point('build_end');
399399
return result;
400400
});
401401
}
@@ -406,12 +406,12 @@ export default class HasteMap extends EventEmitter {
406406
async read(): Promise<InternalData> {
407407
let data: ?InternalData;
408408

409-
this._options.perfLogger?.markerPoint('read_start');
409+
this._options.perfLogger?.point('read_start');
410410
try {
411411
data = await this._cacheManager.read();
412412
} catch {}
413413
data = data ?? this._createEmptyMap();
414-
this._options.perfLogger?.markerPoint('read_end');
414+
this._options.perfLogger?.point('read_end');
415415

416416
return data;
417417
}
@@ -435,7 +435,7 @@ export default class HasteMap extends EventEmitter {
435435
hasteMap: InternalData,
436436
}> {
437437
let hasteMap: InternalData;
438-
this._options.perfLogger?.markerPoint('buildFileMap_start');
438+
this._options.perfLogger?.point('buildFileMap_start');
439439
try {
440440
hasteMap =
441441
this._options.resetCache === true
@@ -445,7 +445,7 @@ export default class HasteMap extends EventEmitter {
445445
hasteMap = this._createEmptyMap();
446446
}
447447
return this._crawl(hasteMap).then(result => {
448-
this._options.perfLogger?.markerPoint('buildFileMap_end');
448+
this._options.perfLogger?.point('buildFileMap_end');
449449
return result;
450450
});
451451
}
@@ -681,7 +681,7 @@ export default class HasteMap extends EventEmitter {
681681
changedFiles?: FileData,
682682
hasteMap: InternalData,
683683
}): Promise<InternalData> {
684-
this._options.perfLogger?.markerPoint('buildHasteMap_start');
684+
this._options.perfLogger?.point('buildHasteMap_start');
685685
const {removedFiles, changedFiles, hasteMap} = data;
686686

687687
// If any files were removed or we did not track what files changed, process
@@ -727,7 +727,7 @@ export default class HasteMap extends EventEmitter {
727727
this._cleanup();
728728
hasteMap.map = map;
729729
hasteMap.mocks = mocks;
730-
this._options.perfLogger?.markerPoint('buildHasteMap_end');
730+
this._options.perfLogger?.point('buildHasteMap_end');
731731
return hasteMap;
732732
},
733733
error => {
@@ -752,10 +752,10 @@ export default class HasteMap extends EventEmitter {
752752
* 4. serialize the new `HasteMap` in a cache file.
753753
*/
754754
async _persist(hasteMap: InternalData) {
755-
this._options.perfLogger?.markerPoint('persist_start');
755+
this._options.perfLogger?.point('persist_start');
756756
const snapshot = deepCloneInternalData(hasteMap);
757757
await this._cacheManager.write(snapshot);
758-
this._options.perfLogger?.markerPoint('persist_end');
758+
this._options.perfLogger?.point('persist_end');
759759
}
760760

761761
/**
@@ -778,7 +778,7 @@ export default class HasteMap extends EventEmitter {
778778
}
779779

780780
_crawl(hasteMap: InternalData) {
781-
this._options.perfLogger?.markerPoint('crawl_start');
781+
this._options.perfLogger?.point('crawl_start');
782782
const options = this._options;
783783
const ignore = filePath => this._ignore(filePath);
784784
const crawl =
@@ -819,7 +819,7 @@ export default class HasteMap extends EventEmitter {
819819
};
820820

821821
const logEnd = <T>(result: T): T => {
822-
this._options.perfLogger?.markerPoint('crawl_end');
822+
this._options.perfLogger?.point('crawl_end');
823823
return result;
824824
};
825825

@@ -834,9 +834,9 @@ export default class HasteMap extends EventEmitter {
834834
* Watch mode
835835
*/
836836
_watch(hasteMap: InternalData): Promise<void> {
837-
this._options.perfLogger?.markerPoint('watch_start');
837+
this._options.perfLogger?.point('watch_start');
838838
if (!this._options.watch) {
839-
this._options.perfLogger?.markerPoint('watch_end');
839+
this._options.perfLogger?.point('watch_end');
840840
return Promise.resolve();
841841
}
842842

@@ -1046,7 +1046,7 @@ export default class HasteMap extends EventEmitter {
10461046
return Promise.all(this._options.roots.map(createWatcher)).then(
10471047
watchers => {
10481048
this._watchers = watchers;
1049-
this._options.perfLogger?.markerPoint('watch_end');
1049+
this._options.perfLogger?.point('watch_end');
10501050
},
10511051
);
10521052
}

‎packages/metro/src/node-haste/DependencyGraph/createHasteMap.js

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ function createHasteMap(
6565
config.fileMapCacheDirectory ?? config.hasteMapCacheDirectory,
6666
cacheFilePrefix: options?.cacheFilePrefix,
6767
})),
68+
perfLogger: config.unstable_perfLogger?.subSpan('hasteMap') ?? null,
6869
computeDependencies,
6970
computeSha1: true,
7071
dependencyExtractor: config.resolver.dependencyExtractor,

0 commit comments

Comments
 (0)
Please sign in to comment.