Skip to content

Commit e99c9b7

Browse files
author
David Hasani
committed
add LOC submitted data point
1 parent 0b84915 commit e99c9b7

File tree

7 files changed

+47
-12
lines changed

7 files changed

+47
-12
lines changed

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/ArtifactHandler.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFai
3939
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
4040
import software.aws.toolkits.jetbrains.services.codemodernizer.model.ParseZipFailureReason
4141
import software.aws.toolkits.jetbrains.services.codemodernizer.model.UnzipFailureReason
42+
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState
4243
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilArtifactDir
4344
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isValidCodeTransformConnection
4445
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.openTroubleshootingGuideNotificationAction
@@ -70,6 +71,8 @@ class ArtifactHandler(private val project: Project, private val clientAdaptor: G
7071
is DownloadArtifactResult.Success -> {
7172
if (result.artifact !is CodeModernizerArtifact) return notifyUnableToApplyPatch("")
7273
displayDiffUsingPatch(result.artifact.patch, job, source)
74+
val linesOfCodeSubmitted = CodeModernizerSessionState.getInstance(project).getLinesOfCodeSubmitted()
75+
result.artifact.metrics.linesOfCodeSubmitted = linesOfCodeSubmitted
7376
clientAdaptor.sendTransformTelemetryEvent(job, result.artifact.metrics)
7477
}
7578
is DownloadArtifactResult.ParseZipFailure -> notifyUnableToApplyPatch(result.failureReason.errorMessage)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/client/GumbyClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ class GumbyClient(private val project: Project) {
226226
}
227227
it.linesOfCodeChanged(metrics.linesOfCodeChanged)
228228
it.charsOfCodeChanged(metrics.charsOfCodeChanged)
229-
it.linesOfCodeSubmitted(0) // TODO: figure out how to get lines of code submitted from plan stage
229+
it.linesOfCodeSubmitted(metrics.linesOfCodeSubmitted)
230230
}
231231
}
232232
requestBuilder.optOutPreference(getTelemetryOptOutPreference())

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerMetrics.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.model
66
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
77

88
@JsonIgnoreProperties(ignoreUnknown = true)
9-
data class CodeModernizerMetrics(val linesOfCodeChanged: Int, val charsOfCodeChanged: Int)
9+
data class CodeModernizerMetrics(val linesOfCodeChanged: Int, val charsOfCodeChanged: Int, var linesOfCodeSubmitted: Int?)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.PlanTable
2626
import software.aws.toolkits.jetbrains.services.codemodernizer.plan.CodeModernizerPlanEditorProvider.Companion.MIGRATION_PLAN_KEY
2727
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getAuthType
2828
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getBillingText
29+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getLinesOfCodeSubmitted
2930
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getTableMapping
31+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.parseTableMapping
3032
import software.aws.toolkits.jetbrains.services.codewhisperer.layout.CodeWhispererLayoutConfig.addHorizontalGlue
3133
import software.aws.toolkits.resources.message
3234
import software.aws.toolkits.telemetry.CredentialSourceId
@@ -59,12 +61,7 @@ import javax.swing.table.DefaultTableModel
5961

6062
class CodeModernizerPlanEditor(val project: Project, private val virtualFile: VirtualFile) : UserDataHolderBase(), FileEditor {
6163
val plan = virtualFile.getUserData(MIGRATION_PLAN_KEY) ?: throw RuntimeException("Migration plan not found")
62-
private val tableMapping =
63-
if (!plan.transformationSteps()[0].progressUpdates().isNullOrEmpty()) {
64-
getTableMapping(plan.transformationSteps()[0].progressUpdates())
65-
} else {
66-
throw RuntimeException("GetPlan response missing step 0 progress updates with table data")
67-
}
64+
private val tableMapping = getTableMapping(plan.transformationSteps()[0].progressUpdates())
6865
private val mapper = jacksonObjectMapper()
6966

7067
// to-do: convert to UI DSL
@@ -79,8 +76,8 @@ class CodeModernizerPlanEditor(val project: Project, private val virtualFile: Vi
7976
// key "0" reserved for job statistics table
8077
// comes from "name" field of each progressUpdate in step zero of plan
8178
if (JOB_STATISTICS_TABLE_KEY in tableMapping) {
82-
val planTable = mapper.readValue(tableMapping[JOB_STATISTICS_TABLE_KEY], PlanTable::class.java)
83-
val linesOfCode = planTable.rows.find { it.name == "linesOfCode" }?.value?.toInt()
79+
val planTable = parseTableMapping(tableMapping)
80+
val linesOfCode = getLinesOfCodeSubmitted(planTable)
8481
if (linesOfCode != null && linesOfCode > LOC_THRESHOLD && getAuthType(project) == CredentialSourceId.IamIdentityCenter) {
8582
val billingText = getBillingText(linesOfCode)
8683
val billingTextComponent =

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/state/CodeModernizerSessionState.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModerni
1212
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
1313
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobHistoryItem
1414
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
15+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getTableMapping
16+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.parseTableMapping
17+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getLinesOfCodeSubmitted
1518
import java.time.Duration
1619
import java.time.Instant
1720
import kotlin.io.path.Path
@@ -55,4 +58,11 @@ class CodeModernizerSessionState {
5558
}
5659

5760
fun getJobHistory(): Array<JobHistoryItem> = previousJobHistory.values.toTypedArray()
61+
62+
// used to emit a TransformEvent metric at end of transformation
63+
fun getLinesOfCodeSubmitted(): Int? {
64+
val tableMapping = transformationPlan?.transformationSteps()?.get(0)?.let { getTableMapping(it.progressUpdates()) }
65+
val planTable = tableMapping?.let { parseTableMapping(it) }
66+
return planTable?.let { getLinesOfCodeSubmitted(it) }
67+
}
5868
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package software.aws.toolkits.jetbrains.services.codemodernizer.utils
55

6+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
67
import com.intellij.openapi.project.Project
78
import com.intellij.serviceContainer.AlreadyDisposedException
89
import kotlinx.coroutines.delay
@@ -23,7 +24,9 @@ import software.aws.toolkits.core.utils.Waiters.waitUntil
2324
import software.aws.toolkits.jetbrains.services.codemodernizer.CodeTransformTelemetryManager
2425
import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient
2526
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.BILLING_RATE
27+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.JOB_STATISTICS_TABLE_KEY
2628
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
29+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.PlanTable
2730
import software.aws.toolkits.resources.message
2831
import java.time.Duration
2932
import java.util.Locale
@@ -128,11 +131,23 @@ suspend fun JobId.pollTransformationStatusAndPlan(
128131
}
129132

130133
// "name" holds the ID of the corresponding plan step (where table will go) and "description" holds the plan data
131-
fun getTableMapping(stepZeroProgressUpdates: List<TransformationProgressUpdate>) = stepZeroProgressUpdates.associate {
132-
it.name() to it.description()
134+
fun getTableMapping(stepZeroProgressUpdates: List<TransformationProgressUpdate>): Map<String, String> {
135+
if (stepZeroProgressUpdates.isNotEmpty()) {
136+
return stepZeroProgressUpdates.associate {
137+
it.name() to it.description()
138+
}
139+
} else {
140+
throw RuntimeException("GetPlan response missing step 0 progress updates with table data")
141+
}
133142
}
134143

144+
fun parseTableMapping(tableMapping: Map<String, String>): PlanTable =
145+
jacksonObjectMapper().readValue(tableMapping[JOB_STATISTICS_TABLE_KEY], PlanTable::class.java)
146+
135147
fun getBillingText(linesOfCode: Int): String {
136148
val estimatedCost = String.format(Locale.US, "%.2f", linesOfCode.times(BILLING_RATE))
137149
return message("codemodernizer.migration_plan.header.billing_text", linesOfCode, BILLING_RATE, estimatedCost)
138150
}
151+
152+
fun getLinesOfCodeSubmitted(planTable: PlanTable) =
153+
planTable.rows.find { it.name == "linesOfCode" }?.value?.toInt()

plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerTestBase.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenPr
5252
import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient
5353
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerArtifact
5454
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerManifest
55+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerMetrics
5556
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
5657
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformFailureBuildLog
5758
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection
@@ -105,13 +106,15 @@ open class CodeWhispererCodeModernizerTestBase(
105106
internal val validZipSummaryPath = "summary/"
106107
internal val validZipManifestPath = "manifest.json"
107108
internal val validZipPatchFilePath = "patch/diff.patch"
109+
internal val validZipMetricsPath = "metrics/"
108110
internal val validZipManifestVersion = 1.0F
109111
internal val validManifest =
110112
CodeModernizerManifest(
111113
validZipManifestVersion,
112114
validZipPatchDirPath,
113115
validZipArtifactsPath,
114116
validZipSummaryPath,
117+
validZipMetricsPath
115118
)
116119
internal val validTransformationSummary =
117120
TransformationSummary(
@@ -128,6 +131,12 @@ open class CodeWhispererCodeModernizerTestBase(
128131
""".trimIndent(),
129132
)
130133

134+
internal val validMetrics =
135+
CodeModernizerMetrics(
136+
charsOfCodeChanged = 1234,
137+
linesOfCodeChanged = 567
138+
)
139+
131140
internal val exampleCreateUploadUrlResponse =
132141
CreateUploadUrlResponse.builder()
133142
.uploadUrl("https://smth.com")
@@ -280,6 +289,7 @@ open class CodeWhispererCodeModernizerTestBase(
280289
listOf(examplePatchVirtualFile),
281290
validTransformationSummary,
282291
summaryFileMock,
292+
validMetrics
283293
),
284294
)
285295
testTransformFailureBuildLog =

0 commit comments

Comments
 (0)