Skip to content

Commit 214c7d3

Browse files
authored
feat: increase flag polling interval; add flag poller interval config (#59)
1 parent f1ee01d commit 214c7d3

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

sdk/src/main/java/com/amplitude/experiment/DefaultExperimentClient.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import com.amplitude.experiment.analytics.ExposureEvent as OldExposureEvent
4646

4747
private const val EU_SERVER_URL = "https://api.lab.eu.amplitude.com/"
4848
private const val EU_FLAGS_SERVER_URL = "https://flag.lab.eu.amplitude.com/"
49-
private const val FLAG_POLLER_INTERVAL_MILLIS: Long = 60000
49+
private const val MIN_FLAG_POLLING_INTERVAL_MILLIS: Long = 60000
5050

5151
internal class DefaultExperimentClient internal constructor(
5252
private val apiKey: String,
@@ -96,7 +96,19 @@ internal class DefaultExperimentClient internal constructor(
9696
scalar = 1.5f,
9797
)
9898

99-
private val poller: Poller = Poller(this.executorService, ::doFlags, FLAG_POLLER_INTERVAL_MILLIS)
99+
internal val flagConfigPollingIntervalMillis =
100+
if (config.flagConfigPollingIntervalMillis < MIN_FLAG_POLLING_INTERVAL_MILLIS) {
101+
MIN_FLAG_POLLING_INTERVAL_MILLIS
102+
} else {
103+
config.flagConfigPollingIntervalMillis
104+
}
105+
106+
private val poller: Poller =
107+
Poller(
108+
this.executorService,
109+
::doFlags,
110+
flagConfigPollingIntervalMillis,
111+
)
100112

101113
internal val serverUrl: HttpUrl =
102114
if (config.serverUrl == ExperimentConfig.Defaults.SERVER_URL &&

sdk/src/main/java/com/amplitude/experiment/ExperimentConfig.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class ExperimentConfig internal constructor(
4646
@JvmField
4747
val pollOnStart: Boolean = Defaults.POLL_ON_START,
4848
@JvmField
49+
val flagConfigPollingIntervalMillis: Long = Defaults.FLAG_CONFIG_POLLING_INTERVAL_MILLIS,
50+
@JvmField
4951
val fetchOnStart: Boolean = Defaults.FETCH_ON_START,
5052
@JvmField
5153
val automaticFetchOnAmplitudeIdentityChange: Boolean = Defaults.AUTOMATIC_FETCH_ON_AMPLITUDE_IDENTITY_CHANGE,
@@ -131,6 +133,11 @@ class ExperimentConfig internal constructor(
131133
*/
132134
const val POLL_ON_START = true
133135

136+
/**
137+
* 300000
138+
*/
139+
const val FLAG_CONFIG_POLLING_INTERVAL_MILLIS = 300000L
140+
134141
/**
135142
* null
136143
*/
@@ -179,6 +186,7 @@ class ExperimentConfig internal constructor(
179186
private var retryFetchOnFailure = Defaults.RETRY_FETCH_ON_FAILURE
180187
private var automaticExposureTracking = Defaults.AUTOMATIC_EXPOSURE_TRACKING
181188
private var pollOnStart = Defaults.POLL_ON_START
189+
private var flagConfigPollingIntervalMillis = Defaults.FLAG_CONFIG_POLLING_INTERVAL_MILLIS
182190
private var fetchOnStart = Defaults.FETCH_ON_START
183191
private var automaticFetchOnAmplitudeIdentityChange = Defaults.AUTOMATIC_FETCH_ON_AMPLITUDE_IDENTITY_CHANGE
184192
private var userProvider = Defaults.USER_PROVIDER
@@ -250,6 +258,11 @@ class ExperimentConfig internal constructor(
250258
this.pollOnStart = pollOnStart
251259
}
252260

261+
fun flagConfigPollingIntervalMillis(flagConfigPollingIntervalMillis: Long) =
262+
apply {
263+
this.flagConfigPollingIntervalMillis = flagConfigPollingIntervalMillis
264+
}
265+
253266
fun fetchOnStart(fetchOnStart: Boolean?) =
254267
apply {
255268
this.fetchOnStart = fetchOnStart ?: true
@@ -291,6 +304,7 @@ class ExperimentConfig internal constructor(
291304
retryFetchOnFailure = retryFetchOnFailure,
292305
automaticExposureTracking = automaticExposureTracking,
293306
pollOnStart = pollOnStart,
307+
flagConfigPollingIntervalMillis = flagConfigPollingIntervalMillis,
294308
fetchOnStart = fetchOnStart,
295309
automaticFetchOnAmplitudeIdentityChange = automaticFetchOnAmplitudeIdentityChange,
296310
userProvider = userProvider,
@@ -315,6 +329,7 @@ class ExperimentConfig internal constructor(
315329
.retryFetchOnFailure(retryFetchOnFailure)
316330
.automaticExposureTracking(automaticExposureTracking)
317331
.pollOnStart(pollOnStart)
332+
.flagConfigPollingIntervalMillis(flagConfigPollingIntervalMillis)
318333
.fetchOnStart(fetchOnStart)
319334
.automaticFetchOnAmplitudeIdentityChange((automaticFetchOnAmplitudeIdentityChange))
320335
.userProvider(userProvider)

sdk/src/test/java/com/amplitude/experiment/ExperimentClientTest.kt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,4 +1295,47 @@ class ExperimentClientTest {
12951295
verify(exactly = retryCalled) { client["startRetries"](any<ExperimentUser>(), any<FetchOptions>()) }
12961296
}
12971297
}
1298+
1299+
@Test
1300+
fun `test flag config polling interval, config not set`() {
1301+
val client =
1302+
DefaultExperimentClient(
1303+
API_KEY,
1304+
ExperimentConfig(),
1305+
OkHttpClient(),
1306+
mockStorage,
1307+
Experiment.executorService,
1308+
)
1309+
Assert.assertEquals(300000, client.flagConfigPollingIntervalMillis)
1310+
}
1311+
1312+
@Test
1313+
fun `test flag config polling interval, config set under min`() {
1314+
val client =
1315+
DefaultExperimentClient(
1316+
API_KEY,
1317+
ExperimentConfig(
1318+
flagConfigPollingIntervalMillis = 1000,
1319+
),
1320+
OkHttpClient(),
1321+
mockStorage,
1322+
Experiment.executorService,
1323+
)
1324+
Assert.assertEquals(60000, client.flagConfigPollingIntervalMillis)
1325+
}
1326+
1327+
@Test
1328+
fun `test flag config polling interval, config set over min`() {
1329+
val client =
1330+
DefaultExperimentClient(
1331+
API_KEY,
1332+
ExperimentConfig(
1333+
flagConfigPollingIntervalMillis = 900000,
1334+
),
1335+
OkHttpClient(),
1336+
mockStorage,
1337+
Experiment.executorService,
1338+
)
1339+
Assert.assertEquals(900000, client.flagConfigPollingIntervalMillis)
1340+
}
12981341
}

0 commit comments

Comments
 (0)