Skip to content

Commit 08dd09d

Browse files
osortegaCopilot
andcommitted
sessions: add telemetry for top-level button interactions (#7256)
Log a `vscodeAgents.interaction` telemetry event when users click the New Session, Run Primary Task, Add Task, Generate New Task, Open Terminal, and Open in VS Code buttons in the Agents window titlebar. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 8910ce4 commit 08dd09d

5 files changed

Lines changed: 37 additions & 1 deletion

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
export type SessionsInteractionEvent = {
7+
button: string;
8+
};
9+
10+
export type SessionsInteractionClassification = {
11+
owner: 'osortega';
12+
comment: 'Tracks user interactions with buttons in the Agents window';
13+
button: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The identifier of the button that was clicked' };
14+
};

src/vs/sessions/contrib/chat/browser/chat.contribution.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { Schemas } from '../../../../base/common/network.js';
1212
import { URI } from '../../../../base/common/uri.js';
1313
import { IOpenerService } from '../../../../platform/opener/common/opener.js';
1414
import { IProductService } from '../../../../platform/product/common/productService.js';
15+
import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';
16+
import { SessionsInteractionClassification, SessionsInteractionEvent } from '../../../common/sessionsTelemetry.js';
1517
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';
1618
import { IViewContainersRegistry, IViewsRegistry, ViewContainerLocation, Extensions as ViewExtensions, WindowVisibility } from '../../../../workbench/common/views.js';
1719
import { Registry } from '../../../../platform/registry/common/platform.js';
@@ -60,6 +62,9 @@ export class OpenSessionWorktreeInVSCodeAction extends Action2 {
6062
}
6163

6264
override async run(accessor: ServicesAccessor): Promise<void> {
65+
const telemetryService = accessor.get(ITelemetryService);
66+
telemetryService.publicLog2<SessionsInteractionEvent, SessionsInteractionClassification>('vscodeAgents.interaction', { button: 'openInVSCode' });
67+
6368
const openerService = accessor.get(IOpenerService);
6469
const productService = accessor.get(IProductService);
6570
const sessionsManagementService = accessor.get(ISessionsManagementService);

src/vs/sessions/contrib/chat/browser/runScriptAction.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { KeybindingsRegistry, KeybindingWeight } from '../../../../platform/keyb
2626
import { IQuickInputButton, IQuickInputService, IQuickPickItem, IQuickPickSeparator } from '../../../../platform/quickinput/common/quickInput.js';
2727
import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';
2828
import { IWorkbenchContribution } from '../../../../workbench/common/contributions.js';
29+
import { SessionsInteractionClassification, SessionsInteractionEvent } from '../../../common/sessionsTelemetry.js';
2930
import { IWorkbenchLayoutService } from '../../../../workbench/services/layout/browser/layoutService.js';
3031
import { SessionsCategories } from '../../../common/categories.js';
3132
import { ISessionsManagementService } from '../../sessions/browser/sessionsManagementService.js';
@@ -121,6 +122,7 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr
121122
@ISessionsConfigurationService private readonly _sessionsConfigService: ISessionsConfigurationService,
122123
@IActionViewItemService private readonly _actionViewItemService: IActionViewItemService,
123124
@IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService,
125+
@ITelemetryService private readonly _telemetryService: ITelemetryService,
124126
) {
125127
super();
126128

@@ -189,6 +191,8 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr
189191
}
190192

191193
async run(): Promise<void> {
194+
that._telemetryService.publicLog2<SessionsInteractionEvent, SessionsInteractionClassification>('vscodeAgents.interaction', { button: 'runPrimaryTask' });
195+
192196
const activeState = that._activeRunState.get();
193197
if (!activeState) {
194198
return;
@@ -238,6 +242,7 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr
238242
}
239243

240244
async run(): Promise<void> {
245+
that._telemetryService.publicLog2<SessionsInteractionEvent, SessionsInteractionClassification>('vscodeAgents.interaction', { button: 'addTask' });
241246
const task = await that._showConfigureQuickPick(session);
242247
if (task) {
243248
await that._sessionsConfigService.runTask(task, session);
@@ -261,6 +266,7 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr
261266
}
262267

263268
async run(): Promise<void> {
269+
that._telemetryService.publicLog2<SessionsInteractionEvent, SessionsInteractionClassification>('vscodeAgents.interaction', { button: 'generateNewTask' });
264270
await that._sessionManagementService.sendAndCreateChat(session, { query: '/generate-run-commands' });
265271
}
266272
}));

src/vs/sessions/contrib/sessions/browser/views/sessionsView.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ import { Action2, MenuId, registerAction2 } from '../../../../../platform/action
3030
import { Button } from '../../../../../base/browser/ui/button/button.js';
3131
import { defaultButtonStyles } from '../../../../../platform/theme/browser/defaultStyles.js';
3232
import { IStorageService, StorageScope, StorageTarget } from '../../../../../platform/storage/common/storage.js';
33+
import { ITelemetryService } from '../../../../../platform/telemetry/common/telemetry.js';
3334
import { IHostService } from '../../../../../workbench/services/host/browser/host.js';
35+
import { SessionsInteractionClassification, SessionsInteractionEvent } from '../../../../common/sessionsTelemetry.js';
3436

3537
const $ = DOM.$;
3638
export const SessionsViewId = 'sessions.workbench.view.sessionsView';
@@ -70,6 +72,7 @@ export class SessionsView extends ViewPane {
7072
@ISessionsManagementService private readonly sessionsManagementService: ISessionsManagementService,
7173
@IHostService private readonly hostService: IHostService,
7274
@IStorageService private readonly storageService: IStorageService,
75+
@ITelemetryService private readonly telemetryService: ITelemetryService,
7376
) {
7477
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, hoverService);
7578

@@ -133,7 +136,10 @@ export class SessionsView extends ViewPane {
133136
supportIcons: true,
134137
}));
135138
newSessionButton.label = `$(${Codicon.plus.id}) ${localize('sessionLabel', "Session")}`;
136-
this._register(newSessionButton.onDidClick(() => this.sessionsManagementService.openNewSessionView()));
139+
this._register(newSessionButton.onDidClick(() => {
140+
this.telemetryService.publicLog2<SessionsInteractionEvent, SessionsInteractionClassification>('vscodeAgents.interaction', { button: 'newSession' });
141+
this.sessionsManagementService.openNewSessionView();
142+
}));
137143

138144
const buttonLabel = $('.new-session-button-label');
139145
const keybindingHint = $('span.new-session-keybinding-hint');

src/vs/sessions/contrib/terminal/browser/sessionsTerminalContribution.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import { ISessionsManagementService } from '../../sessions/browser/sessionsManag
2020
import { ISession } from '../../sessions/common/sessionData.js';
2121
import { IsAuxiliaryWindowContext } from '../../../../workbench/common/contextkeys.js';
2222
import { ContextKeyExpr, IContextKeyService, RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';
23+
import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';
2324
import { SessionsWelcomeVisibleContext } from '../../../common/contextkeys.js';
25+
import { SessionsInteractionClassification, SessionsInteractionEvent } from '../../../common/sessionsTelemetry.js';
2426
import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js';
2527
import { TERMINAL_VIEW_ID } from '../../../../workbench/contrib/terminal/common/terminal.js';
2628
import { IWorkbenchLayoutService, Parts } from '../../../../workbench/services/layout/browser/layoutService.js';
@@ -319,6 +321,9 @@ class OpenSessionInTerminalAction extends Action2 {
319321
}
320322

321323
override async run(_accessor: ServicesAccessor): Promise<void> {
324+
const telemetryService = _accessor.get(ITelemetryService);
325+
telemetryService.publicLog2<SessionsInteractionEvent, SessionsInteractionClassification>('vscodeAgents.interaction', { button: 'openTerminal' });
326+
322327
const layoutService = _accessor.get(IWorkbenchLayoutService);
323328
const viewsService = _accessor.get(IViewsService);
324329

0 commit comments

Comments
 (0)