@@ -7,17 +7,22 @@ import com.intellij.notification.NotificationAction
77import software.aws.toolkits.jetbrains.services.amazonq.RepoSizeLimitError
88import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher
99import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CODE_GENERATION_RETRY_LIMIT
10+ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CodeGenerationException
1011import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CodeIterationLimitException
1112import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ContentLengthException
13+ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ConversationIdNotFoundException
1214import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.EmptyPatchException
15+ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ExportParseException
1316import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.GuardrailsException
1417import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MetricDataOperationName
1518import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MetricDataResult
1619import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MonthlyConversationLimitError
1720import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.NoChangeRequiredException
1821import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.PromptRefusalException
1922import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ThrottlingException
23+ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.UploadCodeException
2024import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.UploadURLExpired
25+ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ZipFileCorruptedException
2126import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FeatureDevMessageType
2227import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FollowUp
2328import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FollowUpStatusType
@@ -38,6 +43,8 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.InsertAct
3843import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.getFollowUpOptions
3944import software.aws.toolkits.jetbrains.utils.notifyInfo
4045import software.aws.toolkits.resources.message
46+ import java.io.PrintWriter
47+ import java.io.StringWriter
4148
4249suspend fun FeatureDevController.onCodeGeneration (
4350 session : Session ,
@@ -179,7 +186,7 @@ suspend fun FeatureDevController.onCodeGeneration(
179186 session.sendMetricDataTelemetry(
180187 operationName = MetricDataOperationName .EndCodeGeneration ,
181188 result = result,
182- log = " stack trace: " + err.stackTraceToString( )
189+ log = " stack trace: " + getStackTraceForError(err )
183190 )
184191 throw err
185192 } finally {
@@ -281,3 +288,50 @@ private fun FeatureDevController.openChatNotificationAction() =
281288 ) {
282289 toolWindow?.show()
283290 }
291+
292+ // Should include error messages only for whitelisted exceptions
293+ // i.e. exceptions with deterministic error messages and do not include sensitive data
294+ private fun getStackTraceForError (error : Throwable ): String {
295+ val writer = StringWriter ()
296+ val printer = PrintWriter (writer)
297+ val seenExceptions = mutableSetOf<Throwable >()
298+
299+ fun printExceptionDetails (throwable : Throwable , prefix : String = "") {
300+ if (throwable in seenExceptions) {
301+ return
302+ }
303+ seenExceptions.add(throwable)
304+
305+ when (throwable) {
306+ is NoChangeRequiredException , is EmptyPatchException , is ContentLengthException , is ZipFileCorruptedException ,
307+ is UploadURLExpired , is CodeIterationLimitException , is GuardrailsException ,
308+ is PromptRefusalException , is ThrottlingException , is ExportParseException ,
309+ is CodeGenerationException , is UploadCodeException ,
310+ is ConversationIdNotFoundException , is RepoSizeLimitError ,
311+ -> {
312+ printer.println (" $prefix${throwable.javaClass.name} : ${throwable.message} " )
313+ }
314+ else -> {
315+ // No message included
316+ printer.println (" $prefix${throwable.javaClass.name} " )
317+ }
318+ }
319+
320+ throwable.stackTrace.forEach { element ->
321+ printer.println (" $prefix \t at $element " )
322+ }
323+
324+ throwable.cause?.let { cause ->
325+ printer.println (" $prefix \t Caused by: " )
326+ printExceptionDetails(cause, " $prefix \t " )
327+ }
328+
329+ throwable.suppressed.forEach { suppressed ->
330+ printer.println (" $prefix \t Suppressed: " )
331+ printExceptionDetails(suppressed, " $prefix \t " )
332+ }
333+ }
334+
335+ printExceptionDetails(error)
336+ return writer.toString()
337+ }
0 commit comments