Skip to content

Commit 6215ccd

Browse files
authored
send telemetry about accepted/discarded hunks and about response types (microsoft#203780)
1 parent 860f38b commit 6215ccd

File tree

2 files changed

+42
-18
lines changed

2 files changed

+42
-18
lines changed

src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,15 @@ export type TelemetryData = {
3939
extension: string;
4040
rounds: string;
4141
undos: string;
42-
edits: boolean;
4342
unstashed: number;
43+
edits: number;
4444
finishedByEdit: boolean;
4545
startTime: string;
4646
endTime: string;
4747
editMode: string;
48+
acceptedHunks: number;
49+
discardedHunks: number;
50+
responseTypes: string;
4851
};
4952

5053
export type TelemetryDataClassification = {
@@ -59,6 +62,9 @@ export type TelemetryDataClassification = {
5962
startTime: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'When the session started' };
6063
endTime: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'When the session ended' };
6164
editMode: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'What edit mode was choosen: live, livePreview, preview' };
65+
acceptedHunks: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of accepted hunks' };
66+
discardedHunks: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of discarded hunks' };
67+
responseTypes: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Comma separated list of response types like edits, message, mixed' };
6268
};
6369

6470
export enum ExpansionState {
@@ -140,7 +146,7 @@ export class Session {
140146
private _isUnstashed: boolean = false;
141147
private readonly _exchange: SessionExchange[] = [];
142148
private readonly _startTime = new Date();
143-
private readonly _teldata: Partial<TelemetryData>;
149+
private readonly _teldata: TelemetryData;
144150

145151
readonly textModelNAltVersion: number;
146152
private _textModelNSnapshotAltVersion: number | undefined;
@@ -168,12 +174,16 @@ export class Session {
168174
this._teldata = {
169175
extension: provider.debugName,
170176
startTime: this._startTime.toISOString(),
171-
edits: false,
177+
endTime: this._startTime.toISOString(),
178+
edits: 0,
172179
finishedByEdit: false,
173180
rounds: '',
174181
undos: '',
175182
editMode,
176-
unstashed: 0
183+
unstashed: 0,
184+
acceptedHunks: 0,
185+
discardedHunks: 0,
186+
responseTypes: ''
177187
};
178188
}
179189

@@ -214,6 +224,7 @@ export class Session {
214224
this._isUnstashed = false;
215225
const newLen = this._exchange.push(exchange);
216226
this._teldata.rounds += `${newLen}|`;
227+
this._teldata.responseTypes += `${exchange.response instanceof ReplyResponse ? exchange.response.responseType : InlineChatResponseTypes.Empty}|`;
217228
}
218229

219230
get exchanges(): Iterable<SessionExchange> {
@@ -244,15 +255,25 @@ export class Session {
244255
}
245256

246257
recordExternalEditOccurred(didFinish: boolean) {
247-
this._teldata.edits = true;
258+
this._teldata.edits += 1;
248259
this._teldata.finishedByEdit = didFinish;
249260
}
250261

251262
asTelemetryData(): TelemetryData {
252-
return <TelemetryData>{
253-
...this._teldata,
254-
endTime: new Date().toISOString(),
255-
};
263+
264+
for (const item of this.hunkData.getInfo()) {
265+
switch (item.getState()) {
266+
case HunkState.Accepted:
267+
this._teldata.acceptedHunks += 1;
268+
break;
269+
case HunkState.Rejected:
270+
this._teldata.discardedHunks += 1;
271+
break;
272+
}
273+
}
274+
275+
this._teldata.endTime = new Date().toISOString();
276+
return this._teldata;
256277
}
257278

258279
asRecording(): Recording {

src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -192,28 +192,31 @@ export class InlineChatSessionServiceImpl implements IInlineChatSessionService {
192192

193193
releaseSession(session: Session): void {
194194

195-
let data: SessionData | undefined;
195+
let tuple: [string, SessionData] | undefined;
196196

197197
// cleanup
198-
for (const [key, value] of this._sessions) {
199-
if (value.session === session) {
200-
data = value;
201-
value.store.dispose();
202-
this._sessions.delete(key);
203-
this._logService.trace(`[IE] did RELEASED session for ${value.editor.getId()}, ${session.provider.debugName}`);
198+
for (const candidate of this._sessions) {
199+
if (candidate[1].session === session) {
200+
// if (value.session === session) {
201+
tuple = candidate;
204202
break;
205203
}
206204
}
207205

208-
if (!data) {
206+
if (!tuple) {
209207
// double remove
210208
return;
211209
}
212210

213211
this._keepRecording(session);
214212
this._telemetryService.publicLog2<TelemetryData, TelemetryDataClassification>('interactiveEditor/session', session.asTelemetryData());
215213

216-
this._onDidEndSession.fire({ editor: data.editor, session });
214+
const [key, value] = tuple;
215+
value.store.dispose();
216+
this._sessions.delete(key);
217+
this._logService.trace(`[IE] did RELEASED session for ${value.editor.getId()}, ${session.provider.debugName}`);
218+
219+
this._onDidEndSession.fire({ editor: value.editor, session });
217220
}
218221

219222
stashSession(session: Session, editor: ICodeEditor, undoCancelEdits: IValidEditOperation[]): StashedSession {

0 commit comments

Comments
 (0)