Skip to content

Commit 40b4a6b

Browse files
authored
Improve metric plugin loading (#16)
* update dependencies version * improve metric plugin loading, add cache * update gradle * address comment
1 parent 016c46e commit 40b4a6b

File tree

8 files changed

+238
-151
lines changed

8 files changed

+238
-151
lines changed

destination-filters-kotlin/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ android {
3131
}
3232

3333
dependencies {
34-
implementation 'com.segment.analytics.kotlin:analytics-kotlin-live:1.0.1'
35-
implementation 'com.segment.analytics.kotlin:substrata:1.0.0'
36-
implementation 'com.segment.analytics.kotlin:android:1.16.3'
34+
implementation 'com.segment.analytics.kotlin:analytics-kotlin-live:1.2.0'
35+
implementation 'com.segment.analytics.kotlin:substrata:1.1.1'
36+
implementation 'com.segment.analytics.kotlin:android:1.20.0'
3737
implementation 'androidx.core:core-ktx:1.7.0'
3838
testImplementation 'junit:junit:4.13.2'
3939
androidTestImplementation 'androidx.test.ext:junit:1.1.3'

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

Lines changed: 25 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,33 @@ 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 the engine has NOT been recreated and the cache/rules have not been invalidated then we can exit early.
79+
if (!engineRecreated && !cacheInvalidated) return
6080

61-
val setOfActiveDestinations = mutableSetOf<String>()
62-
settings.middlewareSettings["routingRules"]?.safeJsonArray?.let { rules ->
81+
metricsPlugin.setOfActiveDestinations.clear()
82+
removeExistingFilters()
83+
cachedRules?.safeJsonArray?.let { rules ->
6384
for (it in rules) {
6485
val rule = it.jsonObject
6586
val destination: String =
6687
rule["destinationName"]?.jsonPrimitive?.contentOrNull ?: ""
6788
if (destination.isNotBlank()) {
6889
val added = createFilter(destination, rule)
6990
if (added) {
70-
setOfActiveDestinations.add(destination)
91+
metricsPlugin.setOfActiveDestinations.add(destination)
7192
}
7293
}
7394
}
7495
}
75-
76-
analytics.add(MetricsPlugin(setOfActiveDestinations))
7796
}
7897

7998
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)

gradle/wrapper/gradle-wrapper.jar

-15.3 KB
Binary file not shown.
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
#Wed Aug 17 10:50:02 PDT 2022
21
distributionBase=GRADLE_USER_HOME
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
42
distributionPath=wrapper/dists
5-
zipStorePath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
4+
networkTimeout=10000
5+
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME
7+
zipStorePath=wrapper/dists

0 commit comments

Comments
 (0)