Skip to content

Commit 6f0842d

Browse files
committed
Whitelist
1 parent 61ccb99 commit 6f0842d

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevControllerExtensions.kt

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,22 @@ import com.intellij.notification.NotificationAction
77
import software.aws.toolkits.jetbrains.services.amazonq.RepoSizeLimitError
88
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher
99
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CODE_GENERATION_RETRY_LIMIT
10+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CodeGenerationException
1011
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CodeIterationLimitException
1112
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ContentLengthException
13+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ConversationIdNotFoundException
1214
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.EmptyPatchException
15+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ExportParseException
1316
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.GuardrailsException
1417
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MetricDataOperationName
1518
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MetricDataResult
1619
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MonthlyConversationLimitError
1720
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.NoChangeRequiredException
1821
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.PromptRefusalException
1922
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ThrottlingException
23+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.UploadCodeException
2024
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.UploadURLExpired
25+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ZipFileCorruptedException
2126
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FeatureDevMessageType
2227
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FollowUp
2328
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FollowUpStatusType
@@ -38,6 +43,8 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.InsertAct
3843
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.getFollowUpOptions
3944
import software.aws.toolkits.jetbrains.utils.notifyInfo
4045
import software.aws.toolkits.resources.message
46+
import java.io.PrintWriter
47+
import java.io.StringWriter
4148

4249
suspend 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\tat $element")
322+
}
323+
324+
throwable.cause?.let { cause ->
325+
printer.println("$prefix\tCaused by: ")
326+
printExceptionDetails(cause, "$prefix\t")
327+
}
328+
329+
throwable.suppressed.forEach { suppressed ->
330+
printer.println("$prefix\tSuppressed: ")
331+
printExceptionDetails(suppressed, "$prefix\t")
332+
}
333+
}
334+
335+
printExceptionDetails(error)
336+
return writer.toString()
337+
}

plugins/amazonq/chat/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevControllerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ class FeatureDevControllerTest : FeatureDevTestBase() {
696696
mockInOrder.verify(mockSession).sendMetricDataTelemetry(
697697
eq(MetricDataOperationName.EndCodeGeneration),
698698
eq(expectedResult),
699-
argThat { this.contains("stack trace: ") ?: false }
699+
argThat { this.startsWith("stack trace: ") ?: false }
700700
)
701701
}
702702
}

0 commit comments

Comments
 (0)