Skip to content

Commit b0ebef0

Browse files
feat(amazonq): emit telemetry events for explainIssue and applyFix commands
1 parent 8ed39dd commit b0ebef0

File tree

4 files changed

+46
-11
lines changed

4 files changed

+46
-11
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ mockitoKotlin = "5.4.1-SNAPSHOT"
2828
mockk = "1.13.17"
2929
nimbus-jose-jwt = "9.40"
3030
node-gradle = "7.0.2"
31-
telemetryGenerator = "1.0.322"
31+
telemetryGenerator = "1.0.329"
3232
testLogger = "4.0.0"
3333
testRetry = "1.5.10"
3434
# test-only; platform provides slf4j transitively at runtime

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/HandleIssueCommandAction.kt

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ import com.intellij.openapi.actionSystem.AnActionEvent
1010
import com.intellij.openapi.actionSystem.DataKey
1111
import com.intellij.openapi.application.ApplicationManager
1212
import com.intellij.openapi.project.DumbAware
13-
import com.intellij.ui.dsl.stringToInt
1413
import kotlinx.coroutines.runBlocking
1514
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
1615
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
1716
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
1817
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_TO_PROMPT
1918
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
2019
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
20+
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.TelemetryHelper
21+
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.getStartUrl
2122

2223
class HandleIssueCommandAction : AnAction(), DumbAware {
2324
override fun getActionUpdateThread() = ActionUpdateThread.BGT
@@ -26,14 +27,12 @@ class HandleIssueCommandAction : AnAction(), DumbAware {
2627
e.presentation.isEnabledAndVisible = e.project != null
2728
}
2829
fun createLineRangeText(issueContext: MutableMap<String, String>): String {
29-
val startLineString = issueContext["startLine"]
30-
val endLineString = issueContext["endLine"]
31-
val startLineInteger = stringToInt(startLineString ?: return "")
32-
val endLineInteger = stringToInt(endLineString ?: return "")
33-
return if (startLineInteger == endLineInteger) {
34-
"[$startLineInteger]"
30+
val startLine = issueContext["startLine"]
31+
val endLine = issueContext["endLine"]
32+
return if (startLine.equals(endLine)) {
33+
"[$startLine]"
3534
} else {
36-
"[$startLineInteger, $endLineInteger]"
35+
"[$startLine, $endLine]"
3736
}
3837
}
3938

@@ -43,6 +42,18 @@ class HandleIssueCommandAction : AnAction(), DumbAware {
4342
val actionDataKey = DataKey.create<String>("amazonq.codescan.handleIssueCommandAction")
4443
val context = e.getData(contextDataKey) ?: return
4544
val action = e.getData(actionDataKey) ?: return
45+
46+
// Emit telemetry event
47+
TelemetryHelper.recordTelemetryIssueCommandAction(
48+
context["findingId"].orEmpty(),
49+
context["detectorId"].orEmpty(),
50+
context["ruleId"].orEmpty(),
51+
context["autoDetected"].orEmpty(),
52+
getStartUrl(project).orEmpty(),
53+
action, // The action name (explainIssue or applyFix)
54+
"Succeeded"
55+
)
56+
4657
ActionManager.getInstance().getAction("q.openchat").actionPerformed(e)
4758

4859
ApplicationManager.getApplication().executeOnPooledThread {
@@ -54,7 +65,7 @@ class HandleIssueCommandAction : AnAction(), DumbAware {
5465
val prompt = "$actionString ${context["title"]} issue in ${context["fileName"]} at ${createLineRangeText(context)}"
5566

5667
val modelPrompt = "$actionString ${context["title"]} issue in ${context["fileName"]} at ${createLineRangeText(context)}" +
57-
"Issue: \"${context["issue"]}\" \n"
68+
"Issue: \"${context}\" \n"
5869

5970
val params = SendToPromptParams(
6071
selection = codeSelection,

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,26 @@ class TelemetryHelper(private val project: Project, private val sessionStorage:
441441
.credentialStartUrl(startUrl)
442442
}
443443
}
444+
445+
fun recordTelemetryIssueCommandAction(
446+
findingId: String,
447+
detectorId: String,
448+
ruleId: String,
449+
autoDetected: String,
450+
startUrl: String,
451+
metricName: String,
452+
result: String,
453+
) {
454+
Telemetry.amazonq.codeReviewTool.use {
455+
it.reason(metricName)
456+
.setAttribute("findingId", findingId)
457+
.setAttribute("detectorId", detectorId)
458+
.setAttribute("ruleId", ruleId)
459+
.setAttribute("credentialStartUrl", startUrl)
460+
.setAttribute("autoDetected", autoDetected)
461+
.setAttribute("result", result)
462+
}
463+
}
444464
}
445465
}
446466

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/utils/CodeWhispererCodeScanIssueUtils.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,11 @@ private fun handleIssueCommand(issue: CodeWhispererCodeScanIssue, action: IssueC
252252
"endLine" to issue.endLine.toString(),
253253
"recommendation" to jacksonObjectMapper().writeValueAsString(issue.recommendation),
254254
"suggestedFixes" to jacksonObjectMapper().writeValueAsString(issue.suggestedFixes),
255-
"codeSnippet" to jacksonObjectMapper().writeValueAsString(issue.codeSnippet)
255+
"codeSnippet" to jacksonObjectMapper().writeValueAsString(issue.codeSnippet),
256+
"findingId" to issue.findingId,
257+
"ruleId" to issue.ruleId.orEmpty(),
258+
"detectorId" to issue.detectorId,
259+
"autoDetected" to issue.autoDetected.toString(),
256260
)
257261
val actionEvent = AnActionEvent.createFromInputEvent(
258262
null,

0 commit comments

Comments
 (0)