Skip to content

Commit 72fbb76

Browse files
authored
Capture telemetry for terminal creation along with misc info (microsoft#1804)
1 parent ff674b8 commit 72fbb76

8 files changed

Lines changed: 35 additions & 12 deletions

File tree

news/3 Code Health/1542.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Capture telemetry for the usage of the `Create Terminal` command along with other instances when a terminal is created implicitly.

src/client/common/terminal/service.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33

44
import { inject, injectable } from 'inversify';
55
import { Disposable, Event, EventEmitter, Terminal, Uri } from 'vscode';
6+
import '../../common/extensions';
7+
import { IInterpreterService } from '../../interpreter/contracts';
68
import { IServiceContainer } from '../../ioc/types';
9+
import { captureTelemetry } from '../../telemetry';
10+
import { TERMINAL_CREATE } from '../../telemetry/constants';
711
import { ITerminalManager } from '../application/types';
812
import { sleep } from '../core.utils';
9-
import { IDisposableRegistry } from '../types';
13+
import { IConfigurationService, IDisposableRegistry } from '../types';
1014
import { ITerminalHelper, ITerminalService, TerminalShellType } from './types';
1115

1216
@injectable()
@@ -74,11 +78,21 @@ export class TerminalService implements ITerminalService, Disposable {
7478
}
7579

7680
this.terminal!.show(preserveFocus);
81+
82+
this.sendTelemetry().ignoreErrors();
7783
}
7884
private terminalCloseHandler(terminal: Terminal) {
7985
if (terminal === this.terminal) {
8086
this.terminalClosed.fire();
8187
this.terminal = undefined;
8288
}
8389
}
90+
91+
private async sendTelemetry() {
92+
const pythonPath = this.serviceContainer.get<IConfigurationService>(IConfigurationService).getSettings(this.resource).pythonPath;
93+
const interpreterInfo = await this.serviceContainer.get<IInterpreterService>(IInterpreterService).getInterpreterDetails(pythonPath);
94+
const pythonVersion = interpreterInfo.version_info ? interpreterInfo.version_info.join('.') : undefined;
95+
const interpreterType = interpreterInfo.type;
96+
captureTelemetry(TERMINAL_CREATE, { terminal: this.terminalShellType, pythonVersion, interpreterType });
97+
}
8498
}

src/client/interpreter/contracts.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,12 @@ export interface ICondaService {
5151
}
5252

5353
export enum InterpreterType {
54-
Unknown = 1,
55-
Conda = 2,
56-
VirtualEnv = 4,
57-
PipEnv = 8,
58-
Pyenv = 16,
59-
Venv = 32
54+
Unknown = 'Unknown',
55+
Conda = 'Conda',
56+
VirtualEnv = 'VirtualEnv',
57+
PipEnv = 'PipEnv',
58+
Pyenv = 'Pyenv',
59+
Venv = 'Venv'
6060
}
6161
export type PythonInterpreter = InterpreterInfomation & {
6262
companyDisplayName?: string;

src/client/providers/terminalProvider.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { ICommandManager, IDocumentManager, IWorkspaceService } from '../common/
66
import { Commands } from '../common/constants';
77
import { ITerminalServiceFactory } from '../common/terminal/types';
88
import { IServiceContainer } from '../ioc/types';
9+
import { captureTelemetry } from '../telemetry';
10+
import { TERMINAL_CREATE } from '../telemetry/constants';
911

1012
export class TerminalProvider implements Disposable {
1113
private disposables: Disposable[] = [];
@@ -21,6 +23,7 @@ export class TerminalProvider implements Disposable {
2123

2224
this.disposables.push(disposable);
2325
}
26+
@captureTelemetry(TERMINAL_CREATE, { triggeredBy: 'commandpalette' })
2427
private async onCreateTerminal() {
2528
const terminalService = this.serviceContainer.get<ITerminalServiceFactory>(ITerminalServiceFactory);
2629
const activeResource = this.getActiveResource();

src/client/telemetry/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ export const PYTHON_ANALYSIS_ENGINE_ENABLED = 'PYTHON_ANALYSIS_ENGINE.ENABLED';
3434
export const PYTHON_ANALYSIS_ENGINE_DOWNLOADED = 'PYTHON_ANALYSIS_ENGINE.DOWNLOADED';
3535
export const PYTHON_ANALYSIS_ENGINE_ERROR = 'PYTHON_ANALYSIS_ENGINE.ERROR';
3636
export const PYTHON_ANALYSIS_ENGINE_STARTUP = 'PYTHON_ANALYSIS_ENGINE.STARTUP';
37+
export const TERMINAL_CREATE = 'TERMINAL.CREATE';

src/client/telemetry/types.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
import { TerminalShellType } from '../common/terminal/types';
5+
import { InterpreterType } from '../interpreter/contracts';
56
import { LinterId } from '../linters/types';
67

78
export type EditorLoadTelemetry = {
@@ -57,4 +58,11 @@ export type TestDiscoverytTelemetry = {
5758
export type FeedbackTelemetry = {
5859
action: 'accepted' | 'dismissed' | 'doNotShowAgain';
5960
};
60-
export type TelemetryProperties = FormatTelemetry | LintingTelemetry | EditorLoadTelemetry | PythonInterpreterTelemetry | CodeExecutionTelemetry | TestRunTelemetry | TestDiscoverytTelemetry | FeedbackTelemetry;
61+
export type TerminalTelemetry = {
62+
terminal?: TerminalShellType;
63+
triggeredBy?: 'commandpalette';
64+
pythonVersion?: string;
65+
interpreterType?: InterpreterType;
66+
};
67+
export type TelemetryProperties = FormatTelemetry | LintingTelemetry | EditorLoadTelemetry | PythonInterpreterTelemetry |
68+
CodeExecutionTelemetry | TestRunTelemetry | TestDiscoverytTelemetry | FeedbackTelemetry | TerminalTelemetry;

src/test/common/terminals/factory.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@ import { ITerminalHelper, ITerminalServiceFactory } from '../../../client/common
1111
import { IDisposableRegistry } from '../../../client/common/types';
1212
import { IInterpreterService } from '../../../client/interpreter/contracts';
1313
import { IServiceContainer } from '../../../client/ioc/types';
14-
import { initialize } from '../../initialize';
1514

1615
// tslint:disable-next-line:max-func-body-length
1716
suite('Terminal Service Factory', () => {
1817
let factory: ITerminalServiceFactory;
1918
let disposables: Disposable[] = [];
2019
let workspaceService: TypeMoq.IMock<IWorkspaceService>;
21-
suiteSetup(initialize);
2220
setup(() => {
2321
const serviceContainer = TypeMoq.Mock.ofType<IServiceContainer>();
2422
const interpreterService = TypeMoq.Mock.ofType<IInterpreterService>();

src/test/common/terminals/service.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { TerminalService } from '../../../client/common/terminal/service';
1010
import { ITerminalHelper, TerminalShellType } from '../../../client/common/terminal/types';
1111
import { IDisposableRegistry } from '../../../client/common/types';
1212
import { IServiceContainer } from '../../../client/ioc/types';
13-
import { initialize } from '../../initialize';
1413

1514
// tslint:disable-next-line:max-func-body-length
1615
suite('Terminal Service', () => {
@@ -22,7 +21,6 @@ suite('Terminal Service', () => {
2221
let workspaceService: TypeMoq.IMock<IWorkspaceService>;
2322
let disposables: Disposable[] = [];
2423
let mockServiceContainer: TypeMoq.IMock<IServiceContainer>;
25-
suiteSetup(initialize);
2624
setup(() => {
2725
terminal = TypeMoq.Mock.ofType<VSCodeTerminal>();
2826
terminalManager = TypeMoq.Mock.ofType<ITerminalManager>();

0 commit comments

Comments
 (0)