Skip to content

Commit 20975a6

Browse files
authored
telemetry(amazonq): add feedback functionality with thumbs up/down (#6560)
## Problem - /test and /review are missing thumbs up/down telemetry - /test is missing feedback functionality <img width="545" alt="Screenshot 2025-02-11 at 1 58 42 PM" src="https://github.com/user-attachments/assets/11a46136-46a6-4d35-a7e1-e92f45b1034a" /> <img width="558" alt="Screenshot 2025-02-11 at 1 58 48 PM" src="https://github.com/user-attachments/assets/80288c37-a98c-4e8f-9e32-810238ee2695" /> ## Solution - send telemetry event for thumps up/down for /test and /review - send user feedback for /test which routes to SIM folder - No tests were added as this is UX change --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 80dfe15 commit 20975a6

File tree

12 files changed

+94
-8
lines changed

12 files changed

+94
-8
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"mergeReports": "ts-node ./scripts/mergeReports.ts"
4141
},
4242
"devDependencies": {
43-
"@aws-toolkits/telemetry": "^1.0.295",
43+
"@aws-toolkits/telemetry": "^1.0.296",
4444
"@playwright/browser-chromium": "^1.43.1",
4545
"@stylistic/eslint-plugin": "^2.11.0",
4646
"@types/he": "^1.2.3",

packages/amazonq/src/app/amazonqScan/app.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export function init(appContext: AmazonQAppInitContext) {
3535
processResponseBodyLinkClick: new vscode.EventEmitter<any>(),
3636
fileClicked: new vscode.EventEmitter<any>(),
3737
scanCancelled: new vscode.EventEmitter<any>(),
38+
processChatItemVotedMessage: new vscode.EventEmitter<any>(),
3839
}
3940
const dispatcher = new AppToWebViewMessageDispatcher(appContext.getAppsToWebViewMessagePublisher())
4041
const messenger = new Messenger(dispatcher)

packages/amazonq/src/app/amazonqScan/chat/controller/controller.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
scanSummaryMessage,
3333
} from '../../models/constants'
3434
import path from 'path'
35+
import { telemetry } from 'aws-core-vscode/telemetry'
3536

3637
export class ScanController {
3738
private readonly messenger: Messenger
@@ -98,6 +99,15 @@ export class ScanController {
9899
this.chatControllerMessageListeners.scanCancelled.event((data) => {
99100
return this.handleScanCancelled(data)
100101
})
102+
103+
this.chatControllerMessageListeners.processChatItemVotedMessage.event((data) => {
104+
telemetry.amazonq_feedback.emit({
105+
featureId: 'amazonQReview',
106+
amazonqConversationId: this.sessionStorage.getSession().scanUuid,
107+
credentialStartUrl: AuthUtil.instance.startUrl,
108+
interactionType: data.vote,
109+
})
110+
})
101111
}
102112

103113
private async tabOpened(message: any) {

packages/amazonq/src/app/amazonqScan/chat/views/actions/uiMessageListener.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ export class UIMessageListener {
5555
case 'file-click':
5656
this.processFileClick(msg)
5757
break
58+
case 'chat-item-voted':
59+
this.chatItemVoted(msg)
60+
break
5861
}
5962
}
6063

@@ -112,4 +115,12 @@ export class UIMessageListener {
112115
filePath: msg.filePath,
113116
})
114117
}
118+
119+
private chatItemVoted(msg: any) {
120+
this.scanControllerEventsEmitters?.processChatItemVotedMessage.fire({
121+
tabID: msg.tabID,
122+
command: msg.command,
123+
vote: msg.vote,
124+
})
125+
}
115126
}

packages/core/src/amazonq/webview/ui/connector.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,9 @@ export class Connector {
602602
case 'featuredev':
603603
this.featureDevChatConnector.sendFeedback(tabId, feedbackPayload)
604604
break
605+
case 'testgen':
606+
this.testChatConnector.onSendFeedback(tabId, feedbackPayload)
607+
break
605608
case 'cwc':
606609
this.cwChatConnector.onSendFeedback(tabId, feedbackPayload)
607610
break

packages/core/src/amazonqScan/controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ export interface ScanChatControllerEventEmitters {
3030
readonly processResponseBodyLinkClick: vscode.EventEmitter<any>
3131
readonly fileClicked: vscode.EventEmitter<any>
3232
readonly scanCancelled: vscode.EventEmitter<any>
33+
readonly processChatItemVotedMessage: vscode.EventEmitter<any>
3334
}

packages/core/src/amazonqTest/app.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ export function init(appContext: AmazonQAppInitContext) {
3232
errorThrown: new vscode.EventEmitter<any>(),
3333
insertCodeAtCursorPosition: new vscode.EventEmitter<any>(),
3434
processResponseBodyLinkClick: new vscode.EventEmitter<any>(),
35+
processChatItemVotedMessage: new vscode.EventEmitter<any>(),
36+
processChatItemFeedbackMessage: new vscode.EventEmitter<any>(),
3537
}
3638
const dispatcher = new AppToWebViewMessageDispatcher(appContext.getAppsToWebViewMessagePublisher())
3739
const messenger = new Messenger(dispatcher)

packages/core/src/amazonqTest/chat/controller/controller.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@ import {
3636
import { UserIntent } from '@amzn/codewhisperer-streaming'
3737
import { getSelectedCustomization } from '../../../codewhisperer/util/customizationUtil'
3838
import { createCodeWhispererChatStreamingClient } from '../../../shared/clients/codewhispererChatClient'
39-
import { ChatTriggerType } from '../../../codewhispererChat/controllers/chat/model'
39+
import { ChatItemVotedMessage, ChatTriggerType } from '../../../codewhispererChat/controllers/chat/model'
4040
import { triggerPayloadToChatRequest } from '../../../codewhispererChat/controllers/chat/chatRequest/converter'
4141
import { EditorContentController } from '../../../amazonq/commons/controllers/contentController'
4242
import { amazonQTabSuffix } from '../../../shared/constants'
4343
import { applyChanges } from '../../../shared/utilities/textDocumentUtilities'
4444
import { telemetry } from '../../../shared/telemetry/telemetry'
4545
import { CodeWhispererSettings } from '../../../codewhisperer/util/codewhispererSettings'
46+
import globals from '../../../shared/extensionGlobals'
4647
import { openUrl } from '../../../shared/utilities/vsCodeUtils'
4748
import { getLogger } from '../../../shared/logger/logger'
4849
import { i18n } from '../../../shared/i18n-helper'
@@ -78,6 +79,8 @@ export interface TestChatControllerEventEmitters {
7879
readonly errorThrown: vscode.EventEmitter<any>
7980
readonly insertCodeAtCursorPosition: vscode.EventEmitter<any>
8081
readonly processResponseBodyLinkClick: vscode.EventEmitter<any>
82+
readonly processChatItemVotedMessage: vscode.EventEmitter<any>
83+
readonly processChatItemFeedbackMessage: vscode.EventEmitter<any>
8184
}
8285

8386
type OpenDiffMessage = {
@@ -156,6 +159,18 @@ export class TestController {
156159
return this.processLink(data)
157160
})
158161

162+
this.chatControllerMessageListeners.processChatItemVotedMessage.event((data) => {
163+
this.processChatItemVotedMessage(data).catch((e) => {
164+
getLogger().error('processChatItemVotedMessage failed: %s', (e as Error).message)
165+
})
166+
})
167+
168+
this.chatControllerMessageListeners.processChatItemFeedbackMessage.event((data) => {
169+
this.processChatItemFeedbackMessage(data).catch((e) => {
170+
getLogger().error('processChatItemFeedbackMessage failed: %s', (e as Error).message)
171+
})
172+
})
173+
159174
this.chatControllerMessageListeners.followUpClicked.event((data) => {
160175
switch (data.followUp.type) {
161176
case FollowUpTypes.ViewDiff:
@@ -205,6 +220,31 @@ export class TestController {
205220
}
206221
}
207222

223+
private async processChatItemVotedMessage(message: ChatItemVotedMessage) {
224+
const session = this.sessionStorage.getSession()
225+
226+
telemetry.amazonq_feedback.emit({
227+
featureId: 'amazonQTest',
228+
amazonqConversationId: session.startTestGenerationRequestId,
229+
credentialStartUrl: AuthUtil.instance.startUrl,
230+
interactionType: message.vote,
231+
})
232+
}
233+
234+
private async processChatItemFeedbackMessage(message: any) {
235+
const session = this.sessionStorage.getSession()
236+
237+
await globals.telemetry.postFeedback({
238+
comment: `${JSON.stringify({
239+
type: 'testgen-chat-answer-feedback',
240+
amazonqConversationId: session.startTestGenerationRequestId,
241+
reason: message?.selectedOption,
242+
userComment: message?.comment,
243+
})}`,
244+
sentiment: 'Negative',
245+
})
246+
}
247+
208248
private async tabClosed(data: any) {
209249
getLogger().debug('Tab closed with data tab id: %s', data.tabID)
210250
await this.sessionCleanUp()

packages/core/src/amazonqTest/chat/views/actions/uiMessageListener.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ export class UIMessageListener {
6262
case 'response-body-link-click':
6363
this.processResponseBodyLinkClick(msg)
6464
break
65+
case 'chat-item-voted':
66+
this.chatItemVoted(msg)
67+
break
68+
case 'chat-item-feedback':
69+
this.chatItemFeedback(msg)
70+
break
6571
}
6672
}
6773

@@ -140,4 +146,16 @@ export class UIMessageListener {
140146
link: msg.link,
141147
})
142148
}
149+
150+
private chatItemVoted(msg: any) {
151+
this.testControllerEventsEmitters?.processChatItemVotedMessage.fire({
152+
tabID: msg.tabID,
153+
command: msg.command,
154+
vote: msg.vote,
155+
})
156+
}
157+
158+
private chatItemFeedback(msg: any) {
159+
this.testControllerEventsEmitters?.processChatItemFeedbackMessage.fire(msg)
160+
}
143161
}

0 commit comments

Comments
 (0)