@@ -21,7 +21,6 @@ import com.intellij.openapi.wm.ToolWindowManager
21
21
import kotlinx.coroutines.Job
22
22
import kotlinx.coroutines.delay
23
23
import kotlinx.coroutines.launch
24
- import org.apache.commons.codec.digest.DigestUtils
25
24
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationJob
26
25
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationPlan
27
26
import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStatus
@@ -48,7 +47,6 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.ValidationR
48
47
import software.aws.toolkits.jetbrains.services.codemodernizer.panels.managers.CodeModernizerBottomWindowPanelManager
49
48
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState
50
49
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerState
51
- import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeTransformTelemetryState
52
50
import software.aws.toolkits.jetbrains.services.codemodernizer.state.StateFlags
53
51
import software.aws.toolkits.jetbrains.services.codemodernizer.state.buildState
54
52
import software.aws.toolkits.jetbrains.services.codemodernizer.state.getLatestJobId
@@ -61,21 +59,17 @@ import software.aws.toolkits.jetbrains.utils.notifyStickyError
61
59
import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
62
60
import software.aws.toolkits.resources.message
63
61
import software.aws.toolkits.telemetry.CodeTransformCancelSrcComponents
64
- import software.aws.toolkits.telemetry.CodeTransformJavaSourceVersionsAllowed
65
- import software.aws.toolkits.telemetry.CodeTransformJavaTargetVersionsAllowed
66
62
import software.aws.toolkits.telemetry.CodeTransformPreValidationError
67
63
import software.aws.toolkits.telemetry.CodeTransformStartSrcComponents
68
- import software.aws.toolkits.telemetry.CodetransformTelemetry
69
- import software.aws.toolkits.telemetry.Result
70
64
import java.time.Instant
71
- import java.util.Base64
72
65
import java.util.concurrent.atomic.AtomicBoolean
73
66
import javax.swing.Icon
74
67
75
68
const val AMAZON_Q_FEEDBACK_DIALOG_KEY = " Amazon Q"
76
69
77
70
@State(name = " codemodernizerStates" , storages = [Storage (" aws.xml" , roamingType = RoamingType .PER_OS )])
78
71
class CodeModernizerManager (private val project : Project ) : PersistentStateComponent<CodeModernizerState>, Disposable {
72
+ private val telemetry = CodeTransformTelemetryManager .getInstance(project)
79
73
private var managerState = CodeModernizerState ()
80
74
val codeModernizerBottomWindowPanelManager by lazy { CodeModernizerBottomWindowPanelManager (project) }
81
75
private val codeModernizerBottomWindowPanelContent by lazy {
@@ -204,11 +198,11 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
204
198
205
199
fun validateAndStart (srcStartComponent : CodeTransformStartSrcComponents = CodeTransformStartSrcComponents .DevToolsStartButton ) =
206
200
projectCoroutineScope(project).launch {
207
- sendUserClickedTelemetry(srcStartComponent)
201
+ telemetry. sendUserClickedTelemetry(srcStartComponent)
208
202
if (isModernizationInProgress.getAndSet(true )) return @launch
209
203
val validationResult = validate(project)
210
204
runInEdt {
211
- sendValidationResultTelemetry (validationResult)
205
+ telemetry.sendValidationResult (validationResult)
212
206
if (validationResult.valid) {
213
207
runModernize(validationResult.validatedBuildFiles) ? : isModernizationInProgress.set(false )
214
208
} else {
@@ -218,58 +212,17 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
218
212
}
219
213
}
220
214
221
- private fun sendUserClickedTelemetry (srcStartComponent : CodeTransformStartSrcComponents ) {
222
- CodeTransformTelemetryState .instance.setSessionId()
223
- CodeTransformTelemetryState .instance.setStartTime()
224
- CodetransformTelemetry .isDoubleClickedToTriggerUserModal(
225
- codeTransformStartSrcComponents = srcStartComponent,
226
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
227
- )
228
- }
229
-
230
- private fun sendValidationResultTelemetry (validationResult : ValidationResult , onProjectFirstOpen : Boolean = false) {
231
- // Old telemetry event to be fired only when users click on transform
232
- if (! validationResult.valid && ! onProjectFirstOpen) {
233
- CodetransformTelemetry .isDoubleClickedToTriggerInvalidProject(
234
- codeTransformPreValidationError = validationResult.invalidTelemetryReason.category ? : CodeTransformPreValidationError .Unknown ,
235
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
236
- result = Result .Failed ,
237
- reason = validationResult.invalidTelemetryReason.additonalInfo
238
- )
239
- }
240
- // New projectDetails metric should always be fired whether the project was valid or invalid
241
- CodetransformTelemetry .projectDetails(
242
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
243
- result = if (! validationResult.valid) Result .Failed else Result .Succeeded ,
244
- reason = if (! validationResult.valid) validationResult.invalidTelemetryReason.additonalInfo else null ,
245
- codeTransformPreValidationError = validationResult.invalidTelemetryReason.category ? : CodeTransformPreValidationError .Unknown ,
246
- codeTransformLocalJavaVersion = project.tryGetJdk().toString()
247
- )
248
- }
249
-
250
215
fun stopModernize () {
251
216
if (isModernizationJobActive()) {
252
217
userInitiatedStopCodeModernization()
253
- CodetransformTelemetry .jobIsCancelledByUser(
254
- codeTransformCancelSrcComponents = CodeTransformCancelSrcComponents .DevToolsStopButton ,
255
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId()
256
- )
218
+ telemetry.jobIsCancelledByUser(CodeTransformCancelSrcComponents .DevToolsStopButton )
257
219
}
258
220
}
259
221
260
- private fun calculateProjectHash (customerSelection : CustomerSelection ) = Base64
261
- .getEncoder()
262
- .encodeToString(DigestUtils .sha256(customerSelection.configurationFile.path))
263
-
264
222
fun runModernize (validatedBuildFiles : List <VirtualFile >): Job ? {
265
223
initStopParameters()
266
224
val customerSelection = getCustomerSelection(validatedBuildFiles) ? : return null
267
- CodetransformTelemetry .jobStartedCompleteFromPopupDialog(
268
- codeTransformJavaSourceVersionsAllowed = CodeTransformJavaSourceVersionsAllowed .from(customerSelection.sourceJavaVersion.name),
269
- codeTransformJavaTargetVersionsAllowed = CodeTransformJavaTargetVersionsAllowed .from(customerSelection.targetJavaVersion.name),
270
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
271
- codeTransformProjectId = calculateProjectHash(customerSelection),
272
- )
225
+ telemetry.jobStartedCompleteFromPopupDialog(customerSelection)
273
226
initModernizationJobUI(true , project.getModuleOrProjectNameForFile(customerSelection.configurationFile))
274
227
val session = createCodeModernizerSession(customerSelection, project)
275
228
codeTransformationSession = session
@@ -479,7 +432,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
479
432
// Gather project details
480
433
if (onProjectFirstOpen) {
481
434
val validationResult = validate(project)
482
- sendValidationResultTelemetry (validationResult, onProjectFirstOpen)
435
+ telemetry.sendValidationResult (validationResult, onProjectFirstOpen)
483
436
}
484
437
485
438
val context = managerState.toSessionContext(project)
@@ -541,11 +494,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
541
494
)
542
495
}
543
496
}
544
- CodetransformTelemetry .jobIsResumedAfterIdeClose(
545
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
546
- codeTransformJobId = lastJobId.id,
547
- codeTransformStatus = result.status().toString()
548
- )
497
+ telemetry.jobIsResumedAfterIdeClose(lastJobId, result.status())
549
498
} catch (e: AccessDeniedException ) {
550
499
LOG .error { " Unable to resume job as credentials are invalid" }
551
500
// User is logged in with old or invalid credentials, nothing to do until they log in with valid credentials
@@ -641,14 +590,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
641
590
listOf (openTroubleshootingGuideNotificationAction(TROUBLESHOOTING_URL_PREREQUISITES ), displayFeedbackNotificationAction()),
642
591
)
643
592
}
644
- CodetransformTelemetry .totalRunTime(
645
- codeTransformJobId = jobId?.toString(),
646
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
647
- codeTransformResultStatusMessage = result.toString(),
648
- codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState .instance.getStartTime(), Instant .now()),
649
- codeTransformLocalJavaVersion = getJavaVersionFromProjectSetting(project),
650
- codeTransformLocalMavenVersion = getMavenVersion(project),
651
- )
593
+ telemetry.totalRunTime(result.toString(), jobId)
652
594
}
653
595
654
596
fun createCodeModernizerSession (customerSelection : CustomerSelection , project : Project ) = CodeModernizerSession (
@@ -669,33 +611,19 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
669
611
fun userInitiatedStopCodeModernization () {
670
612
notifyTransformationStartStopping()
671
613
if (transformationStoppedByUsr.getAndSet(true )) return
672
- val currentId = codeTransformationSession?.getActiveJobId()?.id
614
+ val currentId = codeTransformationSession?.getActiveJobId()
673
615
projectCoroutineScope(project).launch {
674
616
try {
675
- val success = codeTransformationSession?.stopTransformation(currentId) ? : true // no session -> no job to stop
617
+ val success = codeTransformationSession?.stopTransformation(currentId?.id ) ? : true // no session -> no job to stop
676
618
if (! success) {
677
619
// This should not happen
678
620
throw CodeModernizerException (message(" codemodernizer.notification.info.transformation_start_stopping.as_no_response" ))
679
- } else {
680
- // Code successfully stopped toast will display when post job is run after this
681
- CodetransformTelemetry .totalRunTime(
682
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
683
- codeTransformResultStatusMessage = " JobCancelled" ,
684
- codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState .instance.getStartTime(), Instant .now()),
685
- codeTransformLocalJavaVersion = getJavaVersionFromProjectSetting(project),
686
- codeTransformLocalMavenVersion = getMavenVersion(project),
687
- )
688
621
}
689
622
} catch (e: Exception ) {
690
623
LOG .error(e) { e.message.toString() }
691
624
notifyTransformationFailedToStop(e.localizedMessage)
692
- CodetransformTelemetry .totalRunTime(
693
- codeTransformSessionId = CodeTransformTelemetryState .instance.getSessionId(),
694
- codeTransformResultStatusMessage = " JobCancelled" ,
695
- codeTransformRunTimeLatency = calculateTotalLatency(CodeTransformTelemetryState .instance.getStartTime(), Instant .now()),
696
- codeTransformLocalJavaVersion = getJavaVersionFromProjectSetting(project),
697
- codeTransformLocalMavenVersion = getMavenVersion(project),
698
- )
625
+ } finally {
626
+ telemetry.totalRunTime(" JobCancelled" , currentId)
699
627
}
700
628
}
701
629
}
0 commit comments