From 600ee8fe60beae7195f26877c7b92d8e33df6f7e Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:21:17 -0700 Subject: [PATCH 1/2] telemetry(amazonq): status field tracking user actions #6750 ## Problem - The current unit test generation telemetry event lacks a field to distinguish between user actions: acceptance, rejection, failure, or cancellation. ## Solution - Enhancing the amazonq_utgGenerateTests telemetry event by incorporating a status field to capture user actions in toolkit metrics. - Bumping telemetry version to `1.0.307` --- package-lock.json | 8 +++---- package.json | 2 +- .../amazonqTest/chat/controller/controller.ts | 22 +++++++++++++++---- .../chat/controller/messenger/messenger.ts | 17 ++++++++++++-- .../src/amazonqTest/chat/session/session.ts | 1 + .../src/codewhisperer/util/telemetryHelper.ts | 7 ++++-- 6 files changed, 44 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6b4fa0a059..c78d59f157f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "vscode-nls-dev": "^4.0.4" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.305", + "@aws-toolkits/telemetry": "^1.0.307", "@playwright/browser-chromium": "^1.43.1", "@stylistic/eslint-plugin": "^2.11.0", "@types/he": "^1.2.3", @@ -4806,9 +4806,9 @@ } }, "node_modules/@aws-toolkits/telemetry": { - "version": "1.0.305", - "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.305.tgz", - "integrity": "sha512-6OEW2ke7vx3yAv7MYthUZ7RZfJMUMqH3rCH3MtL84WmkylVu9nF+/RrAM4S3uKyS/EBuGPp/vZIEFBLdHbZWYg==", + "version": "1.0.307", + "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.307.tgz", + "integrity": "sha512-YYpVM0AI2qTP2OgR3J7DFvj/WLiuFQVB7upZh1i45mflae3EWprTPs0wGV5M9wI3PTFRR4zWnxhfL5Du08p9DQ==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index c984acd9cd9..7d134193361 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "skippedTestReport": "ts-node ./scripts/skippedTestReport.ts ./packages/amazonq/test/e2e/" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.305", + "@aws-toolkits/telemetry": "^1.0.307", "@playwright/browser-chromium": "^1.43.1", "@stylistic/eslint-plugin": "^2.11.0", "@types/he": "^1.2.3", diff --git a/packages/core/src/amazonqTest/chat/controller/controller.ts b/packages/core/src/amazonqTest/chat/controller/controller.ts index 96309e8714b..bd7b10ae4fb 100644 --- a/packages/core/src/amazonqTest/chat/controller/controller.ts +++ b/packages/core/src/amazonqTest/chat/controller/controller.ts @@ -286,7 +286,7 @@ export class TestController { } TelemetryHelper.instance.sendTestGenerationToolkitEvent( session, - true, + session.isSupportedLanguage, true, isCancel ? 'Cancelled' : 'Failed', session.startTestGenerationRequestId, @@ -295,7 +295,15 @@ export class TestController { session.isCodeBlockSelected, session.artifactsUploadDuration, session.srcPayloadSize, - session.srcZipFileSize + session.srcZipFileSize, + session.charsOfCodeAccepted, + session.numberOfTestsGenerated, + session.linesOfCodeGenerated, + session.charsOfCodeGenerated, + session.numberOfTestsGenerated, + session.linesOfCodeGenerated, + undefined, + isCancel ? 'CANCELLED' : 'FAILED' ) if (session.stopIteration) { // Error from Science @@ -502,6 +510,7 @@ export class TestController { unsupportedMessage = `I'm sorry, but /test only supports Python and Java
I will still generate a suggestion below.` } this.messenger.sendMessage(unsupportedMessage, tabID, 'answer') + session.isSupportedLanguage = false await this.onCodeGeneration( session, userPrompt, @@ -529,6 +538,7 @@ export class TestController { ) } session.isCodeBlockSelected = selectionRange !== undefined + session.isSupportedLanguage = true /** * Zip the project @@ -792,7 +802,9 @@ export class TestController { session.linesOfCodeAccepted, session.charsOfCodeGenerated, session.numberOfTestsGenerated, - session.linesOfCodeGenerated + session.linesOfCodeGenerated, + undefined, + 'ACCEPTED' ) await this.endSession(message, FollowUpTypes.SkipBuildAndFinish) @@ -918,7 +930,9 @@ export class TestController { 0, session.charsOfCodeGenerated, session.numberOfTestsGenerated, - session.linesOfCodeGenerated + session.linesOfCodeGenerated, + undefined, + 'REJECTED' ) telemetry.ui_click.emit({ elementId: 'unitTestGeneration_rejectDiff' }) } diff --git a/packages/core/src/amazonqTest/chat/controller/messenger/messenger.ts b/packages/core/src/amazonqTest/chat/controller/messenger/messenger.ts index b89be5c7144..ac317864c5b 100644 --- a/packages/core/src/amazonqTest/chat/controller/messenger/messenger.ts +++ b/packages/core/src/amazonqTest/chat/controller/messenger/messenger.ts @@ -296,7 +296,8 @@ export class Messenger { undefined, undefined, undefined, - 'TestGenCancelled' + 'TestGenCancelled', + 'CANCELLED' ) this.dispatcher.sendUpdatePromptProgress( new UpdatePromptProgressMessage(tabID, cancellingProgressField) @@ -310,7 +311,19 @@ export class Messenger { 'Succeeded', messageId, performance.now() - session.testGenerationStartTime, - undefined + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + 'ACCEPTED' ) this.dispatcher.sendUpdatePromptProgress( new UpdatePromptProgressMessage(tabID, testGenCompletedField) diff --git a/packages/core/src/amazonqTest/chat/session/session.ts b/packages/core/src/amazonqTest/chat/session/session.ts index e6fb850a3fb..16809ad7cef 100644 --- a/packages/core/src/amazonqTest/chat/session/session.ts +++ b/packages/core/src/amazonqTest/chat/session/session.ts @@ -35,6 +35,7 @@ export class Session { public testGenerationJob: TestGenerationJob | undefined // Start Test generation + public isSupportedLanguage: boolean = false public conversationState: ConversationState = ConversationState.IDLE public shortAnswer: ShortAnswer | undefined public sourceFilePath: string = '' diff --git a/packages/core/src/codewhisperer/util/telemetryHelper.ts b/packages/core/src/codewhisperer/util/telemetryHelper.ts index 2612718f1ef..fd800bf06a9 100644 --- a/packages/core/src/codewhisperer/util/telemetryHelper.ts +++ b/packages/core/src/codewhisperer/util/telemetryHelper.ts @@ -13,6 +13,7 @@ import { CodewhispererPreviousSuggestionState, CodewhispererUserDecision, CodewhispererUserTriggerDecision, + Status, telemetry, } from '../../shared/telemetry/telemetry' import { CodewhispererCompletionType, CodewhispererSuggestionState } from '../../shared/telemetry/telemetry' @@ -85,12 +86,13 @@ export class TelemetryHelper { generatedCharactersCount?: number, generatedCount?: number, generatedLinesCount?: number, - reason?: string + reason?: string, + status?: Status ) { telemetry.amazonq_utgGenerateTests.emit({ cwsprChatProgrammingLanguage: session.fileLanguage ?? 'plaintext', hasUserPromptSupplied: session.hasUserPromptSupplied, - isSupportedLanguage: isSupportedLanguage, + isSupportedLanguage: session.isSupportedLanguage, isFileInWorkspace: isFileInWorkspace, result: result, artifactsUploadDuration: artifactsUploadDuration, @@ -110,6 +112,7 @@ export class TelemetryHelper { requestId: requestId, reasonDesc: reasonDesc, reason: reason, + status: status, }) } From 0ed2a3ac18784c5fa3cd94126d3be493d48cf15d Mon Sep 17 00:00:00 2001 From: Tai Lai Date: Mon, 10 Mar 2025 11:23:34 -0700 Subject: [PATCH 2/2] fix(amazonq): incorrect zip entry path for file scans #6741 ## Problem Reproduce steps: 1. Open a window with multiple workspace folders, for example `workspaceFolders: [folder1, folder2]` 2. Open any file and run a code review on the active file, for example `folder1/sample.py` 3. The zip entry will be created with the workspaceFolder duplicated, for example `folder1/folder1/sample.py` ## Solution Explicitly set `includeWorkspaceFolder` to false when getting the relative path of the file. --- .../Bug Fix-b89574ec-9f50-4b4c-b548-30bfce5d0999.json | 4 ++++ packages/core/src/codewhisperer/util/zipUtil.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 packages/amazonq/.changes/next-release/Bug Fix-b89574ec-9f50-4b4c-b548-30bfce5d0999.json diff --git a/packages/amazonq/.changes/next-release/Bug Fix-b89574ec-9f50-4b4c-b548-30bfce5d0999.json b/packages/amazonq/.changes/next-release/Bug Fix-b89574ec-9f50-4b4c-b548-30bfce5d0999.json new file mode 100644 index 00000000000..db14e5a1922 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-b89574ec-9f50-4b4c-b548-30bfce5d0999.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "/review: Zip files are created with the wrong file path for file scans in multifolder workspaces." +} diff --git a/packages/core/src/codewhisperer/util/zipUtil.ts b/packages/core/src/codewhisperer/util/zipUtil.ts index 40ef6d48e84..7403fcb0862 100644 --- a/packages/core/src/codewhisperer/util/zipUtil.ts +++ b/packages/core/src/codewhisperer/util/zipUtil.ts @@ -117,7 +117,8 @@ export class ZipUtil { // Note: workspaceFolder.name is not the same as the file system folder name, // use the fsPath value instead const projectName = path.basename(workspaceFolder.uri.fsPath) - const relativePath = vscode.workspace.asRelativePath(uri) + // Set includeWorkspaceFolder to false because we are already manually prepending the projectName + const relativePath = vscode.workspace.asRelativePath(uri, false) const zipEntryPath = this.getZipEntryPath(projectName, relativePath) zip.addFile(zipEntryPath, Buffer.from(content, 'utf-8'))