Skip to content

Commit f44cd74

Browse files
RUM-11137: Move session properties to ddtags over query parameters
1 parent d592f5e commit f44cd74

34 files changed

+237
-1852
lines changed

features/dd-sdk-android-rum/build.gradle.kts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ android {
5050
}
5151

5252
namespace = "com.datadog.android.rum"
53+
54+
testFixtures {
55+
enable = true
56+
}
5357
}
5458

5559
dependencies {
@@ -85,6 +89,22 @@ dependencies {
8589
testImplementation(libs.okHttpMock)
8690
testImplementation(libs.bundles.openTracing)
8791
unmock(libs.robolectric)
92+
93+
// Test Fixtures
94+
testFixturesImplementation(testFixtures(project(":dd-sdk-android-core")))
95+
testFixturesImplementation(testFixtures(project(":dd-sdk-android-internal")))
96+
testFixturesImplementation(project(":tools:unit")) {
97+
attributes {
98+
attribute(
99+
com.android.build.api.attributes.ProductFlavorAttr.of("platform"),
100+
objects.named("jvm")
101+
)
102+
}
103+
}
104+
testFixturesImplementation(libs.kotlin)
105+
testFixturesImplementation(libs.bundles.jUnit5)
106+
testFixturesImplementation(libs.okHttp)
107+
testFixturesImplementation(libs.bundles.testTools)
88108
}
89109

90110
unMock {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/DatadogLateCrashReporter.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.datadog.android.rum.internal.domain.RumContext
2525
import com.datadog.android.rum.internal.domain.event.RumEventDeserializer
2626
import com.datadog.android.rum.internal.domain.scope.toErrorSchemaType
2727
import com.datadog.android.rum.internal.domain.scope.tryFromSource
28+
import com.datadog.android.rum.internal.utils.buildDDTagsString
2829
import com.datadog.android.rum.model.ErrorEvent
2930
import com.datadog.android.rum.model.ViewEvent
3031
import com.google.gson.JsonObject
@@ -266,7 +267,8 @@ internal class DatadogLateCrashReporter(
266267
},
267268
timeSinceAppStart = timeSinceAppStartMs
268269
),
269-
version = viewEvent.version
270+
version = viewEvent.version,
271+
ddtags = buildDDTagsString(datadogContext)
270272
)
271273
}
272274

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumActionScope.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.datadog.android.rum.internal.domain.RumContext
1717
import com.datadog.android.rum.internal.domain.Time
1818
import com.datadog.android.rum.internal.monitor.StorageEvent
1919
import com.datadog.android.rum.internal.toAction
20+
import com.datadog.android.rum.internal.utils.buildDDTagsString
2021
import com.datadog.android.rum.internal.utils.hasUserData
2122
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
2223
import com.datadog.android.rum.model.ActionEvent
@@ -329,7 +330,8 @@ internal class RumActionScope(
329330
),
330331
connectivity = networkInfo.toActionConnectivity(),
331332
service = datadogContext.service,
332-
version = datadogContext.version
333+
version = datadogContext.version,
334+
ddtags = buildDDTagsString(datadogContext)
333335
)
334336
}
335337
.apply {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumResourceScope.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.datadog.android.rum.internal.metric.networksettled.NetworkSettledMetr
2727
import com.datadog.android.rum.internal.monitor.StorageEvent
2828
import com.datadog.android.rum.internal.toError
2929
import com.datadog.android.rum.internal.toResource
30+
import com.datadog.android.rum.internal.utils.buildDDTagsString
3031
import com.datadog.android.rum.internal.utils.hasUserData
3132
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
3233
import com.datadog.android.rum.model.ErrorEvent
@@ -309,7 +310,8 @@ internal class RumResourceScope(
309310
configuration = ResourceEvent.Configuration(sessionSampleRate = sampleRate)
310311
),
311312
service = datadogContext.service,
312-
version = datadogContext.version
313+
version = datadogContext.version,
314+
ddtags = buildDDTagsString(datadogContext)
313315
)
314316
}
315317
.onError {
@@ -464,7 +466,8 @@ internal class RumResourceScope(
464466
configuration = ErrorEvent.Configuration(sessionSampleRate = sampleRate)
465467
),
466468
service = datadogContext.service,
467-
version = datadogContext.version
469+
version = datadogContext.version,
470+
ddtags = buildDDTagsString(datadogContext)
468471
)
469472
}
470473
.onError {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumViewScope.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import com.datadog.android.rum.internal.toAction
4242
import com.datadog.android.rum.internal.toError
4343
import com.datadog.android.rum.internal.toLongTask
4444
import com.datadog.android.rum.internal.toView
45+
import com.datadog.android.rum.internal.utils.buildDDTagsString
4546
import com.datadog.android.rum.internal.utils.hasUserData
4647
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
4748
import com.datadog.android.rum.internal.vitals.VitalInfo
@@ -604,7 +605,8 @@ internal open class RumViewScope(
604605
configuration = ErrorEvent.Configuration(sessionSampleRate = sampleRate)
605606
),
606607
service = datadogContext.service,
607-
version = datadogContext.version
608+
version = datadogContext.version,
609+
ddtags = buildDDTagsString(datadogContext)
608610
)
609611
}
610612
.apply {
@@ -1126,7 +1128,8 @@ internal open class RumViewScope(
11261128
),
11271129
connectivity = datadogContext.networkInfo.toViewConnectivity(),
11281130
service = datadogContext.service,
1129-
version = datadogContext.version
1131+
version = datadogContext.version,
1132+
ddtags = buildDDTagsString(datadogContext)
11301133
).apply {
11311134
sessionEndedMetricDispatcher.onViewTracked(sessionId, this)
11321135
}
@@ -1300,7 +1303,8 @@ internal open class RumViewScope(
13001303
),
13011304
connectivity = datadogContext.networkInfo.toActionConnectivity(),
13021305
service = datadogContext.service,
1303-
version = datadogContext.version
1306+
version = datadogContext.version,
1307+
ddtags = buildDDTagsString(datadogContext)
13041308
)
13051309
}
13061310
.apply {
@@ -1415,7 +1419,8 @@ internal open class RumViewScope(
14151419
configuration = LongTaskEvent.Configuration(sessionSampleRate = sampleRate)
14161420
),
14171421
service = datadogContext.service,
1418-
version = datadogContext.version
1422+
version = datadogContext.version,
1423+
ddtags = buildDDTagsString(datadogContext)
14191424
)
14201425
}
14211426
.apply {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/net/RumRequestFactory.kt

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import com.datadog.android.api.net.RequestFactory
1414
import com.datadog.android.api.storage.RawBatchEvent
1515
import com.datadog.android.core.internal.utils.join
1616
import com.datadog.android.internal.utils.toHexString
17-
import com.datadog.android.rum.RumAttributes
1817
import com.datadog.android.rum.internal.domain.event.RumViewEventFilter
1918
import java.security.DigestException
2019
import java.security.MessageDigest
@@ -57,18 +56,14 @@ internal class RumRequestFactory(
5756
}
5857

5958
private fun buildUrl(context: DatadogContext, executionContext: RequestExecutionContext): String {
60-
val queryParams = mapOf(
61-
RequestFactory.QUERY_PARAM_SOURCE to context.source,
62-
RequestFactory.QUERY_PARAM_TAGS to buildTags(
63-
context.service,
64-
context.version,
65-
context.sdkVersion,
66-
context.env,
67-
context.variant,
68-
executionContext
69-
)
59+
val queryParams = buildMap {
60+
put(RequestFactory.QUERY_PARAM_SOURCE, context.source)
7061

71-
)
62+
val tags = buildTags(executionContext)
63+
if (tags.isNotEmpty()) {
64+
put(RequestFactory.QUERY_PARAM_TAGS, tags)
65+
}
66+
}
7267

7368
val intakeUrl = "%s/api/v2/rum".format(
7469
Locale.US,
@@ -97,24 +92,11 @@ internal class RumRequestFactory(
9792
}
9893

9994
private fun buildTags(
100-
serviceName: String,
101-
version: String,
102-
sdkVersion: String,
103-
env: String,
104-
variant: String,
10595
executionContext: RequestExecutionContext
10696
) = buildString {
107-
append("${RumAttributes.SERVICE_NAME}:$serviceName").append(",")
108-
.append("${RumAttributes.APPLICATION_VERSION}:$version").append(",")
109-
.append("${RumAttributes.SDK_VERSION}:$sdkVersion").append(",")
110-
.append("${RumAttributes.ENV}:$env")
111-
112-
if (variant.isNotEmpty()) {
113-
append(",").append("${RumAttributes.VARIANT}:$variant")
114-
}
11597
if (executionContext.previousResponseCode != null) {
11698
// we had a previous failure
117-
append(",").append("${RETRY_COUNT_KEY}:${executionContext.attemptNumber}")
99+
append("${RETRY_COUNT_KEY}:${executionContext.attemptNumber}")
118100
append(",").append("${LAST_FAILURE_STATUS_KEY}:${executionContext.previousResponseCode}")
119101
}
120102
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2016-Present Datadog, Inc.
5+
*/
6+
7+
package com.datadog.android.rum.internal.utils
8+
9+
import com.datadog.android.api.context.DatadogContext
10+
import com.datadog.android.rum.RumAttributes
11+
12+
internal fun buildDDTagsString(context: DatadogContext): String {
13+
return buildString {
14+
with(context) {
15+
append("${RumAttributes.SERVICE_NAME}:$service").append(",")
16+
append("${RumAttributes.APPLICATION_VERSION}:$version").append(",")
17+
append("${RumAttributes.SDK_VERSION}:$sdkVersion").append(",")
18+
append("${RumAttributes.ENV}:$env")
19+
20+
if (variant.isNotEmpty()) {
21+
append(",").append("${RumAttributes.VARIANT}:$variant")
22+
}
23+
}
24+
}
25+
}

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/internal/net/RumRequestFactoryTest.kt

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.datadog.android.api.net.RequestExecutionContext
1212
import com.datadog.android.api.net.RequestFactory
1313
import com.datadog.android.api.storage.RawBatchEvent
1414
import com.datadog.android.core.internal.utils.join
15-
import com.datadog.android.rum.RumAttributes
1615
import com.datadog.android.rum.internal.domain.event.RumViewEventFilter
1716
import com.datadog.android.rum.utils.forge.Configurator
1817
import fr.xgouchet.elmyr.Forge
@@ -158,22 +157,18 @@ internal class RumRequestFactoryTest {
158157
}
159158

160159
private fun expectedUrl(endpointUrl: String): String {
161-
val queryTags = mutableListOf(
162-
"${RumAttributes.SERVICE_NAME}:${fakeDatadogContext.service}",
163-
"${RumAttributes.APPLICATION_VERSION}:${fakeDatadogContext.version}",
164-
"${RumAttributes.SDK_VERSION}:${fakeDatadogContext.sdkVersion}",
165-
"${RumAttributes.ENV}:${fakeDatadogContext.env}"
166-
)
160+
val queryTags = mutableListOf<String>()
167161

168-
if (fakeDatadogContext.variant.isNotEmpty()) {
169-
queryTags.add("${RumAttributes.VARIANT}:${fakeDatadogContext.variant}")
170-
}
171162
if (fakeExecutionContext.previousResponseCode != null) {
172163
queryTags.add("${RumRequestFactory.RETRY_COUNT_KEY}:${fakeExecutionContext.attemptNumber}")
173164
queryTags.add("${RumRequestFactory.LAST_FAILURE_STATUS_KEY}:${fakeExecutionContext.previousResponseCode}")
174165
}
175166

176-
return "$endpointUrl/api/v2/rum?ddsource=${fakeDatadogContext.source}" +
177-
"&ddtags=${queryTags.joinToString(",")}"
167+
return buildString {
168+
append("$endpointUrl/api/v2/rum?ddsource=${fakeDatadogContext.source}")
169+
if (queryTags.isNotEmpty()) {
170+
append("&ddtags=${queryTags.joinToString(",")}")
171+
}
172+
}
178173
}
179174
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2016-Present Datadog, Inc.
5+
*/
6+
7+
package com.datadog.android.rum.internal.utils
8+
9+
import com.datadog.android.api.context.DatadogContext
10+
import com.datadog.android.rum.utils.forge.Configurator
11+
import com.datadog.tools.unit.extensions.TestConfigurationExtension
12+
import fr.xgouchet.elmyr.Forge
13+
import fr.xgouchet.elmyr.annotation.Forgery
14+
import fr.xgouchet.elmyr.junit5.ForgeConfiguration
15+
import fr.xgouchet.elmyr.junit5.ForgeExtension
16+
import org.assertj.core.api.Assertions.assertThat
17+
import org.junit.jupiter.api.Test
18+
import org.junit.jupiter.api.extension.ExtendWith
19+
import org.junit.jupiter.api.extension.Extensions
20+
import org.mockito.junit.jupiter.MockitoExtension
21+
import org.mockito.junit.jupiter.MockitoSettings
22+
import org.mockito.quality.Strictness
23+
24+
@Extensions(
25+
ExtendWith(MockitoExtension::class),
26+
ExtendWith(ForgeExtension::class),
27+
ExtendWith(TestConfigurationExtension::class)
28+
)
29+
@MockitoSettings(strictness = Strictness.LENIENT)
30+
@ForgeConfiguration(Configurator::class)
31+
internal class RumTagsUtilsTest {
32+
33+
@Test
34+
fun `M build DD tags string with variant W buildDDTagsString() {with non-empty variant}`(
35+
forge: Forge
36+
) {
37+
// Given
38+
val context = forge.getForgery<DatadogContext>()
39+
40+
// When
41+
val result = buildDDTagsString(context)
42+
43+
// Then
44+
val tagsMap = result.parseToTagsMap()
45+
assertThat(tagsMap).isEqualTo(
46+
mapOf(
47+
"service" to context.service,
48+
"version" to context.version,
49+
"sdk_version" to context.sdkVersion,
50+
"env" to context.env,
51+
"variant" to context.variant
52+
)
53+
)
54+
}
55+
56+
@Test
57+
fun `M build DD tags string without variant W buildDDTagsString() {with empty variant}`(
58+
@Forgery fakeContext: DatadogContext
59+
) {
60+
// Given
61+
val context = fakeContext.copy(variant = "")
62+
63+
// When
64+
val result = buildDDTagsString(context)
65+
66+
// Then
67+
val tagsMap = result.parseToTagsMap()
68+
assertThat(tagsMap).isEqualTo(
69+
mapOf(
70+
"service" to context.service,
71+
"version" to context.version,
72+
"sdk_version" to context.sdkVersion,
73+
"env" to context.env
74+
)
75+
)
76+
}
77+
78+
private fun String.parseToTagsMap(): Map<String, String> {
79+
return this.split(",")
80+
.associate { tag ->
81+
val parts = tag.split(":")
82+
assertThat(parts).hasSize(2)
83+
parts[0] to parts[1]
84+
}
85+
}
86+
}

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/utils/forge/Configurator.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,12 @@ internal class Configurator : BaseConfigurator() {
3030
forge.useCoreFactories()
3131

3232
// RUM
33+
forge.useCommonRumFactories()
3334
forge.addFactory(ConfigurationRumForgeryFactory())
3435
forge.addFactory(RumConfigurationForgeryFactory())
35-
forge.addFactory(ActionEventForgeryFactory())
36-
forge.addFactory(ErrorEventForgeryFactory())
37-
forge.addFactory(LongTaskEventForgeryFactory())
3836
forge.addFactory(MotionEventForgeryFactory())
3937
forge.addFactory(RumEventMapperFactory())
4038
forge.addFactory(RumContextForgeryFactory())
41-
forge.addFactory(ResourceEventForgeryFactory())
42-
forge.addFactory(ResourceTimingForgeryFactory())
43-
forge.addFactory(ViewEventForgeryFactory())
4439
forge.addFactory(VitalInfoForgeryFactory())
4540
forge.addFactory(RumEventMetaForgeryFactory())
4641
forge.addFactory(ViewEventMetaForgeryFactory())

0 commit comments

Comments
 (0)