From cc19c1486cf192803d8267125e430c322e56d9ec Mon Sep 17 00:00:00 2001 From: Kenneth Xu Date: Mon, 22 Dec 2025 17:23:05 -0800 Subject: [PATCH 1/2] fix: emitting programmingLanguage for ChatInteractWithMessageEvent --- .../chat/telemetry/chatTelemetryController.ts | 12 ++++++++++++ .../src/shared/telemetry/telemetryService.ts | 6 ++++++ .../src/shared/telemetry/types.ts | 1 + 3 files changed, 19 insertions(+) diff --git a/server/aws-lsp-codewhisperer/src/language-server/chat/telemetry/chatTelemetryController.ts b/server/aws-lsp-codewhisperer/src/language-server/chat/telemetry/chatTelemetryController.ts index 95e9bc5157..301bc9ad25 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/chat/telemetry/chatTelemetryController.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/chat/telemetry/chatTelemetryController.ts @@ -63,6 +63,7 @@ export class ChatTelemetryController { #tabTelemetryInfoByTabId: { [tabId: string]: ConversationTriggerInfo } #currentTriggerByTabId: { [tabId: string]: TriggerType } = {} #customizationInfoByTabAndMessageId: { [tabId: string]: { [messageId: string]: string } } + #programmingLanguageByTabId: { [tabId: string]: CodewhispererLanguage } = {} #credentialsProvider: CredentialsProvider #telemetry: Telemetry #logging: Logging @@ -73,6 +74,7 @@ export class ChatTelemetryController { this.#tabTelemetryInfoByTabId = {} this.#currentTriggerByTabId = {} this.#customizationInfoByTabAndMessageId = {} + this.#programmingLanguageByTabId = {} this.#telemetry = features.telemetry this.#logging = features.logging this.#credentialsProvider = features.credentialsProvider @@ -103,6 +105,10 @@ export class ChatTelemetryController { return tabId && messageId && this.#customizationInfoByTabAndMessageId[tabId]?.[messageId] } + public getProgrammingLanguage(tabId: string) { + return this.#programmingLanguageByTabId[tabId] + } + public removeConversation(tabId: string) { delete this.#tabTelemetryInfoByTabId[tabId] delete this.#customizationInfoByTabAndMessageId[tabId] @@ -309,6 +315,10 @@ export class ChatTelemetryController { [metric.cwsprChatMessageId]: metric.codewhispererCustomizationArn, } } + // Store the programming language for this tab + if (metric.cwsprChatProgrammingLanguage) { + this.#programmingLanguageByTabId[tabId] = metric.cwsprChatProgrammingLanguage as CodewhispererLanguage + } return this.#telemetryService.emitChatAddMessage( { conversationId: conversationId, @@ -555,6 +565,7 @@ export class ChatTelemetryController { } await this.#telemetryService.emitChatInteractWithMessage(voteData, { conversationId: this.getConversationId(params.tabId), + programmingLanguage: this.getProgrammingLanguage(params.tabId), }) break case ChatUIEventName.InsertToCursorPosition: @@ -581,6 +592,7 @@ export class ChatTelemetryController { params.name === ChatUIEventName.InsertToCursorPosition ? params.code?.split('\n').length : undefined, + programmingLanguage: this.getProgrammingLanguage(params.tabId), }) break case ChatUIEventName.LinkClick: diff --git a/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.ts b/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.ts index 6224d04faa..4ec5410dff 100644 --- a/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.ts +++ b/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.ts @@ -322,6 +322,7 @@ export class TelemetryService { options?: { conversationId?: string acceptedLineCount?: number + programmingLanguage?: CodewhispererLanguage } ) { if (options?.conversationId === undefined) { @@ -351,6 +352,11 @@ export class TelemetryService { if (metric.codewhispererCustomizationArn) { event.customizationArn = metric.codewhispererCustomizationArn } + if (options.programmingLanguage) { + event.programmingLanguage = { + languageName: getRuntimeLanguage(options.programmingLanguage), + } + } return this.invokeSendTelemetryEvent({ chatInteractWithMessageEvent: event, }) diff --git a/server/aws-lsp-codewhisperer/src/shared/telemetry/types.ts b/server/aws-lsp-codewhisperer/src/shared/telemetry/types.ts index 6b22972428..6fa54df636 100644 --- a/server/aws-lsp-codewhisperer/src/shared/telemetry/types.ts +++ b/server/aws-lsp-codewhisperer/src/shared/telemetry/types.ts @@ -459,6 +459,7 @@ export type InteractWithMessageEvent = { cwsprChatCodeBlockIndex?: number cwsprChatTotalCodeBlocks?: number codewhispererCustomizationArn?: string + cwsprChatProgrammingLanguage?: string } export type StartConversationEvent = { From 4d1e2ec738dcb0fb0589970298bdebb1d6f19c25 Mon Sep 17 00:00:00 2001 From: Kenneth Xu Date: Mon, 22 Dec 2025 17:23:05 -0800 Subject: [PATCH 2/2] fix: emitting programmingLanguage for ChatInteractWithMessageEvent --- .../shared/telemetry/telemetryService.test.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.test.ts b/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.test.ts index 32536f73fd..614234ac1a 100644 --- a/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.test.ts +++ b/server/aws-lsp-codewhisperer/src/shared/telemetry/telemetryService.test.ts @@ -527,6 +527,29 @@ describe('TelemetryService', () => { }, }) }) + + it('should send InteractWithMessage with programming language when provided', () => { + const metric = { + cwsprChatMessageId: 'message123', + cwsprChatInteractionType: ChatInteractionType.InsertAtCursor, + cwsprChatAcceptedCharactersLength: 100, + } + telemetryService.emitChatInteractWithMessage(metric, { + conversationId: 'conv123', + programmingLanguage: 'typescript', + }) + + sinon.assert.calledOnce(codeWhisperServiceStub.sendTelemetryEvent) + const call = codeWhisperServiceStub.sendTelemetryEvent.getCall(0) + const event = call?.args[0]?.telemetryEvent?.chatInteractWithMessageEvent + + // Verify programming language is set correctly + if (event) { + sinon.assert.match(event.programmingLanguage, { + languageName: 'typescript', + }) + } + }) }) it('should emit CodeCoverageEvent event to STE and to the destination', () => {