Skip to content

Commit 9dc4be3

Browse files
authored
add session ID to terminal, send with suggest and creation events (microsoft#252003)
1 parent 4e49ab9 commit 9dc4be3

File tree

9 files changed

+36
-10
lines changed

9 files changed

+36
-10
lines changed

src/vs/workbench/contrib/terminal/browser/terminal.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,11 @@ export interface ITerminalInstance extends IBaseTerminalInstance {
674674
*/
675675
readonly hasFocus: boolean;
676676

677+
/**
678+
* The ID of the session that this terminal is connected to
679+
*/
680+
readonly sessionId: string;
681+
677682
/**
678683
* Get or set the behavior of the terminal when it closes. This was indented only to be called
679684
* after reconnecting to a terminal.

src/vs/workbench/contrib/terminal/browser/terminalInstance.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ import { IContextMenuService } from '../../../../platform/contextview/browser/co
9191
import { TerminalContribCommandId } from '../terminalContribExports.js';
9292
import type { IProgressState } from '@xterm/addon-progress';
9393
import { refreshShellIntegrationInfoStatus } from './terminalTooltip.js';
94+
import { generateUuid } from '../../../../base/common/uuid.js';
9495

9596
const enum Constants {
9697
/**
@@ -361,6 +362,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
361362
}));
362363
readonly onLineData = this._onLineData.event;
363364

365+
readonly sessionId = generateUuid();
366+
364367
constructor(
365368
private readonly _terminalShellTypeContextKey: IContextKey<string>,
366369
private _shellLaunchConfig: IShellLaunchConfig,

src/vs/workbench/contrib/terminal/browser/terminalTelemetry.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ export class TerminalTelemetryContribution extends Disposable implements IWorkbe
6161
shellIntegrationQuality: number;
6262
shellIntegrationInjected: boolean;
6363
shellIntegrationInjectionFailureReason: ShellIntegrationInjectionFailureReason | undefined;
64+
65+
sessionId: string;
6466
};
6567
type TerminalCreationTelemetryClassification = {
6668
owner: 'tyriar';
@@ -77,6 +79,8 @@ export class TerminalTelemetryContribution extends Disposable implements IWorkbe
7779
shellIntegrationQuality: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The shell integration quality (rich=2, basic=1 or none=0).' };
7880
shellIntegrationInjected: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the shell integration script was injected.' };
7981
shellIntegrationInjectionFailureReason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Info about shell integration injection.' };
82+
83+
sessionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The session ID of the terminal instance.' };
8084
};
8185
this._telemetryService.publicLog2<TerminalCreationTelemetryData, TerminalCreationTelemetryClassification>('terminal/createInstance', {
8286
shellType: getSanitizedShellType(slc),
@@ -90,6 +94,7 @@ export class TerminalTelemetryContribution extends Disposable implements IWorkbe
9094
shellIntegrationQuality: commandDetection?.hasRichCommandDetection ? 2 : commandDetection ? 1 : 0,
9195
shellIntegrationInjected: instance.usedShellIntegrationInjection,
9296
shellIntegrationInjectionFailureReason: instance.shellIntegrationInjectionFailureReason,
97+
sessionId: instance.sessionId,
9398
});
9499
}
95100
}

src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export class TerminalQuickFixAddon extends Disposable implements ITerminalAddon,
8181
readonly onDidUpdateQuickFixes = this._onDidUpdateQuickFixes.event;
8282

8383
constructor(
84+
private readonly _sessionId: string,
8485
private readonly _aliases: string[][] | undefined,
8586
private readonly _capabilities: ITerminalCapabilityStore,
8687
@IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService,
@@ -224,16 +225,19 @@ export class TerminalQuickFixAddon extends Disposable implements ITerminalAddon,
224225
type QuickFixResultTelemetryEvent = {
225226
quickFixId: string;
226227
ranQuickFix: boolean;
228+
sessionId: string;
227229
};
228230
type QuickFixClassification = {
229231
owner: 'meganrogge';
230232
quickFixId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The quick fix ID' };
231233
ranQuickFix: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the quick fix was run' };
234+
sessionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The terminal session ID' };
232235
comment: 'Terminal quick fixes';
233236
};
234237
this._telemetryService?.publicLog2<QuickFixResultTelemetryEvent, QuickFixClassification>('terminal/quick-fix', {
235238
quickFixId: id,
236-
ranQuickFix: this._didRun
239+
ranQuickFix: this._didRun,
240+
sessionId: this._sessionId
237241
});
238242
this._decoration.clear();
239243
this._decorationDisposables.clear();

src/vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class TerminalQuickFixContribution extends DisposableStore implements ITerminalC
4949

5050
xtermReady(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void {
5151
// Create addon
52-
this._addon = this._instantiationService.createInstance(TerminalQuickFixAddon, undefined, this._ctx.instance.capabilities);
52+
this._addon = this._instantiationService.createInstance(TerminalQuickFixAddon, this._ctx.instance.sessionId, undefined, this._ctx.instance.capabilities);
5353
xterm.raw.loadAddon(this._addon);
5454

5555
// Hook up listeners

src/vs/workbench/contrib/terminalContrib/quickFix/test/browser/quickFixAddon.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { ITerminalQuickFixService } from '../../browser/quickFix.js';
2929
import { getQuickFixesForCommand, TerminalQuickFixAddon } from '../../browser/quickFixAddon.js';
3030
import { freePort, FreePortOutputRegex, gitCreatePr, GitCreatePrOutputRegex, gitFastForwardPull, GitFastForwardPullOutputRegex, GitPushOutputRegex, gitPushSetUpstream, gitSimilar, GitSimilarOutputRegex, gitTwoDashes, GitTwoDashesRegex, pwshGeneralError, PwshGeneralErrorOutputRegex, pwshUnixCommandNotFoundError, PwshUnixCommandNotFoundErrorOutputRegex } from '../../browser/terminalQuickFixBuiltinActions.js';
3131
import { TestStorageService } from '../../../../../test/common/workbenchTestServices.js';
32+
import { generateUuid } from '../../../../../../base/common/uuid.js';
3233

3334
suite('QuickFixAddon', () => {
3435
const store = ensureNoDisposablesAreLeakedInTestSuite();
@@ -66,7 +67,7 @@ suite('QuickFixAddon', () => {
6667
openerService = instantiationService.stub(IOpenerService, {} as Partial<IOpenerService>);
6768
commandService = new TestCommandService(instantiationService);
6869

69-
quickFixAddon = instantiationService.createInstance(TerminalQuickFixAddon, [], capabilities);
70+
quickFixAddon = instantiationService.createInstance(TerminalQuickFixAddon, generateUuid(), [], capabilities);
7071
terminal.loadAddon(quickFixAddon);
7172
});
7273

src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ class TerminalSuggestContribution extends DisposableStore implements ITerminalCo
208208
return;
209209
}
210210

211-
const addon = this._addon.value = this._instantiationService.createInstance(SuggestAddon, this._ctx.instance.shellType, this._ctx.instance.capabilities, this._terminalSuggestWidgetVisibleContextKey);
211+
const addon = this._addon.value = this._instantiationService.createInstance(SuggestAddon, this._ctx.instance.sessionId, this._ctx.instance.shellType, this._ctx.instance.capabilities, this._terminalSuggestWidgetVisibleContextKey);
212212
xterm.loadAddon(addon);
213213
this._loadPwshCompletionAddon(xterm);
214214
this._loadLspCompletionAddon(xterm);

src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
136136
private _suggestTelemetry: TerminalSuggestTelemetry | undefined;
137137

138138
constructor(
139+
private readonly _sessionId: string,
139140
shellType: TerminalShellType | undefined,
140141
private readonly _capabilities: ITerminalCapabilityStore,
141142
private readonly _terminalSuggestWidgetVisibleContextKey: IContextKey<boolean>,
@@ -753,7 +754,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
753754
}
754755
const initialPromptInputState = this._mostRecentPromptInputState;
755756
if (!suggestion || !initialPromptInputState || this._leadingLineContent === undefined || !this._model) {
756-
this._suggestTelemetry?.acceptCompletion(undefined, this._mostRecentPromptInputState?.value);
757+
this._suggestTelemetry?.acceptCompletion(this._sessionId, undefined, this._mostRecentPromptInputState?.value);
757758
return;
758759
}
759760
SuggestAddon.lastAcceptedCompletionTimestamp = Date.now();
@@ -839,7 +840,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
839840

840841
// Send the completion
841842
this._onAcceptedCompletion.fire(resultSequence);
842-
this._suggestTelemetry?.acceptCompletion(completion, this._mostRecentPromptInputState?.value);
843+
this._suggestTelemetry?.acceptCompletion(this._sessionId, completion, this._mostRecentPromptInputState?.value);
843844
this.hideSuggestWidget(true);
844845
}
845846

src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestTelemetry.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { IPromptInputModel } from '../../../../../platform/terminal/common/capab
1010
import { ITerminalCompletion, TerminalCompletionItemKind } from './terminalCompletionItem.js';
1111

1212
export class TerminalSuggestTelemetry extends Disposable {
13-
private _acceptedCompletions: Array<{ label: string; kind?: string }> | undefined;
13+
private _acceptedCompletions: Array<{ label: string; kind?: string; sessionId: string }> | undefined;
1414

1515
private _kindMap = new Map<number, string>([
1616
[TerminalCompletionItemKind.File, 'File'],
@@ -40,13 +40,13 @@ export class TerminalSuggestTelemetry extends Disposable {
4040
this._acceptedCompletions = undefined;
4141
}));
4242
}
43-
acceptCompletion(completion: ITerminalCompletion | undefined, commandLine?: string): void {
43+
acceptCompletion(sessionId: string, completion: ITerminalCompletion | undefined, commandLine?: string): void {
4444
if (!completion || !commandLine) {
4545
this._acceptedCompletions = undefined;
4646
return;
4747
}
4848
this._acceptedCompletions = this._acceptedCompletions || [];
49-
this._acceptedCompletions.push({ label: typeof completion.label === 'string' ? completion.label : completion.label.label, kind: this._kindMap.get(completion.kind!) });
49+
this._acceptedCompletions.push({ label: typeof completion.label === 'string' ? completion.label : completion.label.label, kind: this._kindMap.get(completion.kind!), sessionId });
5050
}
5151
private _sendTelemetryInfo(fromInterrupt?: boolean, exitCode?: number): void {
5252
const commandLine = this._promptInputModel?.value;
@@ -72,6 +72,7 @@ export class TerminalSuggestTelemetry extends Disposable {
7272
kind: string | undefined;
7373
outcome: string;
7474
exitCode: number | undefined;
75+
sessionId: string;
7576
}, {
7677
owner: 'meganrogge';
7778
comment: 'This data is collected to understand the outcome of a terminal completion acceptance.';
@@ -90,10 +91,16 @@ export class TerminalSuggestTelemetry extends Disposable {
9091
purpose: 'FeatureInsight';
9192
comment: 'The exit code from the command';
9293
};
94+
sessionId: {
95+
classification: 'SystemMetaData';
96+
purpose: 'FeatureInsight';
97+
comment: 'The session ID of the terminal session where the completion was accepted';
98+
};
9399
}>('terminal.suggest.acceptedCompletion', {
94100
kind,
95101
outcome,
96-
exitCode
102+
exitCode,
103+
sessionId: completion.sessionId
97104
});
98105
}
99106
}

0 commit comments

Comments
 (0)