Skip to content

Commit 26e28f6

Browse files
authored
fix(amazonq): interaction event project context telemetry boolean accuracy (#4883)
* fix interaction event project context telemetry bug * fix unit test
1 parent 89eab3b commit 26e28f6

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/messenger/ChatPromptHandler.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
9090
ChatMessage(tabId = tabId, triggerId = triggerId, messageId = requestId, messageType = ChatMessageType.Answer, followUps = followUps)
9191

9292
telemetryHelper.setResponseStreamTotalTime(tabId)
93+
telemetryHelper.setResponseHasProjectContext(
94+
requestId,
95+
telemetryHelper.getIsProjectContextEnabled() && data.useRelevantDocuments && data.relevantTextDocuments.isNotEmpty()
96+
)
9397
telemetryHelper.recordAddMessage(data, response, responseText.length, statusCode, countTotalNumberOfCodeBlocks(responseText))
9498
emit(response)
9599
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/telemetry/TelemetryHelper.kt

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
4343
private val responseStreamStartTime: MutableMap<String, Instant> = mutableMapOf()
4444
private val responseStreamTotalTime: MutableMap<String, Int> = mutableMapOf()
4545
private val responseStreamTimeForChunks: MutableMap<String, MutableList<Instant>> = mutableMapOf()
46+
private val responseHasProjectContext: MutableMap<String, Boolean> = mutableMapOf()
4647

4748
private val customization: CodeWhispererCustomization?
4849
get() = CodeWhispererModelConfigurator.getInstance().activeCustomization(context.project)
@@ -65,7 +66,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
6566
TriggerType.ContextMenu, TriggerType.Hotkeys -> CwsprChatTriggerInteraction.ContextMenu
6667
}
6768

68-
private fun getIsProjectContextEnabled() = CodeWhispererSettings.getInstance().isProjectContextEnabled()
69+
fun getIsProjectContextEnabled() = CodeWhispererSettings.getInstance().isProjectContextEnabled()
6970

7071
// When chat panel is focused
7172
fun recordEnterFocusChat() {
@@ -116,7 +117,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
116117
cwsprChatConversationType = CwsprChatConversationType.Chat,
117118
credentialStartUrl = getStartUrl(context.project),
118119
codewhispererCustomizationArn = data.customization?.arn,
119-
cwsprChatHasProjectContext = getIsProjectContextEnabled() && data.useRelevantDocuments && data.relevantTextDocuments.isNotEmpty()
120+
cwsprChatHasProjectContext = getMessageHasProjectContext(response.messageId)
120121
)
121122

122123
val programmingLanguage = data.activeFileContext.fileContext?.fileLanguage
@@ -135,7 +136,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
135136
data.message.length,
136137
responseLength,
137138
numberOfCodeBlocks,
138-
getIsProjectContextEnabled() && data.useRelevantDocuments && data.relevantTextDocuments.isNotEmpty(),
139+
getMessageHasProjectContext(response.messageId),
139140
data.customization
140141
).also {
141142
logger.debug {
@@ -173,7 +174,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
173174
else -> CwsprChatInteractionType.Unknown
174175
},
175176
credentialStartUrl = getStartUrl(context.project),
176-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
177+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
177178
)
178179
ChatInteractWithMessageEvent.builder().apply {
179180
conversationId(getConversationId(message.tabId).orEmpty())
@@ -185,6 +186,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
185186
else -> ChatMessageInteractionType.UNKNOWN_TO_SDK_VERSION
186187
}
187188
)
189+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
188190
}.build()
189191
}
190192

@@ -194,12 +196,13 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
194196
cwsprChatMessageId = message.messageId.orEmpty(),
195197
cwsprChatInteractionType = CwsprChatInteractionType.ClickFollowUp,
196198
credentialStartUrl = getStartUrl(context.project),
197-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
199+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId.orEmpty())
198200
)
199201
ChatInteractWithMessageEvent.builder().apply {
200202
conversationId(getConversationId(message.tabId).orEmpty())
201203
messageId(message.messageId.orEmpty())
202204
interactionType(ChatMessageInteractionType.CLICK_FOLLOW_UP)
205+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId.orEmpty()))
203206
}.build()
204207
}
205208

@@ -214,14 +217,15 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
214217
credentialStartUrl = getStartUrl(context.project),
215218
cwsprChatCodeBlockIndex = message.codeBlockIndex,
216219
cwsprChatTotalCodeBlocks = message.totalCodeBlocks,
217-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
220+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
218221
)
219222
ChatInteractWithMessageEvent.builder().apply {
220223
conversationId(getConversationId(message.tabId).orEmpty())
221224
messageId(message.messageId)
222225
interactionType(ChatMessageInteractionType.COPY_SNIPPET)
223226
interactionTarget(message.insertionTargetType)
224227
acceptedCharacterCount(message.code.length)
228+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
225229
}.build()
226230
}
227231

@@ -237,7 +241,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
237241
credentialStartUrl = getStartUrl(context.project),
238242
cwsprChatCodeBlockIndex = message.codeBlockIndex,
239243
cwsprChatTotalCodeBlocks = message.totalCodeBlocks,
240-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
244+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
241245
)
242246
ChatInteractWithMessageEvent.builder().apply {
243247
conversationId(getConversationId(message.tabId).orEmpty())
@@ -246,6 +250,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
246250
interactionTarget(message.insertionTargetType)
247251
acceptedCharacterCount(message.code.length)
248252
acceptedLineCount(message.code.lines().size)
253+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
249254
}.build()
250255
}
251256

@@ -265,7 +270,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
265270
cwsprChatInteractionTarget = message.link,
266271
cwsprChatHasReference = null,
267272
credentialStartUrl = getStartUrl(context.project),
268-
cwsprChatHasProjectContext = getIsProjectContextEnabled()
273+
cwsprChatHasProjectContext = getMessageHasProjectContext(message.messageId)
269274
)
270275
ChatInteractWithMessageEvent.builder().apply {
271276
conversationId(getConversationId(message.tabId).orEmpty())
@@ -278,6 +283,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
278283
}
279284
)
280285
interactionTarget(message.link)
286+
hasProjectLevelContext(getMessageHasProjectContext(message.messageId))
281287
}.build()
282288
}
283289

@@ -364,6 +370,12 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
364370
responseStreamTotalTime[tabId] = totalTime
365371
}
366372

373+
fun setResponseHasProjectContext(messageId: String, hasProjectContext: Boolean) {
374+
responseHasProjectContext[messageId] = hasProjectContext
375+
}
376+
377+
private fun getMessageHasProjectContext(messageId: String) = responseHasProjectContext.getOrDefault(messageId, false)
378+
367379
@VisibleForTesting
368380
fun getResponseStreamTimeToFirstChunk(tabId: String): Double {
369381
val chunkTimes = responseStreamTimeForChunks[tabId] ?: return 0.0

plugins/amazonq/chat/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/TelemetryHelperTest.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ class TelemetryHelperTest {
331331
messageId(messageId)
332332
interactionType(ChatMessageInteractionType.UPVOTE)
333333
customizationArn(customizationArn)
334+
hasProjectLevelContext(false)
334335
}.build()
335336
)
336337
)
@@ -362,6 +363,7 @@ class TelemetryHelperTest {
362363
}
363364

364365
runBlocking {
366+
sut.setResponseHasProjectContext(messageId, true)
365367
sut.recordInteractWithMessage(IncomingCwcMessage.FollowupClicked(mock(), tabId, messageId, "command", "tabType"))
366368
}
367369

@@ -373,6 +375,7 @@ class TelemetryHelperTest {
373375
messageId(messageId)
374376
interactionType(ChatMessageInteractionType.CLICK_FOLLOW_UP)
375377
customizationArn(customizationArn)
378+
hasProjectLevelContext(true)
376379
}.build()
377380
)
378381
)
@@ -391,7 +394,7 @@ class TelemetryHelperTest {
391394
)
392395
.matches({ it.metadata["credentialStartUrl"] == mockUrl }, "startUrl doesn't match")
393396
.matches(
394-
{ it.metadata["cwsprChatHasProjectContext"] == CodeWhispererSettings.getInstance().isProjectContextEnabled().toString() },
397+
{ it.metadata["cwsprChatHasProjectContext"] == "true" },
395398
"hasProjectContext doesn't match"
396399
)
397400
}
@@ -429,6 +432,7 @@ class TelemetryHelperTest {
429432
interactionTarget("insertionTargetType")
430433
acceptedCharacterCount("println()".length)
431434
customizationArn(customizationArn)
435+
hasProjectLevelContext(false)
432436
}.build()
433437
)
434438
)
@@ -462,7 +466,6 @@ class TelemetryHelperTest {
462466
mockClient.stub {
463467
on { this.sendChatInteractWithMessageTelemetry(any<ChatInteractWithMessageEvent>()) } doReturn mockSteResponse
464468
}
465-
466469
val codeBlockIndex = 1
467470
val totalCodeBlocks = 10
468471
val inserTionTargetType = "insertionTargetType"
@@ -493,6 +496,7 @@ class TelemetryHelperTest {
493496
acceptedCharacterCount(code.length)
494497
acceptedLineCount(code.lines().size)
495498
customizationArn(customizationArn)
499+
hasProjectLevelContext(false)
496500
}.build()
497501
)
498502
)
@@ -552,6 +556,7 @@ class TelemetryHelperTest {
552556
interactionType(ChatMessageInteractionType.CLICK_LINK)
553557
interactionTarget(link)
554558
customizationArn(customizationArn)
559+
hasProjectLevelContext(false)
555560
}.build()
556561
)
557562
)

0 commit comments

Comments
 (0)