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'))