diff --git a/.changes/next-release/Feature-8bfddf4b-d53f-451c-9b0e-ce8d2b8df54f.json b/.changes/next-release/Feature-8bfddf4b-d53f-451c-9b0e-ce8d2b8df54f.json new file mode 100644 index 00000000000..587f36b2c80 --- /dev/null +++ b/.changes/next-release/Feature-8bfddf4b-d53f-451c-9b0e-ce8d2b8df54f.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Amazon Q Chat: Added metric parameters to recordAddMessage telemetry event." +} diff --git a/packages/core/src/codewhisperer/client/user-service-2.json b/packages/core/src/codewhisperer/client/user-service-2.json index 3516868792d..db2154110a8 100644 --- a/packages/core/src/codewhisperer/client/user-service-2.json +++ b/packages/core/src/codewhisperer/client/user-service-2.json @@ -344,7 +344,8 @@ "timeBetweenChunks": { "shape": "TimeBetweenChunks" }, "fullResponselatency": { "shape": "Double" }, "requestLength": { "shape": "Integer" }, - "responseLength": { "shape": "Integer" } + "responseLength": { "shape": "Integer" }, + "numberOfCodeBlocks": { "shape": "Integer" } } }, "ChatHistory": { diff --git a/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts b/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts index 886e3e3dcfc..b0b10e9d104 100644 --- a/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts +++ b/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts @@ -30,6 +30,8 @@ import { OnboardingPageInteraction } from '../../../../amazonq/onboardingPage/mo import { FeatureAuthState } from '../../../../codewhisperer/util/authUtil' import { AuthFollowUpType, expiredText, enableQText, reauthenticateText } from '../../../../amazonq/auth/model' import { userGuideURL } from '../../../../amazonq/webview/ui/texts/constants' +import { marked } from 'marked' +import { JSDOM } from 'jsdom' export type StaticTextResponseType = 'quick-action-help' | 'onboarding-help' | 'transform' | 'help' @@ -88,6 +90,24 @@ export class Messenger { ) ) } + + public async countTotalNumberOfCodeBlocks(message: string): Promise { + if (message === undefined) { + return 0 + } + + // // To Convert Markdown text to HTML using marked library + const html = await marked(message) + + const dom = new JSDOM(html) + const document = dom.window.document + + // Search for
 elements containing  elements
+        const codeBlocks = document.querySelectorAll('pre > code')
+
+        return codeBlocks.length
+    }
+
     public async sendAIResponse(
         response: GenerateAssistantResponseCommandOutput,
         session: ChatSession,
@@ -214,7 +234,7 @@ export class Messenger {
                 relatedSuggestions = []
                 this.telemetryHelper.recordMessageResponseError(triggerPayload, tabID, statusCode ?? 0)
             })
-            .finally(() => {
+            .finally(async () => {
                 if (relatedSuggestions.length !== 0) {
                     this.dispatcher.sendChatMessage(
                         new ChatMessage(
@@ -264,6 +284,7 @@ export class Messenger {
                     messageID,
                     responseCode,
                     codeReferenceCount: codeReference.length,
+                    totalNumberOfCodeBlocksInResponse: await this.countTotalNumberOfCodeBlocks(message),
                 })
             })
     }
diff --git a/packages/core/src/codewhispererChat/controllers/chat/model.ts b/packages/core/src/codewhispererChat/controllers/chat/model.ts
index 7746419de6a..a89fed88ffb 100644
--- a/packages/core/src/codewhispererChat/controllers/chat/model.ts
+++ b/packages/core/src/codewhispererChat/controllers/chat/model.ts
@@ -76,6 +76,7 @@ export interface PromptAnswer {
     messageID: string
     responseCode: number
     codeReferenceCount: number
+    totalNumberOfCodeBlocksInResponse: number
 }
 
 export interface StopResponseMessage {
diff --git a/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts b/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts
index 7e4d13fcbd1..1e8820083b8 100644
--- a/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts
+++ b/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts
@@ -321,7 +321,7 @@ export class CWCTelemetryHelper {
             cwsprChatProgrammingLanguage: triggerPayload.fileLanguage,
             cwsprChatActiveEditorTotalCharacters: triggerPayload.fileText?.length,
             cwsprChatActiveEditorImportCount: triggerPayload.codeQuery?.fullyQualifiedNames?.used?.length,
-            cwsprChatResponseCodeSnippetCount: 0, // TODO
+            cwsprChatResponseCodeSnippetCount: message.totalNumberOfCodeBlocksInResponse,
             cwsprChatResponseCode: message.responseCode,
             cwsprChatSourceLinkCount: message.suggestionCount,
             cwsprChatReferencesCount: message.codeReferenceCount,
@@ -353,6 +353,7 @@ export class CWCTelemetryHelper {
                         fullResponselatency: event.cwsprChatFullResponseLatency,
                         requestLength: event.cwsprChatRequestLength,
                         responseLength: event.cwsprChatResponseLength,
+                        numberOfCodeBlocks: event.cwsprChatResponseCodeSnippetCount,
                     },
                 },
             })