Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 59eabdf

Browse files
committed
Improve tracing
1 parent 9b5debe commit 59eabdf

File tree

3 files changed

+82
-70
lines changed

3 files changed

+82
-70
lines changed

src/fs.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,13 @@ export class FileSystemUpdater {
133133
* This function cannot be cancelled because multiple callers get the result of the same operation.
134134
*
135135
* @param uri URI of the file to ensure
136-
* @param span An OpenTracing span for tracing
136+
* @param childOf An OpenTracing span for tracing
137137
*/
138-
ensure(uri: string, span = new Span()): Promise<void> {
139-
return this.fetches.get(uri) || this.fetch(uri, span);
138+
ensure(uri: string, childOf = new Span()): Promise<void> {
139+
return tracePromise('Ensure content', childOf, span => {
140+
span.addTags({ uri });
141+
return this.fetches.get(uri) || this.fetch(uri, span);
142+
});
140143
}
141144

142145
/**
@@ -166,8 +169,10 @@ export class FileSystemUpdater {
166169
*
167170
* @param span An OpenTracing span for tracing
168171
*/
169-
ensureStructure(span = new Span()) {
170-
return this.structureFetch || this.fetchStructure(span);
172+
ensureStructure(childOf = new Span()) {
173+
return tracePromise('Ensure structure', childOf, span => {
174+
return this.structureFetch || this.fetchStructure(span);
175+
});
171176
}
172177

173178
/**

src/packages.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Disposable } from './disposable';
88
import { FileSystemUpdater } from './fs';
99
import { Logger, NoopLogger } from './logging';
1010
import { InMemoryFileSystem } from './memfs';
11+
import { tracePromise } from './tracing';
1112

1213
/**
1314
* Schema of a package.json file
@@ -151,28 +152,31 @@ export class PackageManager extends EventEmitter implements Disposable {
151152
if (!packageJsonUri) {
152153
return undefined;
153154
}
154-
return await this.getPackageJson(packageJsonUri);
155+
return await this.getPackageJson(packageJsonUri, span);
155156
}
156157

157158
/**
158159
* Returns the parsed package.json of the passed URI
159160
*
160161
* @param uri URI of the package.json
161162
*/
162-
async getPackageJson(uri: string, span = new Span()): Promise<PackageJson> {
163-
if (uri.includes('/node_modules/')) {
164-
throw new Error(`Not an own package.json: ${uri}`);
165-
}
166-
let packageJson = this.packages.get(uri);
167-
if (packageJson) {
163+
async getPackageJson(uri: string, childOf = new Span()): Promise<PackageJson> {
164+
return tracePromise('Get package.json', childOf, async span => {
165+
span.addTags({ uri });
166+
if (uri.includes('/node_modules/')) {
167+
throw new Error(`Not an own package.json: ${uri}`);
168+
}
169+
let packageJson = this.packages.get(uri);
170+
if (packageJson) {
171+
return packageJson;
172+
}
173+
await this.updater.ensure(uri, span);
174+
packageJson = this.packages.get(uri)!;
175+
if (!packageJson) {
176+
throw new Error(`Expected ${uri} to be registered in PackageManager`);
177+
}
168178
return packageJson;
169-
}
170-
await this.updater.ensure(uri, span);
171-
packageJson = this.packages.get(uri)!;
172-
if (!packageJson) {
173-
throw new Error(`Expected ${uri} to be registered in PackageManager`);
174-
}
175-
return packageJson;
179+
});
176180
}
177181

178182
/**

src/typescript-service.ts

Lines changed: 54 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -432,61 +432,64 @@ export class TypeScriptService {
432432
*
433433
* @return Observable that emits a single PackageDescriptor or undefined if the definition does not belong to any package
434434
*/
435-
protected _getPackageDescriptor(uri: string): Observable<PackageDescriptor | undefined> {
436-
// Get package name of the dependency in which the symbol is defined in, if any
437-
const packageName = extractNodeModulesPackageName(uri);
438-
if (packageName) {
439-
// The symbol is part of a dependency in node_modules
440-
// Build URI to package.json of the Dependency
441-
const encodedPackageName = packageName.split('/').map(encodeURIComponent).join('/');
442-
const parts = url.parse(uri);
443-
const packageJsonUri = url.format({ ...parts, pathname: parts.pathname!.slice(0, parts.pathname!.lastIndexOf('/node_modules/' + encodedPackageName)) + `/node_modules/${encodedPackageName}/package.json` });
444-
// Fetch the package.json of the dependency
445-
return Observable.from(this.updater.ensure(packageJsonUri))
446-
.map((): PackageDescriptor | undefined => {
447-
const packageJson = JSON.parse(this.inMemoryFileSystem.getContent(packageJsonUri));
448-
const { name, version } = packageJson;
449-
if (name) {
450-
// Used by the LSP proxy to shortcut database lookup of repo URL for PackageDescriptor
451-
let repoURL: string | undefined;
452-
if (name.startsWith('@types/')) {
453-
// if the dependency package is an @types/ package, point the repo to DefinitelyTyped
454-
repoURL = 'https://github.com/DefinitelyTyped/DefinitelyTyped';
455-
} else {
456-
// else use repository field from package.json
457-
repoURL = typeof packageJson.repository === 'object' ? packageJson.repository.url : undefined;
435+
protected _getPackageDescriptor(uri: string, childOf = new Span()): Observable<PackageDescriptor | undefined> {
436+
return traceObservable('Get PackageDescriptor', childOf, span => {
437+
span.addTags({ uri });
438+
// Get package name of the dependency in which the symbol is defined in, if any
439+
const packageName = extractNodeModulesPackageName(uri);
440+
if (packageName) {
441+
// The symbol is part of a dependency in node_modules
442+
// Build URI to package.json of the Dependency
443+
const encodedPackageName = packageName.split('/').map(encodeURIComponent).join('/');
444+
const parts = url.parse(uri);
445+
const packageJsonUri = url.format({ ...parts, pathname: parts.pathname!.slice(0, parts.pathname!.lastIndexOf('/node_modules/' + encodedPackageName)) + `/node_modules/${encodedPackageName}/package.json` });
446+
// Fetch the package.json of the dependency
447+
return Observable.from(this.updater.ensure(packageJsonUri, span))
448+
.map((): PackageDescriptor | undefined => {
449+
const packageJson = JSON.parse(this.inMemoryFileSystem.getContent(packageJsonUri));
450+
const { name, version } = packageJson;
451+
if (name) {
452+
// Used by the LSP proxy to shortcut database lookup of repo URL for PackageDescriptor
453+
let repoURL: string | undefined;
454+
if (name.startsWith('@types/')) {
455+
// if the dependency package is an @types/ package, point the repo to DefinitelyTyped
456+
repoURL = 'https://github.com/DefinitelyTyped/DefinitelyTyped';
457+
} else {
458+
// else use repository field from package.json
459+
repoURL = typeof packageJson.repository === 'object' ? packageJson.repository.url : undefined;
460+
}
461+
return { name, version, repoURL };
458462
}
459-
return { name, version, repoURL };
460-
}
461-
return undefined;
462-
});
463-
} else {
464-
// The symbol is defined in the root package of the workspace, not in a dependency
465-
// Get root package.json
466-
return Observable.from(this.packageManager.getClosestPackageJson(uri))
467-
.map((packageJson): PackageDescriptor | undefined => {
468-
if (!packageJson) {
469-
// Workspace has no package.json
470463
return undefined;
471-
}
472-
let { name, version } = packageJson;
473-
if (name) {
474-
let repoURL = typeof packageJson.repository === 'object' ? packageJson.repository.url : undefined;
475-
// If the root package is DefinitelyTyped, find out the proper @types package name for each typing
476-
if (name === 'definitely-typed') {
477-
name = extractDefinitelyTypedPackageName(uri);
478-
if (!name) {
479-
this.logger.error(`Could not extract package name from DefinitelyTyped URI ${uri}`);
480-
return undefined;
464+
});
465+
} else {
466+
// The symbol is defined in the root package of the workspace, not in a dependency
467+
// Get root package.json
468+
return Observable.from(this.packageManager.getClosestPackageJson(uri, span))
469+
.map((packageJson): PackageDescriptor | undefined => {
470+
if (!packageJson) {
471+
// Workspace has no package.json
472+
return undefined;
473+
}
474+
let { name, version } = packageJson;
475+
if (name) {
476+
let repoURL = typeof packageJson.repository === 'object' ? packageJson.repository.url : undefined;
477+
// If the root package is DefinitelyTyped, find out the proper @types package name for each typing
478+
if (name === 'definitely-typed') {
479+
name = extractDefinitelyTypedPackageName(uri);
480+
if (!name) {
481+
this.logger.error(`Could not extract package name from DefinitelyTyped URI ${uri}`);
482+
return undefined;
483+
}
484+
version = undefined;
485+
repoURL = 'https://github.com/DefinitelyTyped/DefinitelyTyped';
481486
}
482-
version = undefined;
483-
repoURL = 'https://github.com/DefinitelyTyped/DefinitelyTyped';
487+
return { name, version, repoURL };
484488
}
485-
return { name, version, repoURL };
486-
}
487-
return undefined;
488-
});
489-
}
489+
return undefined;
490+
});
491+
}
492+
});
490493
}
491494

492495
/**

0 commit comments

Comments
 (0)