Skip to content

Commit 7a9555a

Browse files
committed
improve metric plugin loading, add cache
1 parent e8a802d commit 7a9555a

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

destination-filters-kotlin/src/main/java/com/segment/analytics/plugins/DestinationFilters.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.segment.analytics.kotlin.core.utilities.toBaseEvent
1111
import com.segment.analytics.substrata.kotlin.JSObject
1212
import com.segment.analytics.substrata.kotlin.JSScope
1313
import com.segment.analytics.substrata.kotlin.JsonElementConverter
14+
import kotlinx.serialization.json.JsonElement
1415
import kotlinx.serialization.json.JsonObject
1516
import kotlinx.serialization.json.contentOrNull
1617
import kotlinx.serialization.json.encodeToJsonElement
@@ -39,13 +40,24 @@ class DestinationFilters : Plugin {
3940
override val type: Plugin.Type = Plugin.Type.Utility
4041
var engine: JSScope? = null
4142

43+
private var cachedRules: JsonElement? = null
44+
private val metricsPlugin = MetricsPlugin()
45+
4246
// Call this function when app is destroyed, to prevent memory leaks
4347
fun release() {
4448
engine?.release()
4549
engine = null
50+
cachedRules = null
51+
metricsPlugin.setOfActiveDestinations.clear()
52+
}
53+
54+
override fun setup(analytics: Analytics) {
55+
super.setup(analytics)
56+
analytics.add(metricsPlugin)
4657
}
4758

4859
override fun update(settings: Settings, type: Plugin.UpdateType) {
60+
var engineRecreated = false
4961
if (engine == null) {
5062
engine = JSScope {
5163
it.printStackTrace()
@@ -54,26 +66,34 @@ class DestinationFilters : Plugin {
5466
evaluate(tsubScript)
5567
evaluate(tsubEvaluate)
5668
}
69+
engineRecreated = true
5770
}
5871

59-
removeExistingFilters()
72+
var cacheInvalidated = false
73+
if (cachedRules != settings.middlewareSettings["routingRules"]) {
74+
cachedRules = settings.middlewareSettings["routingRules"]
75+
cacheInvalidated = true
76+
}
77+
78+
// if engine recreated or rules are different we need to remove and recreated filters
79+
// otherwise, we can skip
80+
if (!engineRecreated && !cacheInvalidated) return
6081

61-
val setOfActiveDestinations = mutableSetOf<String>()
62-
settings.middlewareSettings["routingRules"]?.safeJsonArray?.let { rules ->
82+
metricsPlugin.setOfActiveDestinations.clear()
83+
removeExistingFilters()
84+
cachedRules?.safeJsonArray?.let { rules ->
6385
for (it in rules) {
6486
val rule = it.jsonObject
6587
val destination: String =
6688
rule["destinationName"]?.jsonPrimitive?.contentOrNull ?: ""
6789
if (destination.isNotBlank()) {
6890
val added = createFilter(destination, rule)
6991
if (added) {
70-
setOfActiveDestinations.add(destination)
92+
metricsPlugin.setOfActiveDestinations.add(destination)
7193
}
7294
}
7395
}
7496
}
75-
76-
analytics.add(MetricsPlugin(setOfActiveDestinations))
7797
}
7898

7999
private fun removeExistingFilters() {

destination-filters-kotlin/src/main/java/com/segment/analytics/plugins/MetricsPlugin.kt

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,30 @@ import com.segment.analytics.kotlin.core.Analytics
44
import com.segment.analytics.kotlin.core.BaseEvent
55
import com.segment.analytics.kotlin.core.platform.Plugin
66
import com.segment.analytics.kotlin.core.utilities.putInContextUnderKey
7-
import kotlinx.serialization.json.JsonArray
87
import kotlinx.serialization.json.add
9-
import kotlinx.serialization.json.buildJsonArray
108
import kotlinx.serialization.json.buildJsonObject
119
import kotlinx.serialization.json.put
10+
import kotlinx.serialization.json.putJsonArray
11+
import java.util.concurrent.CopyOnWriteArraySet
1212

13-
class MetricsPlugin(setOfActiveDestinations: Set<String>): Plugin {
13+
class MetricsPlugin: Plugin {
1414

15-
private val activeDestinations: JsonArray
16-
17-
init {
18-
activeDestinations = buildJsonArray {
19-
for (dest in setOfActiveDestinations) {
20-
add(dest)
21-
}
22-
}
23-
}
15+
val setOfActiveDestinations = CopyOnWriteArraySet<String>()
2416

2517
override val type: Plugin.Type = Plugin.Type.Enrichment
2618
override lateinit var analytics: Analytics
19+
2720
override fun execute(event: BaseEvent): BaseEvent? {
2821
event.putInContextUnderKey(
2922
"plugins",
3023
"destination-filters",
3124
buildJsonObject {
3225
put("version", DestinationFilters.version)
33-
put("active", activeDestinations)
26+
putJsonArray("active") {
27+
for (dest in setOfActiveDestinations) {
28+
add(dest)
29+
}
30+
}
3431
}
3532
)
3633
return super.execute(event)

0 commit comments

Comments
 (0)