From 0ad89ada9dc1b78206ae4a10c800ce3a5bc4b882 Mon Sep 17 00:00:00 2001 From: Nick Ardecky Date: Fri, 31 May 2024 10:46:12 -0700 Subject: [PATCH 1/7] Feature - add new class for codeTransformMetaData to trim and json encode properly --- .../CodeTransformTelemetryManager.kt | 11 ++-- .../controller/CodeTransformChatController.kt | 10 ++-- .../model/CodeTransformTelemetryMetadata.kt | 50 +++++++++++++++++++ .../CodeTransformTelemetryMetadataTest.kt | 32 ++++++++++++ 4 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt create mode 100644 plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt index dc5a64651b8..2e55f5b1aae 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt @@ -6,12 +6,14 @@ package software.aws.toolkits.jetbrains.services.codemodernizer import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import kotlinx.serialization.encodeToString import org.apache.commons.codec.digest.DigestUtils import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStatus import software.aws.toolkits.jetbrains.core.gettingstarted.editor.ActiveConnection import software.aws.toolkits.jetbrains.core.gettingstarted.editor.ActiveConnectionType import software.aws.toolkits.jetbrains.core.gettingstarted.editor.BearerTokenFeatureSet import software.aws.toolkits.jetbrains.core.gettingstarted.editor.checkBearerConnectionValidity +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryMetadata import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationResult @@ -196,11 +198,11 @@ class CodeTransformTelemetryManager(private val project: Project) { ) } - fun logHil(jobId: String, metaData: HilTelemetryMetaData, success: Boolean, reason: String) { + fun logHil(jobId: String, metaData: CodeTransformTelemetryMetadata, success: Boolean, reason: String) { CodetransformTelemetry.humanInTheLoop( project, jobId, - metaData.toString(), + metaData.toJsonString(), sessionId, reason, success, @@ -223,8 +225,3 @@ class CodeTransformTelemetryManager(private val project: Project) { fun getInstance(project: Project): CodeTransformTelemetryManager = project.service() } } - -data class HilTelemetryMetaData( - val dependencyVersionSelected: String? = null, - val cancelledFromChat: Boolean = false, -) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt index 69b4de7119d..db5e9ec5211 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt @@ -18,7 +18,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController import software.aws.toolkits.jetbrains.services.codemodernizer.ArtifactHandler import software.aws.toolkits.jetbrains.services.codemodernizer.CodeModernizerManager import software.aws.toolkits.jetbrains.services.codemodernizer.CodeTransformTelemetryManager -import software.aws.toolkits.jetbrains.services.codemodernizer.HilTelemetryMetaData import software.aws.toolkits.jetbrains.services.codemodernizer.InboundAppMessagesHandler import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformActionMessage @@ -58,6 +57,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTran import software.aws.toolkits.jetbrains.services.codemodernizer.messages.IncomingCodeTransformMessage import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryMetadata import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult @@ -411,7 +411,7 @@ class CodeTransformChatController( } catch (e: Exception) { telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - HilTelemetryMetaData( + CodeTransformTelemetryMetadata( cancelledFromChat = false, ), success = false, @@ -500,7 +500,7 @@ class CodeTransformChatController( telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id as String, - HilTelemetryMetaData( + CodeTransformTelemetryMetadata( dependencyVersionSelected = selectedVersion, ), success = true, @@ -532,7 +532,7 @@ class CodeTransformChatController( telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - HilTelemetryMetaData( + CodeTransformTelemetryMetadata( cancelledFromChat = true, ), success = false, @@ -546,7 +546,7 @@ class CodeTransformChatController( } catch (e: Exception) { telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - HilTelemetryMetaData( + CodeTransformTelemetryMetadata( cancelledFromChat = false, ), success = false, diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt new file mode 100644 index 00000000000..2d1a0ec8b4a --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt @@ -0,0 +1,50 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +const val MAX_STRINGIFIED_LENGTH = 65536 + +@Serializable +data class CodeTransformTelemetryMetadata( + val dependencyVersionSelected: String? = null, + val cancelledFromChat: Boolean = false, +) { + + fun toJsonString(): String { + var trimmedJsonString = trimJsonString(MAX_STRINGIFIED_LENGTH) + return trimmedJsonString + } + + private fun trimJsonString(maxLength: Int): String { + val jsonString = Json.encodeToString(this) + + if (jsonString.length <= maxLength) { + return jsonString + } + + val jsonElements = jsonString.split(",") + val trimmedJsonElements = mutableListOf() + var currentLength = 0 + + for (element in jsonElements) { + val elementLength = element.length + 1 // Add 1 for the comma + if (currentLength + elementLength <= maxLength) { + trimmedJsonElements.add(element) + currentLength += elementLength + } else { + break + } + } + + val trimmedJsonString = trimmedJsonElements.joinToString(",", "{", "}") + return if (trimmedJsonString.length <= maxLength) { + trimmedJsonString + } else { + trimmedJsonString.substring(0, maxLength) + } + } +} diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt new file mode 100644 index 00000000000..244bd31f4a8 --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt @@ -0,0 +1,32 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +import junit.framework.TestCase.assertEquals +import org.junit.Test + +class CodeTransformTelemetryMetadataTest { + + @Test + fun `test toJsonString serializes object correctly`() { + val metadata = CodeTransformTelemetryMetadata( + dependencyVersionSelected = "1.2.3", + cancelledFromChat = true + ) + + val expectedJsonString = """{"dependencyVersionSelected":"1.2.3","cancelledFromChat":true}""" + assertEquals(expectedJsonString, metadata.toJsonString()) + } + + @Test + fun `test trimJsonString trims JSON string to specified length`() { + val longString = "a".repeat(MAX_STRINGIFIED_LENGTH + 1000) + val metadata = CodeTransformTelemetryMetadata( + dependencyVersionSelected = longString, + cancelledFromChat = true + ) + val expectedTrimmedJsonString = """{"dependencyVersionSelected":"${longString.substring(0, MAX_STRINGIFIED_LENGTH - 30)}","cancelledFromChat":true}""" + assertEquals(expectedTrimmedJsonString, metadata.toJsonString()) + } +} From be773f4c597a8f95ff5b1ee3bca9bf4c94ddd64f Mon Sep 17 00:00:00 2001 From: Nick Ardecky Date: Fri, 31 May 2024 10:46:12 -0700 Subject: [PATCH 2/7] Feature - add new class for codeTransformMetaData to trim and json encode properly --- .idea/copyright/apache.xml | 6 --- .idea/copyright/profiles_settings.xml | 10 ---- .../CodeTransformTelemetryManager.kt | 10 ++-- .../controller/CodeTransformChatController.kt | 24 ++++----- .../model/CodeTransformTelemetryMetadata.kt | 54 +++++++++++++++++++ ...CodeTransformTelemetryMetadataSingleton.kt | 18 +++++++ ...TransformTelemetryMetadataSingletonTest.kt | 38 +++++++++++++ 7 files changed, 122 insertions(+), 38 deletions(-) delete mode 100644 .idea/copyright/apache.xml delete mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt create mode 100644 plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt create mode 100644 plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt diff --git a/.idea/copyright/apache.xml b/.idea/copyright/apache.xml deleted file mode 100644 index 6ffc5ce632f..00000000000 --- a/.idea/copyright/apache.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index 71b11e39984..00000000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt index dc5a64651b8..75f9bd5ab6e 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformTelemetryManager.kt @@ -12,6 +12,7 @@ import software.aws.toolkits.jetbrains.core.gettingstarted.editor.ActiveConnecti import software.aws.toolkits.jetbrains.core.gettingstarted.editor.ActiveConnectionType import software.aws.toolkits.jetbrains.core.gettingstarted.editor.BearerTokenFeatureSet import software.aws.toolkits.jetbrains.core.gettingstarted.editor.checkBearerConnectionValidity +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryMetadata import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationResult @@ -196,11 +197,11 @@ class CodeTransformTelemetryManager(private val project: Project) { ) } - fun logHil(jobId: String, metaData: HilTelemetryMetaData, success: Boolean, reason: String) { + fun logHil(jobId: String, metaData: CodeTransformTelemetryMetadata, success: Boolean, reason: String) { CodetransformTelemetry.humanInTheLoop( project, jobId, - metaData.toString(), + metaData.toJsonString(), sessionId, reason, success, @@ -223,8 +224,3 @@ class CodeTransformTelemetryManager(private val project: Project) { fun getInstance(project: Project): CodeTransformTelemetryManager = project.service() } } - -data class HilTelemetryMetaData( - val dependencyVersionSelected: String? = null, - val cancelledFromChat: Boolean = false, -) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt index 69b4de7119d..2abcd40f4ae 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt @@ -18,7 +18,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController import software.aws.toolkits.jetbrains.services.codemodernizer.ArtifactHandler import software.aws.toolkits.jetbrains.services.codemodernizer.CodeModernizerManager import software.aws.toolkits.jetbrains.services.codemodernizer.CodeTransformTelemetryManager -import software.aws.toolkits.jetbrains.services.codemodernizer.HilTelemetryMetaData import software.aws.toolkits.jetbrains.services.codemodernizer.InboundAppMessagesHandler import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformActionMessage @@ -58,6 +57,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTran import software.aws.toolkits.jetbrains.services.codemodernizer.messages.IncomingCodeTransformMessage import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryMetadataSingleton import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult @@ -409,11 +409,10 @@ class CodeTransformChatController( codeModernizerManager.resumePollingFromHil() } catch (e: Exception) { + CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(false) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - HilTelemetryMetaData( - cancelledFromChat = false, - ), + CodeTransformTelemetryMetadataSingleton.getInstance(), success = false, reason = "Runtime Error when trying to resume transformation from HIL", ) @@ -497,12 +496,10 @@ class CodeTransformChatController( try { codeModernizerManager.tryResumeWithAlternativeVersion(selectedVersion) - + CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected(selectedVersion) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id as String, - HilTelemetryMetaData( - dependencyVersionSelected = selectedVersion, - ), + CodeTransformTelemetryMetadataSingleton.getInstance(), success = true, reason = "User selected version" ) @@ -529,12 +526,10 @@ class CodeTransformChatController( try { codeModernizerManager.rejectHil() - + CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - HilTelemetryMetaData( - cancelledFromChat = true, - ), + CodeTransformTelemetryMetadataSingleton.getInstance(), success = false, reason = "User cancelled" ) @@ -544,11 +539,10 @@ class CodeTransformChatController( } codeModernizerManager.resumePollingFromHil() } catch (e: Exception) { + CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(false) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - HilTelemetryMetaData( - cancelledFromChat = false, - ), + CodeTransformTelemetryMetadataSingleton.getInstance(), success = false, reason = "Runtime Error when trying to resume transformation from HIL", ) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt new file mode 100644 index 00000000000..055d9733529 --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt @@ -0,0 +1,54 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +const val CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH = 65536 + +@Serializable +data class CodeTransformTelemetryMetadata( + var dependencyVersionSelected: String? = null, + var cancelledFromChat: Boolean = false, +) { + private val propertyValues = listOf( + "dependencyVersionSelected" to dependencyVersionSelected, + "cancelledFromChat" to cancelledFromChat + ) + + operator fun iterator(): Iterator> = propertyValues.iterator() + + fun toJsonString(): String { + var trimmedJsonString = trimJsonString(CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH) + return trimmedJsonString + } + + fun resetDefaults() { + dependencyVersionSelected = null + cancelledFromChat = false + } + + private fun trimJsonString(maxLength: Int): String { + val jsonString = Json.encodeToString(this) + + if (jsonString.length <= maxLength) { + return jsonString + } + + val trimmedPropertyValues = mutableListOf>() + var currentLength = 0 + for ((key, value) in propertyValues) { + val elementLength = key.length + value.toString().length + 5 // add 5 for quotes and comma around key-value pair + if (currentLength + elementLength <= maxLength) { + trimmedPropertyValues.add(Pair(key, value)) + currentLength += elementLength + } + // else we omit the key/value pair as a way of "trimming" the object that is too large + } + + return Json.encodeToString(trimmedPropertyValues.toMap()) + } +} diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt new file mode 100644 index 00000000000..57e1d2ac064 --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt @@ -0,0 +1,18 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +object CodeTransformTelemetryMetadataSingleton { + private val instance = CodeTransformTelemetryMetadata() + + fun getInstance() = instance + + fun setDependencyVersionSelected(version: String?) { + instance.dependencyVersionSelected = version + } + + fun setCancelledFromChat(cancelled: Boolean) { + instance.cancelledFromChat = cancelled + } +} diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt new file mode 100644 index 00000000000..ccfea0be708 --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt @@ -0,0 +1,38 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +import junit.framework.TestCase.assertEquals +import org.junit.Test + +open class CodeTransformTelemetryMetadataSingletonTest { + @Test + fun `test sets values and resets defaults properly`() { + CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected("1.2.3") + CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) + assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().dependencyVersionSelected, "1.2.3") + assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().cancelledFromChat, true) + + CodeTransformTelemetryMetadataSingleton.getInstance().resetDefaults() + assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().dependencyVersionSelected, null) + assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().cancelledFromChat, false) + } + + @Test + fun `test toJsonString serializes object correctly`() { + CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected("1.2.3") + CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) + val expectedJsonString = """{"dependencyVersionSelected":"1.2.3","cancelledFromChat":true}""" + assertEquals(expectedJsonString, CodeTransformTelemetryMetadataSingleton.getInstance().toJsonString()) + } + + @Test + fun `test trimJsonString trims JSON string to specified length`() { + val longString = "a".repeat(CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH + 1000) + CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected(longString) + CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) + + val expectedTrimmedJsonString = """{"cancelledFromChat":true}""" + assertEquals(expectedTrimmedJsonString, CodeTransformTelemetryMetadataSingleton.getInstance().toJsonString()) + } +} From 9ed9c3f45518d242750f53e9ff5984354d5e82c1 Mon Sep 17 00:00:00 2001 From: Nick Ardecky Date: Fri, 31 May 2024 13:33:53 -0700 Subject: [PATCH 3/7] Chore - add jacksonObjectMapper to serialize our JSON objects --- .../codemodernizer/CodeModernizerManager.kt | 2 ++ .../model/CodeTransformTelemetryMetadata.kt | 22 ++++++++----- .../MaxLengthTelemetryStringSerializer.kt | 17 ++++++++++ ...TransformTelemetryMetadataSingletonTest.kt | 11 ++++--- .../CodeTransformTelemetryMetadataTest.kt | 32 ------------------- 5 files changed, 39 insertions(+), 45 deletions(-) create mode 100644 plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt delete mode 100644 plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt index 66dc7625a7d..39120b8af0c 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt @@ -40,6 +40,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModerni import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerStartJobResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryMetadataSingleton import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection import software.aws.toolkits.jetbrains.services.codemodernizer.model.Dependency import software.aws.toolkits.jetbrains.services.codemodernizer.model.InvalidTelemetryReason @@ -120,6 +121,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo ) init { CodeModernizerSessionState.getInstance(project).setDefaults() + CodeTransformTelemetryMetadataSingleton.getInstance().resetDefaults() } fun validate(project: Project): ValidationResult { diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt index 055d9733529..1444a61fd1a 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadata.kt @@ -3,13 +3,11 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.model -import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper const val CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH = 65536 -@Serializable data class CodeTransformTelemetryMetadata( var dependencyVersionSelected: String? = null, var cancelledFromChat: Boolean = false, @@ -31,9 +29,17 @@ data class CodeTransformTelemetryMetadata( cancelledFromChat = false } + /** + * @description We have a truncation function for all fields to be less than 1000 characters. + * If this fails, we try to completely remove fields to limit the size sent to backend to prevent + * an overflow when submitting data. + */ private fun trimJsonString(maxLength: Int): String { - val jsonString = Json.encodeToString(this) - + val objectMapper = jacksonObjectMapper() + objectMapper.registerModule( + SimpleModule().addSerializer(String::class.java, MaxLengthTelemetryStringSerializer()) + ) + val jsonString = objectMapper.writeValueAsString(this) if (jsonString.length <= maxLength) { return jsonString } @@ -41,7 +47,7 @@ data class CodeTransformTelemetryMetadata( val trimmedPropertyValues = mutableListOf>() var currentLength = 0 for ((key, value) in propertyValues) { - val elementLength = key.length + value.toString().length + 5 // add 5 for quotes and comma around key-value pair + val elementLength = key.length + value.toString().length + 5 // add 5 for quotes and comma around key-value pairs if (currentLength + elementLength <= maxLength) { trimmedPropertyValues.add(Pair(key, value)) currentLength += elementLength @@ -49,6 +55,6 @@ data class CodeTransformTelemetryMetadata( // else we omit the key/value pair as a way of "trimming" the object that is too large } - return Json.encodeToString(trimmedPropertyValues.toMap()) + return objectMapper.writeValueAsString(trimmedPropertyValues.toMap()) } } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt new file mode 100644 index 00000000000..b9225a16278 --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt @@ -0,0 +1,17 @@ +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.JsonSerializer +import com.fasterxml.jackson.databind.SerializerProvider + +val MAX_SERIALIZABLE_STRING_LENGTH = 1000 +class MaxLengthTelemetryStringSerializer : JsonSerializer() { + override fun serialize(value: String, gen: JsonGenerator, provider: SerializerProvider) { + val truncatedValue = if (value.length > MAX_SERIALIZABLE_STRING_LENGTH) { + value.substring(0, MAX_SERIALIZABLE_STRING_LENGTH) + } else { + value + } + gen.writeString(truncatedValue) + } +} diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt index ccfea0be708..2ba238b1e11 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt @@ -7,19 +7,20 @@ import org.junit.Test open class CodeTransformTelemetryMetadataSingletonTest { @Test - fun `test sets values and resets defaults properly`() { + fun `CodeTransformTelemetryMetadata will set values and resets defaults properly`() { CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected("1.2.3") CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().dependencyVersionSelected, "1.2.3") assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().cancelledFromChat, true) + // check reset defaults works CodeTransformTelemetryMetadataSingleton.getInstance().resetDefaults() assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().dependencyVersionSelected, null) assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().cancelledFromChat, false) } @Test - fun `test toJsonString serializes object correctly`() { + fun `CodeTransformTelemetryMetadataSingletonTest toJsonString() will serialize object correctly`() { CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected("1.2.3") CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) val expectedJsonString = """{"dependencyVersionSelected":"1.2.3","cancelledFromChat":true}""" @@ -27,12 +28,12 @@ open class CodeTransformTelemetryMetadataSingletonTest { } @Test - fun `test trimJsonString trims JSON string to specified length`() { - val longString = "a".repeat(CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH + 1000) + fun `CodeTransformTelemetryMetadataSingletonTest trimJsonString() trims single field JSON string to specified length`() { + val longString = "a".repeat(CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH) CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected(longString) CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) - val expectedTrimmedJsonString = """{"cancelledFromChat":true}""" + val expectedTrimmedJsonString = """{"dependencyVersionSelected":"${"a".repeat(MAX_SERIALIZABLE_STRING_LENGTH)}","cancelledFromChat":true}""" assertEquals(expectedTrimmedJsonString, CodeTransformTelemetryMetadataSingleton.getInstance().toJsonString()) } } diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt deleted file mode 100644 index 244bd31f4a8..00000000000 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataTest.kt +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.codemodernizer.model - -import junit.framework.TestCase.assertEquals -import org.junit.Test - -class CodeTransformTelemetryMetadataTest { - - @Test - fun `test toJsonString serializes object correctly`() { - val metadata = CodeTransformTelemetryMetadata( - dependencyVersionSelected = "1.2.3", - cancelledFromChat = true - ) - - val expectedJsonString = """{"dependencyVersionSelected":"1.2.3","cancelledFromChat":true}""" - assertEquals(expectedJsonString, metadata.toJsonString()) - } - - @Test - fun `test trimJsonString trims JSON string to specified length`() { - val longString = "a".repeat(MAX_STRINGIFIED_LENGTH + 1000) - val metadata = CodeTransformTelemetryMetadata( - dependencyVersionSelected = longString, - cancelledFromChat = true - ) - val expectedTrimmedJsonString = """{"dependencyVersionSelected":"${longString.substring(0, MAX_STRINGIFIED_LENGTH - 30)}","cancelledFromChat":true}""" - assertEquals(expectedTrimmedJsonString, metadata.toJsonString()) - } -} From d9d51b107e20451e982ba1311c4f216c44ac45bb Mon Sep 17 00:00:00 2001 From: Nick Ardecky Date: Fri, 31 May 2024 13:34:55 -0700 Subject: [PATCH 4/7] Chore - fix detekt issues --- .../model/MaxLengthTelemetryStringSerializer.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt index b9225a16278..1ade978b342 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/MaxLengthTelemetryStringSerializer.kt @@ -1,10 +1,12 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package software.aws.toolkits.jetbrains.services.codemodernizer.model import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.databind.JsonSerializer import com.fasterxml.jackson.databind.SerializerProvider -val MAX_SERIALIZABLE_STRING_LENGTH = 1000 +const val MAX_SERIALIZABLE_STRING_LENGTH = 1000 class MaxLengthTelemetryStringSerializer : JsonSerializer() { override fun serialize(value: String, gen: JsonGenerator, provider: SerializerProvider) { val truncatedValue = if (value.length > MAX_SERIALIZABLE_STRING_LENGTH) { From b0656e97af71079a558d6a0d0d1f400d8299fcc1 Mon Sep 17 00:00:00 2001 From: Nick Ardecky Date: Fri, 31 May 2024 13:43:15 -0700 Subject: [PATCH 5/7] Chore - put back ignored files --- .idea/copyright/apache.xml | 6 ++++++ .idea/copyright/profiles_settings.xml | 10 ++++++++++ 2 files changed, 16 insertions(+) create mode 100644 .idea/copyright/apache.xml create mode 100644 .idea/copyright/profiles_settings.xml diff --git a/.idea/copyright/apache.xml b/.idea/copyright/apache.xml new file mode 100644 index 00000000000..16dc792db7d --- /dev/null +++ b/.idea/copyright/apache.xml @@ -0,0 +1,6 @@ + + + + diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000000..8ce5cc1bd5f --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,10 @@ + + + + + + + + + From b710532da7e4ae30d28a4c18fab42b6d7155e0f9 Mon Sep 17 00:00:00 2001 From: Nick Ardecky Date: Fri, 31 May 2024 13:47:00 -0700 Subject: [PATCH 6/7] Chore - put 2 space tabe indents for files --- .idea/copyright/apache.xml | 8 ++++---- .idea/copyright/profiles_settings.xml | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.idea/copyright/apache.xml b/.idea/copyright/apache.xml index 16dc792db7d..3869f237543 100644 --- a/.idea/copyright/apache.xml +++ b/.idea/copyright/apache.xml @@ -1,6 +1,6 @@ - - + + diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml index 8ce5cc1bd5f..728e8dc65d2 100644 --- a/.idea/copyright/profiles_settings.xml +++ b/.idea/copyright/profiles_settings.xml @@ -1,10 +1,10 @@ - - - - - - - + + + + + + + From 5ce8f32edb7795af5c28e8495d2b328aab6bde1b Mon Sep 17 00:00:00 2001 From: Nick Ardecky Date: Tue, 11 Jun 2024 16:02:59 -0700 Subject: [PATCH 7/7] Chore - move telemetry to be an app level service --- .../codemodernizer/CodeModernizerManager.kt | 4 +- .../controller/CodeTransformChatController.kt | 18 ++++---- ...CodeTransformTelemetryMetadataSingleton.kt | 18 -------- .../model/CodeTransformTelemetryService.kt | 23 ++++++++++ ...TransformTelemetryMetadataSingletonTest.kt | 39 ---------------- .../CodeTransformTelemetryServiceTest.kt | 45 +++++++++++++++++++ 6 files changed, 79 insertions(+), 68 deletions(-) delete mode 100644 plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt create mode 100644 plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryService.kt delete mode 100644 plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt create mode 100644 plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryServiceTest.kt diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt index 39120b8af0c..2ec965fb139 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt @@ -40,7 +40,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModerni import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerStartJobResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact -import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryMetadataSingleton +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryService import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection import software.aws.toolkits.jetbrains.services.codemodernizer.model.Dependency import software.aws.toolkits.jetbrains.services.codemodernizer.model.InvalidTelemetryReason @@ -121,7 +121,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo ) init { CodeModernizerSessionState.getInstance(project).setDefaults() - CodeTransformTelemetryMetadataSingleton.getInstance().resetDefaults() + CodeTransformTelemetryService.getInstance().resetDefaults() } fun validate(project: Project): ValidationResult { diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt index 46b0a79e610..10f320ba910 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt @@ -58,7 +58,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTran import software.aws.toolkits.jetbrains.services.codemodernizer.messages.IncomingCodeTransformMessage import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact -import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryMetadataSingleton +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformTelemetryService import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId @@ -417,10 +417,10 @@ class CodeTransformChatController( codeModernizerManager.resumePollingFromHil() } catch (e: Exception) { - CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(false) + CodeTransformTelemetryService.setCancelledFromChat(false) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - CodeTransformTelemetryMetadataSingleton.getInstance(), + CodeTransformTelemetryService.getInstance(), success = false, reason = "Runtime Error when trying to resume transformation from HIL", ) @@ -509,10 +509,10 @@ class CodeTransformChatController( try { codeModernizerManager.tryResumeWithAlternativeVersion(selectedVersion) - CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected(selectedVersion) + CodeTransformTelemetryService.setDependencyVersionSelected(selectedVersion) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id as String, - CodeTransformTelemetryMetadataSingleton.getInstance(), + CodeTransformTelemetryService.getInstance(), success = true, reason = "User selected version" ) @@ -539,10 +539,10 @@ class CodeTransformChatController( try { codeModernizerManager.rejectHil() - CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) + CodeTransformTelemetryService.setCancelledFromChat(true) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - CodeTransformTelemetryMetadataSingleton.getInstance(), + CodeTransformTelemetryService.getInstance(), success = false, reason = "User cancelled" ) @@ -552,10 +552,10 @@ class CodeTransformChatController( } codeModernizerManager.resumePollingFromHil() } catch (e: Exception) { - CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(false) + CodeTransformTelemetryService.setCancelledFromChat(false) telemetry.logHil( CodeModernizerSessionState.getInstance(context.project).currentJobId?.id.orEmpty(), - CodeTransformTelemetryMetadataSingleton.getInstance(), + CodeTransformTelemetryService.getInstance(), success = false, reason = "Runtime Error when trying to resume transformation from HIL", ) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt deleted file mode 100644 index 57e1d2ac064..00000000000 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingleton.kt +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.codemodernizer.model - -object CodeTransformTelemetryMetadataSingleton { - private val instance = CodeTransformTelemetryMetadata() - - fun getInstance() = instance - - fun setDependencyVersionSelected(version: String?) { - instance.dependencyVersionSelected = version - } - - fun setCancelledFromChat(cancelled: Boolean) { - instance.cancelledFromChat = cancelled - } -} diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryService.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryService.kt new file mode 100644 index 00000000000..87b61e85cbe --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryService.kt @@ -0,0 +1,23 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +import com.intellij.openapi.components.Service + +@Service(Service.Level.APP) +public final class CodeTransformTelemetryService { + companion object { + private val instance = CodeTransformTelemetryMetadata() + + fun getInstance() = instance + + fun setDependencyVersionSelected(version: String?) { + instance.dependencyVersionSelected = version + } + + fun setCancelledFromChat(cancelled: Boolean) { + instance.cancelledFromChat = cancelled + } + } +} diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt deleted file mode 100644 index 2ba238b1e11..00000000000 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryMetadataSingletonTest.kt +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package software.aws.toolkits.jetbrains.services.codemodernizer.model - -import junit.framework.TestCase.assertEquals -import org.junit.Test - -open class CodeTransformTelemetryMetadataSingletonTest { - @Test - fun `CodeTransformTelemetryMetadata will set values and resets defaults properly`() { - CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected("1.2.3") - CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) - assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().dependencyVersionSelected, "1.2.3") - assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().cancelledFromChat, true) - - // check reset defaults works - CodeTransformTelemetryMetadataSingleton.getInstance().resetDefaults() - assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().dependencyVersionSelected, null) - assertEquals(CodeTransformTelemetryMetadataSingleton.getInstance().cancelledFromChat, false) - } - - @Test - fun `CodeTransformTelemetryMetadataSingletonTest toJsonString() will serialize object correctly`() { - CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected("1.2.3") - CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) - val expectedJsonString = """{"dependencyVersionSelected":"1.2.3","cancelledFromChat":true}""" - assertEquals(expectedJsonString, CodeTransformTelemetryMetadataSingleton.getInstance().toJsonString()) - } - - @Test - fun `CodeTransformTelemetryMetadataSingletonTest trimJsonString() trims single field JSON string to specified length`() { - val longString = "a".repeat(CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH) - CodeTransformTelemetryMetadataSingleton.setDependencyVersionSelected(longString) - CodeTransformTelemetryMetadataSingleton.setCancelledFromChat(true) - - val expectedTrimmedJsonString = """{"dependencyVersionSelected":"${"a".repeat(MAX_SERIALIZABLE_STRING_LENGTH)}","cancelledFromChat":true}""" - assertEquals(expectedTrimmedJsonString, CodeTransformTelemetryMetadataSingleton.getInstance().toJsonString()) - } -} diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryServiceTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryServiceTest.kt new file mode 100644 index 00000000000..6b7dc2526be --- /dev/null +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeTransformTelemetryServiceTest.kt @@ -0,0 +1,45 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package software.aws.toolkits.jetbrains.services.codemodernizer.model + +import com.intellij.testFramework.ApplicationRule +import junit.framework.TestCase.assertEquals +import org.junit.Rule +import org.junit.Test + +open class CodeTransformTelemetryServiceTest { + @Rule + @JvmField + val applicationRule = ApplicationRule() + + @Test + fun `CodeTransformTelemetryMetadata will set values and resets defaults properly`() { + CodeTransformTelemetryService.setDependencyVersionSelected("1.2.3") + CodeTransformTelemetryService.setCancelledFromChat(true) + assertEquals(CodeTransformTelemetryService.getInstance().dependencyVersionSelected, "1.2.3") + assertEquals(CodeTransformTelemetryService.getInstance().cancelledFromChat, true) + + // check reset defaults works + CodeTransformTelemetryService.getInstance().resetDefaults() + assertEquals(CodeTransformTelemetryService.getInstance().dependencyVersionSelected, null) + assertEquals(CodeTransformTelemetryService.getInstance().cancelledFromChat, false) + } + + @Test + fun `CodeTransformTelemetryMetadataSingletonTest toJsonString() will serialize object correctly`() { + CodeTransformTelemetryService.setDependencyVersionSelected("1.2.3") + CodeTransformTelemetryService.setCancelledFromChat(true) + val expectedJsonString = """{"dependencyVersionSelected":"1.2.3","cancelledFromChat":true}""" + assertEquals(expectedJsonString, CodeTransformTelemetryService.getInstance().toJsonString()) + } + + @Test + fun `CodeTransformTelemetryMetadataSingletonTest trimJsonString() trims single field JSON string to specified length`() { + val longString = "a".repeat(CODETRANSFORM_METADATA_MAX_STRINGIFIED_LENGTH) + CodeTransformTelemetryService.setDependencyVersionSelected(longString) + CodeTransformTelemetryService.setCancelledFromChat(true) + + val expectedTrimmedJsonString = """{"dependencyVersionSelected":"${"a".repeat(MAX_SERIALIZABLE_STRING_LENGTH)}","cancelledFromChat":true}""" + assertEquals(expectedTrimmedJsonString, CodeTransformTelemetryService.getInstance().toJsonString()) + } +}