Skip to content

Commit 3a6652d

Browse files
authored
CodeWhisperer: Make CodeWhisperer CodePercentage metric not track deletion events (#3866)
1. This is also to prevent the case when the percentage can go over 100% 2. Add a TODO for the ideal approach
1 parent 35da4fb commit 3a6652d

File tree

4 files changed

+13
-8
lines changed

4 files changed

+13
-8
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEditorListener.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class CodeWhispererEditorListener : EditorFactoryListener {
2424
// If language is supported, install document listener for CodeWhisperer service
2525
editor.document.addDocumentListener(
2626
object : BulkAwareDocumentListener {
27+
// TODO: Track only deletion changes within the current 5-min interval which will give
28+
// the most accurate code percentage data.
2729
override fun documentChanged(event: DocumentEvent) {
2830
if (!isCodeWhispererEnabled(project)) return
2931
CodeWhispererInvocationStatus.getInstance().documentChanged()

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererCodeCoverageTracker.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,8 @@ abstract class CodeWhispererCodeCoverageTracker(
8181
override fun afterAccept(states: InvocationContext, sessionContext: SessionContext, rangeMarker: RangeMarker) {
8282
if (states.requestContext.fileContextInfo.programmingLanguage != language) return
8383
rangeMarkers.add(rangeMarker)
84-
val originalRecommendation = extractRangeMarkerString(rangeMarker)
85-
originalRecommendation?.let {
86-
rangeMarker.putUserData(KEY_REMAINING_RECOMMENDATION, it)
87-
}
84+
val originalRecommendation = extractRangeMarkerString(rangeMarker) ?: return
85+
rangeMarker.putUserData(KEY_REMAINING_RECOMMENDATION, originalRecommendation)
8886
}
8987
}
9088
)
@@ -114,6 +112,9 @@ abstract class CodeWhispererCodeCoverageTracker(
114112
}
115113
// This case capture IDE reformatting the document, which will be blank string
116114
if (isDocumentEventFromReformatting(event)) return
115+
116+
// Don't capture deletion events
117+
if (event.newLength <= event.oldLength) return
117118
incrementTotalTokens(event.document, event.newLength - event.oldLength)
118119
}
119120

@@ -181,6 +182,8 @@ abstract class CodeWhispererCodeCoverageTracker(
181182
}
182183

183184
internal fun emitCodeWhispererCodeContribution() {
185+
// If the user is inactive, don't emit the telemetry
186+
if (percentage == null) return
184187
rangeMarkers.forEach { rangeMarker ->
185188
if (!rangeMarker.isValid) return@forEach
186189
// if users add more code upon the recommendation generated from CodeWhisperer, we consider those added part as userToken but not CwsprTokens

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
246246
}
247247

248248
@Test
249-
fun `test tracker is listening to document changes and increment totalTokens - delete code`() {
249+
fun `test tracker is listening to document changes and increment totalTokens - delete code should not affect`() {
250250
val pythonTracker = TestCodePercentageTracker(
251251
project,
252252
TOTAL_SECONDS_IN_MINUTE,
@@ -265,7 +265,7 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
265265
}
266266
}
267267

268-
assertThat(pythonTracker.totalTokensSize).isEqualTo(pythonTestLeftContext.length - 3)
268+
assertThat(pythonTracker.totalTokensSize).isEqualTo(pythonTestLeftContext.length)
269269
}
270270

271271
@Test

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTelemetryTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ class CodeWhispererTelemetryTest : CodeWhispererTestBase() {
530530
CodeWhispererCodeCoverageTracker.getInstance(project, CodeWhispererPython.INSTANCE).dispose()
531531

532532
val acceptedTokensSize = pythonResponse.completions()[0].content().length - deletedTokenByUser
533-
val totalTokensSize = pythonTestLeftContext.length + pythonResponse.completions()[0].content().length - deletedTokenByUser
533+
val totalTokensSize = pythonTestLeftContext.length + pythonResponse.completions()[0].content().length
534534

535535
val metricCaptor = argumentCaptor<MetricEvent>()
536536
verify(batcher, atLeastOnce()).enqueue(metricCaptor.capture())
@@ -578,7 +578,7 @@ class CodeWhispererTelemetryTest : CodeWhispererTestBase() {
578578
}
579579

580580
val acceptedTokensSize = pythonResponse.completions()[0].content().length
581-
val totalTokensSize = pythonTestLeftContext.length + pythonResponse.completions()[0].content().length + anotherCodeSnippet.length - 1
581+
val totalTokensSize = pythonTestLeftContext.length + pythonResponse.completions()[0].content().length + anotherCodeSnippet.length
582582

583583
val metricCaptor = argumentCaptor<MetricEvent>()
584584
verify(batcher, atLeastOnce()).enqueue(metricCaptor.capture())

0 commit comments

Comments
 (0)