Skip to content

Commit 400016f

Browse files
authored
Amazon Q Transform: add java and maven versions to metric (#4121)
* Amazon Q Transform: add java and maven versions to metric * update logging for getting mvnw version * Move version utilities into Util class
1 parent fbc7284 commit 400016f

File tree

4 files changed

+78
-13
lines changed

4 files changed

+78
-13
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ mockito = "4.6.1"
2121
mockitoKotlin = "4.0.0"
2222
mockk = "1.13.8"
2323
node-gradle = "7.0.1"
24-
telemetryGenerator = "1.0.176"
24+
telemetryGenerator = "1.0.182"
2525
testLogger = "3.1.0"
2626
testRetry = "1.5.2"
2727
slf4j = "1.7.36"

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,9 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
534534
CodetransformTelemetry.totalRunTime(
535535
codeTransformSessionId = CodeTransformTelemetryState.instance.getSessionId(),
536536
codeTransformResultStatusMessage = result.toString(),
537-
codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime(), Instant.now())
537+
codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime(), Instant.now()),
538+
codeTransformLocalJavaVersion = getJavaVersionFromProjectSetting(project),
539+
codeTransformLocalMavenVersion = getMavenVersions(project),
538540
)
539541
when (result) {
540542
is CodeModernizerJobCompletedResult.UnableToCreateJob -> notifyJobFailure(
@@ -607,7 +609,9 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
607609
CodetransformTelemetry.totalRunTime(
608610
codeTransformSessionId = CodeTransformTelemetryState.instance.getSessionId(),
609611
codeTransformResultStatusMessage = "JobCancelled",
610-
codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime(), Instant.now())
612+
codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime(), Instant.now()),
613+
codeTransformLocalJavaVersion = getJavaVersionFromProjectSetting(project),
614+
codeTransformLocalMavenVersion = getMavenVersions(project),
611615
)
612616
}
613617
} catch (e: Exception) {
@@ -616,7 +620,9 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
616620
CodetransformTelemetry.totalRunTime(
617621
codeTransformSessionId = CodeTransformTelemetryState.instance.getSessionId(),
618622
codeTransformResultStatusMessage = "JobCancelled",
619-
codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime(), Instant.now())
623+
codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime(), Instant.now()),
624+
codeTransformLocalJavaVersion = getJavaVersionFromProjectSetting(project),
625+
codeTransformLocalMavenVersion = getMavenVersions(project),
620626
)
621627
}
622628
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/Utils.kt renamed to jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformUtils.kt

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,21 @@
33

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

6+
import com.intellij.execution.configurations.GeneralCommandLine
7+
import com.intellij.execution.process.ProcessNotCreatedException
8+
import com.intellij.execution.util.ExecUtil
69
import com.intellij.openapi.application.ApplicationInfo
710
import com.intellij.openapi.module.ModuleUtil
811
import com.intellij.openapi.project.Project
12+
import com.intellij.openapi.util.SystemInfo
913
import com.intellij.openapi.vfs.VfsUtilCore
1014
import com.intellij.openapi.vfs.VirtualFile
1115
import com.intellij.openapi.vfs.VirtualFileManager
1216
import com.intellij.serviceContainer.AlreadyDisposedException
17+
import org.jetbrains.idea.maven.project.MavenProjectsManager
18+
import org.jetbrains.idea.maven.utils.MavenUtil
1319
import org.jetbrains.plugins.gradle.settings.GradleSettings
20+
import org.slf4j.LoggerFactory
1421
import software.amazon.awssdk.awscore.exception.AwsServiceException
1522
import software.amazon.awssdk.core.exception.SdkClientException
1623
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException
@@ -26,7 +33,9 @@ import software.aws.toolkits.core.TokenConnectionSettings
2633
import software.aws.toolkits.core.utils.WaiterUnrecoverableException
2734
import software.aws.toolkits.core.utils.Waiters.waitUntil
2835
import software.aws.toolkits.core.utils.createParentDirectories
36+
import software.aws.toolkits.core.utils.error
2937
import software.aws.toolkits.core.utils.exists
38+
import software.aws.toolkits.core.utils.warn
3039
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
3140
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
3241
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProvider
@@ -84,6 +93,8 @@ val TERMINAL_STATES = setOf(
8493
TransformationStatus.COMPLETED,
8594
)
8695

96+
private val LOG = LoggerFactory.getLogger("CodeTransformUtils")
97+
8798
fun String.toVirtualFile() = VirtualFileManager.getInstance().findFileByUrl(VfsUtilCore.pathToUrl(this))
8899
fun Project.moduleFor(path: String) = ModuleUtil.findModuleForFile(
89100
path.toVirtualFile() ?: throw RuntimeException("File not found $path"),
@@ -285,3 +296,55 @@ fun isCodeModernizerAvailable(project: Project): Boolean {
285296
}
286297

287298
fun isGradleProject(project: Project) = !GradleSettings.getInstance(project).linkedProjectsSettings.isEmpty()
299+
300+
fun getJavaVersionFromProjectSetting(project: Project): String? = project.tryGetJdk()?.toString()
301+
302+
fun getMavenVersions(project: Project): String {
303+
fun getVersion(mavenCommand: String): String? {
304+
try {
305+
val commandLine = GeneralCommandLine(listOf(mavenCommand, "-v"))
306+
.withWorkDirectory(project.basePath)
307+
.withRedirectErrorStream(true)
308+
val output = ExecUtil.execAndGetOutput(commandLine)
309+
if (output.exitCode == 0) {
310+
return parseMavenVersion(output.stdout)
311+
} else {
312+
LOG.error { "Failed to fetch $mavenCommand version: ${output.stdout}" }
313+
}
314+
} catch (e: ProcessNotCreatedException) {
315+
LOG.warn { "$mavenCommand not set up" }
316+
} catch (e: Exception) {
317+
LOG.error(e) { "Failed to fetch $mavenCommand version" }
318+
}
319+
return null
320+
}
321+
322+
// Get local maven version
323+
val localMavenVersion: String? = getVersion("mvn")
324+
325+
// Get wrapper maven version
326+
val mvnw = if (SystemInfo.isWindows) "./mvnw.cmd" else "./mvnw"
327+
val wrapperMavenVersion: String? = getVersion(mvnw)
328+
329+
// Get user's Maven setting (using bundled vs local vs wrapper)
330+
val mavenSettings = MavenProjectsManager.getInstance(project).getGeneralSettings()
331+
val mavenHome = mavenSettings.getMavenHome()
332+
// Need to detect bundled Maven version that come with IDEA
333+
// The utility returns "Use Maven wrapper" if using wrapper, "Bundled (Maven 3)" if using Bundled Maven, otherwise the local maven version.
334+
val userMavenSetting = MavenUtil.getMavenVersion(mavenHome) ?: mavenHome
335+
336+
return "$wrapperMavenVersion (mvnw) -- $localMavenVersion (mvn) -- user setting: $userMavenSetting"
337+
}
338+
339+
private fun parseMavenVersion(output: String?): String? {
340+
if (output == null) return null
341+
val mavenVersionIndex = output.indexOf("Apache Maven")
342+
if (mavenVersionIndex == -1) return null
343+
return try {
344+
val mavenVersionString = output.slice(IntRange(mavenVersionIndex + 13, output.length - 1))
345+
mavenVersionString.slice(IntRange(0, output.indexOf(' ') - 1))
346+
} catch (e: StringIndexOutOfBoundsException) {
347+
LOG.error(e) { "Failed to parse Maven version from output: $output" }
348+
null
349+
}
350+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerSessionContext.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,7 @@ data class CodeModernizerSessionContext(
228228

229229
// 1. Try to execute Maven Wrapper Command
230230
var shouldTryMvnCommand = true
231-
val mvnw = if (SystemInfo.isWindows) {
232-
"./mvnw.cmd"
233-
} else {
234-
"./mvnw"
235-
}
231+
val mvnw = if (SystemInfo.isWindows) "./mvnw.cmd" else "./mvnw"
236232
try {
237233
LOG.info { "Executing $mvnw install" }
238234
val installOutput = runInstallCommand(mvnw)
@@ -371,7 +367,7 @@ data class CodeModernizerSessionContext(
371367
buildlogBuilder.appendLine("Command Run: IntelliJ bundled Maven clean install")
372368
transformMvnRunner.run(installParams, mvnsettings, cleanInstalled)
373369
} catch (t: Throwable) {
374-
val error = "Unexpected error when executing bundled Maven clean install"
370+
val error = "Maven Install: Unexpected error when executing bundled Maven clean install"
375371
cleanInstalled.exitCode(Integer.MIN_VALUE) // to stop looking for the exitCode
376372
LOG.error(t) { error }
377373
buildlogBuilder.appendLine("IntelliJ bundled Maven install failed: ${t.message}")
@@ -396,7 +392,7 @@ data class CodeModernizerSessionContext(
396392
buildlogBuilder.appendLine(successMsg)
397393
} else if (cleanInstalled.isComplete() != Integer.MIN_VALUE) {
398394
// TODO: improve bundled maven error logging
399-
val error = "IntelliJ bundled Maven install failed: exitCode ${cleanInstalled.isComplete()}"
395+
val error = "Maven Install: bundled Maven failed: exitCode ${cleanInstalled.isComplete()}"
400396
LOG.error { error }
401397
buildlogBuilder.appendLine(error)
402398
CodetransformTelemetry.mvnBuildFailed(
@@ -412,7 +408,7 @@ data class CodeModernizerSessionContext(
412408
buildlogBuilder.appendLine("Command Run: IntelliJ bundled Maven dependency:copy-dependencies")
413409
transformMvnRunner.run(copyParams, mvnsettings, createdDependencies)
414410
} catch (t: Throwable) {
415-
val error = "Unexpected error when executing bundled Maven dependency:copy-dependencies"
411+
val error = "Maven Copy: Unexpected error when executing bundled Maven copy-dependencies"
416412
createdDependencies.exitCode(Integer.MIN_VALUE) // to stop looking for the exitCode
417413
LOG.error(t) { error }
418414
buildlogBuilder.appendLine("IntelliJ bundled Maven copy-dependencies failed: ${t.message}")
@@ -436,7 +432,7 @@ data class CodeModernizerSessionContext(
436432
LOG.info { successMsg }
437433
buildlogBuilder.appendLine(successMsg)
438434
} else if (createdDependencies.isComplete() != Integer.MIN_VALUE) {
439-
val error = "IntelliJ bundled Maven copy-dependencies failed: exitCode ${createdDependencies.isComplete()}"
435+
val error = "Maven Copy: bundled Maven failed: exitCode ${createdDependencies.isComplete()}"
440436
LOG.error { error }
441437
buildlogBuilder.appendLine(error)
442438
CodetransformTelemetry.mvnBuildFailed(

0 commit comments

Comments
 (0)