Skip to content

Commit

Permalink
telemetry(featuredev): add feedback telemetry (aws#5531)
Browse files Browse the repository at this point in the history
## Problem
- feature dev is missing feedback telemetry

## Solution
- Add feedback telemetry
  • Loading branch information
chengoramazon authored Sep 4, 2024
1 parent f92a94d commit 57382ad
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,12 @@ export class Connector {
}

sendFeedback = (tabId: string, feedbackPayload: FeedbackPayload): void | undefined => {
// TODO implement telemetry
this.sendMessageToExtension({
command: 'chat-item-feedback',
...feedbackPayload,
tabType: 'featuredev',
tabID: tabId,
})
}

onChatItemVoted = (tabId: string, messageId: string, vote: string): void | undefined => {
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/amazonqFeatureDev/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export function init(appContext: AmazonQAppInitContext) {
followUpClicked: new vscode.EventEmitter<any>(),
openDiff: new vscode.EventEmitter<any>(),
processChatItemVotedMessage: new vscode.EventEmitter<any>(),
processChatItemFeedbackMessage: new vscode.EventEmitter<any>(),
stopResponse: new vscode.EventEmitter<any>(),
tabOpened: new vscode.EventEmitter<any>(),
tabClosed: new vscode.EventEmitter<any>(),
Expand Down
29 changes: 29 additions & 0 deletions packages/core/src/amazonqFeatureDev/controllers/chat/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import { examples, logWithConversationId, messageWithConversationId } from '../.
import { getWorkspaceFoldersByPrefixes } from '../../../shared/utilities/workspaceUtils'
import { openDeletedDiff, openDiff } from '../../../amazonq/commons/diff'
import { i18n } from '../../../shared/i18n-helper'
import globals from '../../../shared/extensionGlobals'

export interface ChatControllerEventEmitters {
readonly processHumanChatMessage: EventEmitter<any>
Expand All @@ -53,6 +54,7 @@ export interface ChatControllerEventEmitters {
readonly tabOpened: EventEmitter<any>
readonly tabClosed: EventEmitter<any>
readonly processChatItemVotedMessage: EventEmitter<any>
readonly processChatItemFeedbackMessage: EventEmitter<any>
readonly authClicked: EventEmitter<any>
readonly processResponseBodyLinkClick: EventEmitter<any>
readonly insertCodeAtPositionClicked: EventEmitter<any>
Expand Down Expand Up @@ -111,6 +113,11 @@ export class FeatureDevController {
getLogger().error('processChatItemVotedMessage failed: %s', (e as Error).message)
})
})
this.chatControllerMessageListeners.processChatItemFeedbackMessage.event((data) => {
this.processChatItemFeedbackMessage(data).catch((e) => {
getLogger().error('processChatItemFeedbackMessage failed: %s', (e as Error).message)
})
})
this.chatControllerMessageListeners.followUpClicked.event((data) => {
switch (data.followUp.type) {
case FollowUpTypes.GenerateCode:
Expand Down Expand Up @@ -202,6 +209,21 @@ export class FeatureDevController {
}
}

private async processChatItemFeedbackMessage(message: any) {
const session = await this.sessionStorage.getSession(message.tabId)

await globals.telemetry.postFeedback({
comment: `${JSON.stringify({
type: 'featuredev-chat-answer-feedback',
conversationId: session?.conversationId ?? '',
messageId: message?.messageId,
reason: message?.selectedOption,
userComment: message?.comment,
})}`,
sentiment: 'Negative', // The chat UI reports only negative feedback currently.
})
}

private processErrorChatMessage = (err: any, message: any, session: Session | undefined) => {
const errorMessage = createUserFacingErrorMessage(
`${featureName} request failed: ${err.cause?.message ?? err.message}`
Expand Down Expand Up @@ -429,6 +451,7 @@ export class FeatureDevController {
message: i18n('AWS.amazonq.featureDev.pillText.requestingChanges'),
type: 'answer-stream',
tabID,
canBeVoted: true,
})
this.messenger.sendUpdatePlaceholder(tabID, i18n('AWS.amazonq.featureDev.pillText.generatingCode'))
await session.send(message)
Expand All @@ -439,6 +462,7 @@ export class FeatureDevController {
message: i18n('AWS.amazonq.featureDev.pillText.unableGenerateChanges'),
type: 'answer',
tabID: tabID,
canBeVoted: true,
})
this.messenger.sendAnswer({
type: 'system-prompt',
Expand Down Expand Up @@ -555,6 +579,7 @@ export class FeatureDevController {
type: 'answer',
tabID: message.tabID,
message: i18n('AWS.amazonq.featureDev.answer.updateCode'),
canBeVoted: true,
})

this.messenger.sendAnswer({
Expand Down Expand Up @@ -605,6 +630,7 @@ export class FeatureDevController {
type: 'answer',
tabID: message.tabID,
message: i18n('AWS.amazonq.featureDev.answer.howCodeCanBeImproved'),
canBeVoted: true,
})

this.messenger.sendUpdatePlaceholder(message.tabID, i18n('AWS.amazonq.featureDev.placeholder.feedback'))
Expand Down Expand Up @@ -696,6 +722,7 @@ export class FeatureDevController {
tabID: message.tabID,
type: 'answer',
message: new SelectedFolderNotInWorkspaceFolderError().message,
canBeVoted: true,
})
this.messenger.sendAnswer({
tabID: message.tabID,
Expand All @@ -716,6 +743,7 @@ export class FeatureDevController {
message: `Changed source root to: ${uri.fsPath}`,
type: 'answer',
tabID: message.tabID,
canBeVoted: true,
})
this.messenger.sendAnswer({
message: undefined,
Expand Down Expand Up @@ -745,6 +773,7 @@ export class FeatureDevController {
type: 'answer',
tabID: message.tabID,
message: examples,
canBeVoted: true,
})
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ export class UIMessageListener {
case 'chat-item-voted':
this.chatItemVoted(msg)
break
case 'chat-item-feedback':
this.chatItemFeedback(msg)
break
case 'stop-response':
this.stopResponse(msg)
break
Expand Down Expand Up @@ -73,6 +76,10 @@ export class UIMessageListener {
})
}

private chatItemFeedback(msg: any) {
this.featureDevControllerEventsEmitters?.processChatItemFeedbackMessage.fire(msg)
}

private processChatMessage(msg: any) {
this.featureDevControllerEventsEmitters?.processHumanChatMessage.fire({
message: msg.chatMessage,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ describe('Controller', () => {
tabID,
type: 'answer',
message: new SelectedFolderNotInWorkspaceFolderError().message,
canBeVoted: true,
}),
true
)
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/test/amazonqFeatureDev/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export function createMockChatEmitters(): ChatControllerEventEmitters {
followUpClicked: new vscode.EventEmitter<any>(),
openDiff: new vscode.EventEmitter<any>(),
processChatItemVotedMessage: new vscode.EventEmitter<any>(),
processChatItemFeedbackMessage: new vscode.EventEmitter<any>(),
stopResponse: new vscode.EventEmitter<any>(),
tabOpened: new vscode.EventEmitter<any>(),
tabClosed: new vscode.EventEmitter<any>(),
Expand Down

0 comments on commit 57382ad

Please sign in to comment.