Skip to content

Commit cef482e

Browse files
authored
telemetry(amazonq): update code percentage event to not consider modification (aws#4927)
1 parent 21fac72 commit cef482e

File tree

3 files changed

+26
-21
lines changed

3 files changed

+26
-21
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererCodeCoverageTracker.kt

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ abstract class CodeWhispererCodeCoverageTracker(
4949
private val myServiceInvocationCount: AtomicInteger
5050
) : Disposable {
5151
val percentage: Long?
52-
get() = if (totalTokensSize != 0L) calculatePercentage(acceptedTokensSize, totalTokensSize) else null
52+
get() = if (totalTokensSize != 0L) calculatePercentage(rawAcceptedTokenSize, totalTokensSize) else null
5353
val acceptedTokensSize: Long
5454
get() = fileToTokens.map {
5555
it.value.acceptedTokens.get()
@@ -62,6 +62,12 @@ abstract class CodeWhispererCodeCoverageTracker(
6262
}.fold(0) { acc, next ->
6363
acc + next
6464
}
65+
private val rawAcceptedTokenSize: Long
66+
get() = fileToTokens.map {
67+
it.value.rawAcceptedTokens.get()
68+
}.fold(0) { acc, next ->
69+
acc + next
70+
}
6571
val acceptedRecommendationsCount: Int
6672
get() = rangeMarkers.size
6773
val serviceInvocationCount: Int
@@ -169,20 +175,17 @@ abstract class CodeWhispererCodeCoverageTracker(
169175
}
170176

171177
private fun incrementAcceptedTokens(document: Document, delta: Int) {
172-
var tokens = fileToTokens[document]
173-
if (tokens == null) {
174-
tokens = CodeCoverageTokens()
175-
fileToTokens[document] = tokens
176-
}
178+
val tokens = fileToTokens.getOrPut(document) { CodeCoverageTokens() }
177179
tokens.acceptedTokens.addAndGet(delta)
178180
}
179181

182+
private fun incrementRawAcceptedTokens(document: Document, delta: Int) {
183+
val tokens = fileToTokens.getOrPut(document) { CodeCoverageTokens() }
184+
tokens.rawAcceptedTokens.addAndGet(delta)
185+
}
186+
180187
private fun incrementTotalTokens(document: Document, delta: Int) {
181-
var tokens = fileToTokens[document]
182-
if (tokens == null) {
183-
tokens = CodeCoverageTokens()
184-
fileToTokens[document] = tokens
185-
}
188+
val tokens = fileToTokens.getOrPut(document) { CodeCoverageTokens() }
186189
tokens.apply {
187190
totalTokens.addAndGet(delta)
188191
if (totalTokens.get() < 0) totalTokens.set(0)
@@ -201,8 +204,6 @@ abstract class CodeWhispererCodeCoverageTracker(
201204
if (percentage == null) return
202205
if (myServiceInvocationCount.get() <= 0) return
203206

204-
// accepted char count without considering modification
205-
var rawAcceptedCharacterCount = 0L
206207
rangeMarkers.forEach { rangeMarker ->
207208
if (!rangeMarker.isValid) return@forEach
208209
// if users add more code upon the recommendation generated from CodeWhisperer, we consider those added part as userToken but not CwsprTokens
@@ -216,9 +217,9 @@ abstract class CodeWhispererCodeCoverageTracker(
216217
}
217218
return@forEach
218219
}
219-
rawAcceptedCharacterCount += originalRecommendation.length
220220
val delta = getAcceptedTokensDelta(originalRecommendation, modifiedRecommendation)
221221
runReadAction {
222+
incrementRawAcceptedTokens(rangeMarker.document, originalRecommendation.length)
222223
incrementAcceptedTokens(rangeMarker.document, delta)
223224
}
224225
}
@@ -230,7 +231,7 @@ abstract class CodeWhispererCodeCoverageTracker(
230231
val response = CodeWhispererClientAdaptor.getInstance(project).sendCodePercentageTelemetry(
231232
language,
232233
customizationArn,
233-
rawAcceptedCharacterCount,
234+
rawAcceptedTokenSize,
234235
totalTokensSize,
235236
acceptedTokensSize
236237
)
@@ -248,7 +249,7 @@ abstract class CodeWhispererCodeCoverageTracker(
248249
CodewhispererTelemetry.codePercentage(
249250
project = null,
250251
codewhispererAcceptedTokens = acceptedTokensSize,
251-
codewhispererSuggestedTokens = rawAcceptedCharacterCount,
252+
codewhispererSuggestedTokens = rawAcceptedTokenSize,
252253
codewhispererLanguage = language.toTelemetryType(),
253254
codewhispererPercentage = percentage,
254255
codewhispererTotalTokens = totalTokensSize,
@@ -282,7 +283,7 @@ abstract class CodeWhispererCodeCoverageTracker(
282283
private val LOG = getLogger<CodeWhispererCodeCoverageTracker>()
283284
private val instances: MutableMap<CodeWhispererProgrammingLanguage, CodeWhispererCodeCoverageTracker> = mutableMapOf()
284285

285-
fun calculatePercentage(acceptedTokens: Long, totalTokens: Long): Long = ((acceptedTokens.toDouble() * 100) / totalTokens).roundToLong()
286+
fun calculatePercentage(rawAcceptedTokenSize: Long, totalTokens: Long): Long = ((rawAcceptedTokenSize.toDouble() * 100) / totalTokens).roundToLong()
286287
fun getInstance(project: Project, language: CodeWhispererProgrammingLanguage): CodeWhispererCodeCoverageTracker =
287288
when (val instance = instances[language]) {
288289
null -> {
@@ -310,12 +311,14 @@ class DefaultCodeWhispererCodeCoverageTracker(project: Project, language: CodeWh
310311
AtomicInteger(0)
311312
)
312313

313-
class CodeCoverageTokens(totalTokens: Int = 0, acceptedTokens: Int = 0) {
314+
class CodeCoverageTokens(totalTokens: Int = 0, acceptedTokens: Int = 0, rawAcceptedTokens: Int = 0) {
314315
val totalTokens: AtomicInteger
315316
val acceptedTokens: AtomicInteger
317+
val rawAcceptedTokens: AtomicInteger
316318

317319
init {
318320
this.totalTokens = AtomicInteger(totalTokens)
319321
this.acceptedTokens = AtomicInteger(acceptedTokens)
322+
this.rawAcceptedTokens = AtomicInteger(rawAcceptedTokens)
320323
}
321324
}

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererCodeCoverageTrackerTest.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ internal abstract class CodeWhispererCodeCoverageTrackerTestBase(myProjectRule:
141141
const val CWSPR_Language = "codewhispererLanguage"
142142
const val CWSPR_ACCEPTED_TOKENS = "codewhispererAcceptedTokens"
143143
const val CWSPR_TOTAL_TOKENS = "codewhispererTotalTokens"
144+
const val CWSPR_RAW_ACCEPTED_TOKENS = "codewhispererSuggestedTokens"
144145
}
145146
}
146147

@@ -429,7 +430,7 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
429430
TOTAL_SECONDS_IN_MINUTE,
430431
CodeWhispererPython.INSTANCE,
431432
mutableListOf(rangeMarkerMock1),
432-
mutableMapOf(fixture.editor.document to CodeCoverageTokens(totalTokens = 100, acceptedTokens = 0)),
433+
mutableMapOf(fixture.editor.document to CodeCoverageTokens(totalTokens = 100, acceptedTokens = 0, rawAcceptedTokens = 0)),
433434
1
434435
)
435436
) {
@@ -444,8 +445,9 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
444445
metricCaptor.allValues,
445446
CODE_PERCENTAGE,
446447
1,
447-
CWSPR_PERCENTAGE to "1",
448+
CWSPR_PERCENTAGE to "3",
448449
CWSPR_ACCEPTED_TOKENS to "1",
450+
CWSPR_RAW_ACCEPTED_TOKENS to "3",
449451
CWSPR_TOTAL_TOKENS to "100",
450452
)
451453
}

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTelemetryTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ class CodeWhispererTelemetryTest : CodeWhispererTestBase() {
514514
"codewhispererAcceptedTokens" to acceptedTokensSize.toString(),
515515
"codewhispererTotalTokens" to totalTokensSize.toString(),
516516
"codewhispererSuggestedTokens" to rawAcceptedTokenSize.toString(),
517-
"codewhispererPercentage" to CodeWhispererCodeCoverageTracker.calculatePercentage(acceptedTokensSize, totalTokensSize).toString(),
517+
"codewhispererPercentage" to CodeWhispererCodeCoverageTracker.calculatePercentage(rawAcceptedTokenSize, totalTokensSize).toString(),
518518
)
519519
}
520520

0 commit comments

Comments
 (0)