Skip to content

Commit 827882b

Browse files
authored
Update CWSPR telemetry client as per API model changes. (#4086)
1 parent 77d0600 commit 827882b

File tree

5 files changed

+262
-97
lines changed

5 files changed

+262
-97
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse
1616
import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest
1717
import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse
1818
import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient
19+
import software.amazon.awssdk.services.codewhispererruntime.model.ChatInteractWithMessageEvent
20+
import software.amazon.awssdk.services.codewhispererruntime.model.ChatMessageInteractionType
1921
import software.amazon.awssdk.services.codewhispererruntime.model.CompletionType
2022
import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlRequest
2123
import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlResponse
@@ -26,6 +28,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.ListAvailableC
2628
import software.amazon.awssdk.services.codewhispererruntime.model.ListFeatureEvaluationsResponse
2729
import software.amazon.awssdk.services.codewhispererruntime.model.SendTelemetryEventResponse
2830
import software.amazon.awssdk.services.codewhispererruntime.model.SuggestionState
31+
import software.amazon.awssdk.services.codewhispererruntime.model.UserIntent
2932
import software.aws.toolkits.core.utils.debug
3033
import software.aws.toolkits.core.utils.getLogger
3134
import software.aws.toolkits.core.utils.warn
@@ -117,6 +120,38 @@ interface CodeWhispererClientAdaptor : Disposable {
117120

118121
fun sendMetricDataTelemetry(eventName: String, metadata: Map<String, Any?>): SendTelemetryEventResponse
119122

123+
fun sendChatAddMessageTelemetry(
124+
sessionId: String,
125+
requestId: String,
126+
userIntent: UserIntent?,
127+
hasCodeSnippet: Boolean?,
128+
programmingLanguage: String?,
129+
activeEditorTotalCharacters: Int?,
130+
timeToFirstChunkMilliseconds: Double?,
131+
timeBetweenChunks: List<Double>?,
132+
fullResponselatency: Double?,
133+
requestLength: Int?,
134+
responseLength: Int?,
135+
): SendTelemetryEventResponse
136+
137+
fun sendChatInteractWithMessageTelemetry(
138+
sessionId: String,
139+
requestId: String,
140+
interactionType: ChatMessageInteractionType?,
141+
interactionTarget: String?,
142+
acceptedCharacterCount: Int?,
143+
acceptedSnippetHasReference: Boolean?
144+
): SendTelemetryEventResponse
145+
146+
fun sendChatInteractWithMessageTelemetry(event: ChatInteractWithMessageEvent): SendTelemetryEventResponse
147+
148+
fun sendChatUserModificationTelemetry(
149+
sessionId: String,
150+
requestId: String,
151+
language: String?,
152+
modificationPercentage: Double
153+
): SendTelemetryEventResponse
154+
120155
companion object {
121156
fun getInstance(project: Project): CodeWhispererClientAdaptor = project.service()
122157

@@ -335,6 +370,83 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
335370
requestBuilder.userContext(ClientMetadata.DEFAULT_METADATA.codeWhispererUserContext)
336371
}
337372

373+
override fun sendChatAddMessageTelemetry(
374+
sessionId: String,
375+
requestId: String,
376+
userIntent: UserIntent?,
377+
hasCodeSnippet: Boolean?,
378+
programmingLanguage: String?,
379+
activeEditorTotalCharacters: Int?,
380+
timeToFirstChunkMilliseconds: Double?,
381+
timeBetweenChunks: List<Double>?,
382+
fullResponselatency: Double?,
383+
requestLength: Int?,
384+
responseLength: Int?
385+
): SendTelemetryEventResponse = bearerClient().sendTelemetryEvent { requestBuilder ->
386+
requestBuilder.telemetryEvent { telemetryEventBuilder ->
387+
telemetryEventBuilder.chatAddMessageEvent {
388+
it.conversationId(sessionId)
389+
it.messageId(requestId)
390+
it.userIntent(userIntent)
391+
it.hasCodeSnippet(hasCodeSnippet)
392+
if (programmingLanguage != null) it.programmingLanguage { langBuilder -> langBuilder.languageName(programmingLanguage) }
393+
it.activeEditorTotalCharacters(activeEditorTotalCharacters)
394+
it.timeToFirstChunkMilliseconds(timeToFirstChunkMilliseconds)
395+
it.timeBetweenChunks(timeBetweenChunks)
396+
it.fullResponselatency(fullResponselatency)
397+
it.requestLength(requestLength)
398+
it.responseLength(responseLength)
399+
}
400+
}
401+
requestBuilder.optOutPreference(getTelemetryOptOutPreference())
402+
requestBuilder.userContext(ClientMetadata.DEFAULT_METADATA.codeWhispererUserContext)
403+
}
404+
405+
override fun sendChatInteractWithMessageTelemetry(
406+
sessionId: String,
407+
requestId: String,
408+
interactionType: ChatMessageInteractionType?,
409+
interactionTarget: String?,
410+
acceptedCharacterCount: Int?,
411+
acceptedSnippetHasReference: Boolean?
412+
): SendTelemetryEventResponse = sendChatInteractWithMessageTelemetry(
413+
ChatInteractWithMessageEvent.builder().apply {
414+
conversationId(sessionId)
415+
messageId(requestId)
416+
interactionType(interactionType)
417+
interactionTarget(interactionTarget)
418+
acceptedCharacterCount(acceptedCharacterCount)
419+
acceptedSnippetHasReference(acceptedSnippetHasReference)
420+
}.build()
421+
)
422+
423+
override fun sendChatInteractWithMessageTelemetry(event: ChatInteractWithMessageEvent): SendTelemetryEventResponse =
424+
bearerClient().sendTelemetryEvent { requestBuilder ->
425+
requestBuilder.telemetryEvent { telemetryEventBuilder ->
426+
telemetryEventBuilder.chatInteractWithMessageEvent(event)
427+
}
428+
requestBuilder.optOutPreference(getTelemetryOptOutPreference())
429+
requestBuilder.userContext(ClientMetadata.DEFAULT_METADATA.codeWhispererUserContext)
430+
}
431+
432+
override fun sendChatUserModificationTelemetry(
433+
sessionId: String,
434+
requestId: String,
435+
language: String?,
436+
modificationPercentage: Double
437+
): SendTelemetryEventResponse = bearerClient().sendTelemetryEvent { requestBuilder ->
438+
requestBuilder.telemetryEvent { telemetryEventBuilder ->
439+
telemetryEventBuilder.chatUserModificationEvent {
440+
it.conversationId(sessionId)
441+
it.messageId(requestId)
442+
it.programmingLanguage { langBuilder -> langBuilder.languageName(language) }
443+
it.modificationPercentage(modificationPercentage)
444+
}
445+
}
446+
requestBuilder.optOutPreference(getTelemetryOptOutPreference())
447+
requestBuilder.userContext(ClientMetadata.DEFAULT_METADATA.codeWhispererUserContext)
448+
}
449+
338450
override fun dispose() {
339451
if (this::mySigv4Client.isLazyInitialized) {
340452
mySigv4Client.close()

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererUserModificationTracker.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -199,13 +199,7 @@ class CodeWhispererUserModificationTracker(private val project: Project) : Dispo
199199
cwsprChatMessageId = insertedCode.messageId,
200200
cwsprChatModificationPercentage = percentage
201201
)
202-
203-
val metadata: Map<String, Any?> = mapOf(
204-
"cwsprChatConversationId" to insertedCode.conversationId,
205-
"cwsprChatMessageId" to insertedCode.messageId,
206-
"cwsprChatModificationPercentage" to percentage
207-
)
208-
CodeWhispererClientAdaptor.getInstance(project).sendMetricDataTelemetry("amazonq_modifyCode", metadata)
202+
CodeWhispererClientAdaptor.getInstance(project).sendChatUserModificationTelemetry(insertedCode.conversationId, insertedCode.messageId, null, percentage)
209203
}
210204

211205
// temp disable user modfication event for further discussion on metric calculation

jetbrains-core/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/v1/ChatSessionV1.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ class ChatSessionV1(
295295
companion object {
296296
private val logger = getLogger<ChatSessionV1>()
297297

298-
private val validLanguages = arrayOf(
298+
val validLanguages = arrayOf(
299299
"python",
300300
"javascript",
301301
"java",

0 commit comments

Comments
 (0)