Skip to content

Commit 2cf34ee

Browse files
authored
[typescript-language-features] Add telemetry for package.json auto imports (microsoft#103126)
* Add telemetry for package.json auto imports * Change data classification * Use string, boolean is not allowed in TelemetryProperties
1 parent c397750 commit 2cf34ee

1 file changed

Lines changed: 52 additions & 21 deletions

File tree

  • extensions/typescript-language-features/src/languageFeatures

extensions/typescript-language-features/src/languageFeatures/completions.ts

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,25 @@ class CompletionAcceptedCommand implements Command {
330330

331331
public constructor(
332332
private readonly onCompletionAccepted: (item: vscode.CompletionItem) => void,
333+
private readonly telemetryReporter: TelemetryReporter,
333334
) { }
334335

335336
public execute(item: vscode.CompletionItem) {
336337
this.onCompletionAccepted(item);
338+
if (item instanceof MyCompletionItem) {
339+
/* __GDPR__
340+
"completions.accept" : {
341+
"isPackageJsonImport" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
342+
"${include}": [
343+
"${TypeScriptCommonProperties}"
344+
]
345+
}
346+
*/
347+
this.telemetryReporter.logTelemetry('completions.accept', {
348+
// @ts-expect-error - remove after TS 4.0 protocol update
349+
isPackageJsonImport: item.tsEntry.isPackageJsonImport ? 'true' : undefined,
350+
});
351+
}
337352
}
338353
}
339354

@@ -422,7 +437,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
422437
) {
423438
commandManager.register(new ApplyCompletionCodeActionCommand(this.client));
424439
commandManager.register(new CompositeCommand());
425-
commandManager.register(new CompletionAcceptedCommand(onCompletionAccepted));
440+
commandManager.register(new CompletionAcceptedCommand(onCompletionAccepted, this.telemetryReporter));
426441
}
427442

428443
public async provideCompletionItems(
@@ -471,34 +486,18 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
471486
let dotAccessorContext: DotAccessorContext | undefined;
472487
let entries: ReadonlyArray<Proto.CompletionEntry>;
473488
let metadata: any | undefined;
489+
let response: ServerResponse.Response<Proto.CompletionInfoResponse> | undefined;
490+
let duration: number | undefined;
474491
if (this.client.apiVersion.gte(API.v300)) {
475492
const startTime = Date.now();
476-
let response: ServerResponse.Response<Proto.CompletionInfoResponse> | undefined;
477493
try {
478494
response = await this.client.interruptGetErr(() => this.client.execute('completionInfo', args, token));
479495
} finally {
480-
const duration: number = Date.now() - startTime;
481-
482-
/* __GDPR__
483-
"completions.execute" : {
484-
"duration" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
485-
"type" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
486-
"count" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
487-
"updateGraphDurationMs" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" },
488-
"${include}": [
489-
"${TypeScriptCommonProperties}"
490-
]
491-
}
492-
*/
493-
this.telemetryReporter.logTelemetry('completions.execute', {
494-
duration: duration,
495-
type: response?.type ?? 'unknown',
496-
count: response?.type === 'response' && response.body ? response.body.entries.length : 0,
497-
updateGraphDurationMs: response?.type === 'response' ? response.performanceData?.updateGraphDurationMs : undefined,
498-
});
496+
duration = Date.now() - startTime;
499497
}
500498

501499
if (response.type !== 'response' || !response.body) {
500+
this.logCompletionsTelemetry(duration, response);
502501
return null;
503502
}
504503
isNewIdentifierLocation = response.body.isNewIdentifierLocation;
@@ -536,15 +535,47 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
536535
useFuzzyWordRangeLogic: this.client.apiVersion.lt(API.v390),
537536
};
538537

538+
let includesPackageJsonImport = false;
539539
const items: MyCompletionItem[] = [];
540540
for (let entry of entries) {
541541
if (!shouldExcludeCompletionEntry(entry, completionConfiguration)) {
542542
items.push(new MyCompletionItem(position, document, entry, completionContext, metadata));
543+
// @ts-expect-error - remove after TS 4.0 protocol update
544+
includesPackageJsonImport = !!entry.isPackageJsonImport;
543545
}
544546
}
547+
if (duration !== undefined) {
548+
this.logCompletionsTelemetry(duration, response, includesPackageJsonImport);
549+
}
545550
return new vscode.CompletionList(items, isIncomplete);
546551
}
547552

553+
private logCompletionsTelemetry(
554+
duration: number,
555+
response: ServerResponse.Response<Proto.CompletionInfoResponse> | undefined,
556+
includesPackageJsonImport?: boolean
557+
) {
558+
/* __GDPR__
559+
"completions.execute" : {
560+
"duration" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
561+
"type" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
562+
"count" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
563+
"updateGraphDurationMs" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
564+
"includesPackageJsonImport" : { "classification": "SystemMetadata", "purpose": "FeatureInsight" },
565+
"${include}": [
566+
"${TypeScriptCommonProperties}"
567+
]
568+
}
569+
*/
570+
this.telemetryReporter.logTelemetry('completions.execute', {
571+
duration: duration,
572+
type: response?.type ?? 'unknown',
573+
count: response?.type === 'response' && response.body ? response.body.entries.length : 0,
574+
updateGraphDurationMs: response?.type === 'response' ? response.performanceData?.updateGraphDurationMs : undefined,
575+
includesPackageJsonImport: includesPackageJsonImport ? 'true' : undefined,
576+
});
577+
}
578+
548579
private getTsTriggerCharacter(context: vscode.CompletionContext): Proto.CompletionsTriggerCharacter | undefined {
549580
switch (context.triggerCharacter) {
550581
case '@': // Workaround for https://github.com/Microsoft/TypeScript/issues/27321

0 commit comments

Comments
 (0)