Skip to content

Commit d3a13d2

Browse files
authored
Add telemetry for title and description provider (#5440) (#5447)
so we can see if this is actually a useful feature for users
1 parent 9325405 commit d3a13d2

3 files changed

Lines changed: 48 additions & 3 deletions

File tree

src/github/createPRViewProviderNew.ts

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
PULL_REQUEST_DESCRIPTION,
1919
PUSH_BRANCH
2020
} from '../common/settingKeys';
21+
import { ITelemetry } from '../common/telemetry';
2122
import { asPromise, compareIgnoreCase, formatError, promiseWithTimeout } from '../common/utils';
2223
import { getNonce, IRequestMessage, WebviewViewBase } from '../common/webview';
2324
import { PREVIOUS_CREATE_METHOD } from '../extensionState';
@@ -65,6 +66,7 @@ export class CreatePullRequestViewProviderNew extends WebviewViewBase implements
6566
private _firstLoad: boolean = true;
6667

6768
constructor(
69+
private readonly telemetry: ITelemetry,
6870
private readonly model: CreatePullRequestDataModel,
6971
extensionUri: vscode.Uri,
7072
private readonly _folderRepositoryManager: FolderRepositoryManager,
@@ -331,6 +333,16 @@ export class CreatePullRequestViewProviderNew extends WebviewViewBase implements
331333
}
332334
commands.setContext(contexts.CREATE_PR_PERMISSIONS, viewerPermission);
333335

336+
const defaultTitleAndDescriptionProvider = this._folderRepositoryManager.getTitleAndDescriptionProvider()?.title;
337+
if (defaultTitleAndDescriptionProvider) {
338+
/* __GDPR__
339+
"pr.defaultTitleAndDescriptionProvider" : {
340+
"providerTitle" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
341+
}
342+
*/
343+
this.telemetry.sendTelemetryEvent('pr.defaultTitleAndDescriptionProvider', { providerTitle: defaultTitleAndDescriptionProvider });
344+
}
345+
334346
const params: CreateParamsNew = {
335347
defaultBaseRemote,
336348
defaultBaseBranch,
@@ -347,7 +359,7 @@ export class CreatePullRequestViewProviderNew extends WebviewViewBase implements
347359
labels: this.labels,
348360
isDraftDefault,
349361
isDarkTheme: vscode.window.activeColorTheme.kind === vscode.ColorThemeKind.Dark,
350-
generateTitleAndDescriptionTitle: this._folderRepositoryManager.getTitleAndDescriptionProvider()?.title,
362+
generateTitleAndDescriptionTitle: defaultTitleAndDescriptionProvider,
351363
creating: false
352364
};
353365

@@ -695,6 +707,7 @@ export class CreatePullRequestViewProviderNew extends WebviewViewBase implements
695707
});
696708
}
697709

710+
private lastGeneratedTitleAndDescription: { title?: string, description?: string, providerTitle: string } | undefined;
698711
private async getTitleAndDescriptionFromProvider(token: vscode.CancellationToken) {
699712
return CreatePullRequestViewProviderNew.withProgress(async () => {
700713
try {
@@ -710,7 +723,19 @@ export class CreatePullRequestViewProviderNew extends WebviewViewBase implements
710723
}));
711724
}
712725

713-
return this._folderRepositoryManager.getTitleAndDescriptionProvider()?.provider?.provideTitleAndDescription(commits, patches, token);
726+
const provider = this._folderRepositoryManager.getTitleAndDescriptionProvider();
727+
const result = await provider?.provider.provideTitleAndDescription(commits, patches, token);
728+
729+
if (provider) {
730+
this.lastGeneratedTitleAndDescription = { ...result, providerTitle: provider.title };
731+
/* __GDPR__
732+
"pr.generatedTitleAndDescription" : {
733+
"providerTitle" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
734+
}
735+
*/
736+
this.telemetry.sendTelemetryEvent('pr.generatedTitleAndDescription', { providerTitle: provider?.title });
737+
}
738+
return result;
714739
} catch (e) {
715740
Logger.error(`Error while generating title and description: ${e}`, CreatePullRequestViewProviderNew.ID);
716741
return undefined;
@@ -780,6 +805,22 @@ export class CreatePullRequestViewProviderNew extends WebviewViewBase implements
780805
});
781806
}
782807

808+
private checkGeneratedTitleAndDescription(title: string, description: string) {
809+
if (!this.lastGeneratedTitleAndDescription) {
810+
return;
811+
}
812+
const usedGeneratedTitle: boolean = !!this.lastGeneratedTitleAndDescription.title && ((this.lastGeneratedTitleAndDescription.title === title) || this.lastGeneratedTitleAndDescription.title?.includes(title) || title?.includes(this.lastGeneratedTitleAndDescription.title));
813+
const usedGeneratedDescription: boolean = !!this.lastGeneratedTitleAndDescription.description && ((this.lastGeneratedTitleAndDescription.description === description) || this.lastGeneratedTitleAndDescription.description?.includes(description) || description?.includes(this.lastGeneratedTitleAndDescription.description));
814+
/* __GDPR__
815+
"pr.usedGeneratedTitleAndDescription" : {
816+
"providerTitle" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
817+
"usedGeneratedTitle" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
818+
"usedGeneratedDescription" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
819+
}
820+
*/
821+
this.telemetry.sendTelemetryEvent('pr.usedGeneratedTitleAndDescription', { providerTitle: this.lastGeneratedTitleAndDescription.providerTitle, usedGeneratedTitle: usedGeneratedTitle.toString(), usedGeneratedDescription: usedGeneratedDescription.toString() });
822+
}
823+
783824
private async create(message: IRequestMessage<CreatePullRequestNew>): Promise<void> {
784825
Logger.debug(`Creating pull request with args ${JSON.stringify(message.args)}`, CreatePullRequestViewProviderNew.ID);
785826

@@ -858,6 +899,7 @@ export class CreatePullRequestViewProviderNew extends WebviewViewBase implements
858899
progress.report({ message: vscode.l10n.t('Creating pull request'), increment: 70 - totalIncrement });
859900
totalIncrement += 70 - totalIncrement;
860901
const head = `${headRepo.remote.owner}:${compareBranchName}`;
902+
this.checkGeneratedTitleAndDescription(message.args.title, message.args.body);
861903
createdPR = await this._folderRepositoryManager.createPullRequest({ ...message.args, head });
862904

863905
// Create was cancelled

src/view/createPullRequestHelper.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import * as vscode from 'vscode';
77
import { Repository } from '../api/api';
8+
import { ITelemetry } from '../common/telemetry';
89
import { dispose } from '../common/utils';
910
import { CreatePullRequestViewProviderNew } from '../github/createPRViewProviderNew';
1011
import { FolderRepositoryManager, PullRequestDefaults } from '../github/folderRepositoryManager';
@@ -163,6 +164,7 @@ export class CreatePullRequestHelper implements vscode.Disposable {
163164
}
164165

165166
async create(
167+
telemetry: ITelemetry,
166168
extensionUri: vscode.Uri,
167169
folderRepoManager: FolderRepositoryManager,
168170
compareBranch: string | undefined,
@@ -187,6 +189,7 @@ export class CreatePullRequestHelper implements vscode.Disposable {
187189
const compareOrigin = await folderRepoManager.getOrigin(branch);
188190
const model = new CreatePullRequestDataModel(folderRepoManager, pullRequestDefaults.owner, pullRequestDefaults.base, compareOrigin.remote.owner, branch.name!);
189191
this._createPRViewProvider = new CreatePullRequestViewProviderNew(
192+
telemetry,
190193
model,
191194
extensionUri,
192195
folderRepoManager,

src/view/reviewManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ export class ReviewManager {
11521152
await this.updateState(false, false);
11531153
};
11541154

1155-
return this._createPullRequestHelper.create(this._context.extensionUri, this._folderRepoManager, compareBranch, postCreate);
1155+
return this._createPullRequestHelper.create(this._telemetry, this._context.extensionUri, this._folderRepoManager, compareBranch, postCreate);
11561156
}
11571157

11581158
public async openDescription(): Promise<void> {

0 commit comments

Comments
 (0)