Skip to content

Commit bdc3226

Browse files
authored
Adding enabled experiments to feedback metdata (#3167)
1 parent 1c8faa4 commit bdc3226

File tree

4 files changed

+42
-1
lines changed

4 files changed

+42
-1
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/core/experiments/ToolkitExperiment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ internal class ToolkitExperimentManager : PersistentStateComponent<ExperimentSta
157157
internal val EXPERIMENT_CHANGED = Topic.create("experiment service enable state changed", ToolkitExperimentStateChangedListener::class.java)
158158
internal fun getInstance(): ToolkitExperimentManager = service()
159159
internal fun visibleExperiments(): List<ToolkitExperiment> = EP_NAME.extensionList.filterNot { it.hidden }
160+
internal fun enabledExperiments(): List<ToolkitExperiment> = EP_NAME.extensionList.filter { it.isEnabled() }
160161
}
161162
}
162163

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ import software.aws.toolkits.core.telemetry.TelemetryPublisher
1919
import software.aws.toolkits.core.utils.tryOrNull
2020
import software.aws.toolkits.jetbrains.core.credentials.activeRegion
2121
import software.aws.toolkits.jetbrains.core.credentials.getConnectionSettings
22+
import software.aws.toolkits.jetbrains.core.experiments.ToolkitExperimentManager
2223
import software.aws.toolkits.jetbrains.core.getResourceIfPresent
2324
import software.aws.toolkits.jetbrains.services.sts.StsResources
2425
import software.aws.toolkits.jetbrains.settings.AwsSettings
26+
import software.aws.toolkits.jetbrains.ui.feedback.ENABLED_EXPERIMENTS
2527
import java.util.concurrent.atomic.AtomicBoolean
2628

2729
data class MetricEventMetadata(
@@ -115,7 +117,8 @@ abstract class TelemetryService(private val publisher: TelemetryPublisher, priva
115117
}
116118

117119
suspend fun sendFeedback(sentiment: Sentiment, comment: String, metadata: Map<String, String> = emptyMap()) {
118-
publisher.sendFeedback(sentiment, comment, metadata)
120+
val experiments = ToolkitExperimentManager.enabledExperiments().joinToString(",") { it.id }
121+
publisher.sendFeedback(sentiment, comment, metadata + (ENABLED_EXPERIMENTS to experiments))
119122
}
120123

121124
companion object {

jetbrains-core/src/software/aws/toolkits/jetbrains/ui/feedback/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
package software.aws.toolkits.jetbrains.ui.feedback
55

66
const val FEEDBACK_SOURCE = "source"
7+
const val ENABLED_EXPERIMENTS = "experimentsEnabled"

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/telemetry/TelemetryServiceTest.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ package software.aws.toolkits.jetbrains.services.telemetry
55

66
import com.intellij.ide.highlighter.ProjectFileType
77
import com.intellij.openapi.project.ex.ProjectManagerEx
8+
import com.intellij.testFramework.DisposableRule
9+
import com.intellij.testFramework.ExtensionTestUtil
810
import com.intellij.testFramework.PlatformTestUtil
911
import com.intellij.testFramework.ProjectRule
1012
import com.intellij.testFramework.TemporaryDirectory
1113
import com.intellij.testFramework.createTestOpenProjectOptions
14+
import kotlinx.coroutines.ExperimentalCoroutinesApi
15+
import kotlinx.coroutines.test.runBlockingTest
1216
import org.assertj.core.api.Assertions.assertThat
1317
import org.junit.After
1418
import org.junit.Rule
@@ -19,23 +23,29 @@ import org.mockito.kotlin.mock
1923
import org.mockito.kotlin.stub
2024
import org.mockito.kotlin.times
2125
import org.mockito.kotlin.verify
26+
import software.amazon.awssdk.services.toolkittelemetry.model.Sentiment
2227
import software.aws.toolkits.core.credentials.CredentialIdentifier
2328
import software.aws.toolkits.core.region.AwsRegion
2429
import software.aws.toolkits.core.telemetry.DefaultMetricEvent.Companion.METADATA_INVALID
2530
import software.aws.toolkits.core.telemetry.DefaultMetricEvent.Companion.METADATA_NOT_SET
2631
import software.aws.toolkits.core.telemetry.MetricEvent
2732
import software.aws.toolkits.core.telemetry.TelemetryBatcher
2833
import software.aws.toolkits.core.telemetry.TelemetryPublisher
34+
import software.aws.toolkits.core.utils.test.aString
2935
import software.aws.toolkits.jetbrains.core.MockResourceCacheRule
3036
import software.aws.toolkits.jetbrains.core.credentials.AwsConnectionManager
3137
import software.aws.toolkits.jetbrains.core.credentials.ConnectionState
3238
import software.aws.toolkits.jetbrains.core.credentials.MockAwsConnectionManager
3339
import software.aws.toolkits.jetbrains.core.credentials.MockAwsConnectionManager.ProjectAccountSettingsManagerRule
3440
import software.aws.toolkits.jetbrains.core.credentials.MockCredentialManagerRule
3541
import software.aws.toolkits.jetbrains.core.credentials.waitUntilConnectionStateIsStable
42+
import software.aws.toolkits.jetbrains.core.experiments.DummyExperiment
43+
import software.aws.toolkits.jetbrains.core.experiments.ToolkitExperimentManager
44+
import software.aws.toolkits.jetbrains.core.experiments.setState
3645
import software.aws.toolkits.jetbrains.core.region.MockRegionProviderRule
3746
import software.aws.toolkits.jetbrains.services.sts.StsResources
3847
import software.aws.toolkits.jetbrains.settings.AwsSettings
48+
import software.aws.toolkits.jetbrains.ui.feedback.ENABLED_EXPERIMENTS
3949
import java.util.concurrent.CountDownLatch
4050
import java.util.concurrent.TimeUnit
4151

@@ -62,6 +72,10 @@ class TelemetryServiceTest {
6272
@Rule
6373
val connectionSettingsManager = ProjectAccountSettingsManagerRule(projectRule)
6474

75+
@JvmField
76+
@Rule
77+
val disposableRule = DisposableRule()
78+
6579
@After
6680
fun tearDown() {
6781
AwsSettings.getInstance().isTelemetryEnabled = false
@@ -243,6 +257,28 @@ class TelemetryServiceTest {
243257
}
244258
}
245259

260+
@Test
261+
@ExperimentalCoroutinesApi
262+
fun experimentStatusIsIncludedInFeedback() = runBlockingTest {
263+
val fooExperiment = DummyExperiment()
264+
val barExperiment = DummyExperiment()
265+
val bloopExperiment = DummyExperiment()
266+
ExtensionTestUtil.maskExtensions(ToolkitExperimentManager.EP_NAME, listOf(fooExperiment, barExperiment, bloopExperiment), disposableRule.disposable)
267+
268+
fooExperiment.setState(true)
269+
barExperiment.setState(true)
270+
271+
val publisher = mock<TelemetryPublisher>()
272+
val telemetryService = TestTelemetryService(publisher = publisher, batcher = mock())
273+
274+
val comment = aString()
275+
276+
telemetryService.sendFeedback(Sentiment.NEGATIVE, comment)
277+
telemetryService.dispose()
278+
279+
verify(publisher).sendFeedback(Sentiment.NEGATIVE, comment, mapOf(ENABLED_EXPERIMENTS to "${fooExperiment.id},${barExperiment.id}"))
280+
}
281+
246282
@Test
247283
fun disposeClosesThePublisher() {
248284
val mockPublisher = mock<TelemetryPublisher>()

0 commit comments

Comments
 (0)