Skip to content

Commit e09a136

Browse files
committed
Propagate userInfo to webviewEvent
1 parent 41ae98f commit e09a136

11 files changed

Lines changed: 133 additions & 42 deletions

File tree

dd-sdk-android-core/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ data class com.datadog.android.api.context.TimeInfo
106106
constructor(Long, Long, Long, Long)
107107
data class com.datadog.android.api.context.UserInfo
108108
constructor(kotlin.String? = null, kotlin.String? = null, kotlin.String? = null, kotlin.String? = null, Map<kotlin.String, kotlin.Any?> = emptyMap())
109+
fun toJson(): com.google.gson.JsonElement
109110
interface com.datadog.android.api.feature.Feature
110111
val name: String
111112
fun onInitialize(android.content.Context)

dd-sdk-android-core/api/dd-sdk-android-core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ public final class com/datadog/android/api/context/UserInfo {
371371
public final fun getId ()Ljava/lang/String;
372372
public final fun getName ()Ljava/lang/String;
373373
public fun hashCode ()I
374+
public final fun toJson ()Lcom/google/gson/JsonElement;
374375
public fun toString ()Ljava/lang/String;
375376
}
376377

dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/context/UserInfo.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,12 @@ data class UserInfo(
3636
val additionalProperties: Map<String, Any?> = emptyMap()
3737
) {
3838

39+
/**
40+
* Serializes this [UserInfo] to a [JsonElement].
41+
* @return a [JsonElement] containing the user info fields.
42+
*/
3943
@Suppress("StringLiteralDuplication")
40-
internal fun toJson(): JsonElement {
44+
fun toJson(): JsonElement {
4145
val json = JsonObject()
4246
anonymousId?.let { idNonNull ->
4347
json.addProperty("anonymous_id", idNonNull)

features/dd-sdk-android-webview/src/main/kotlin/com/datadog/android/webview/internal/log/WebViewLogEventConsumer.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,18 @@ internal class WebViewLogEventConsumer(
5353
): JsonObject {
5454
addDdTags(event, datadogContext)
5555
correctDate(event, datadogContext)
56+
addUserInfo(event, datadogContext)
5657
if (rumContext != null) {
5758
event.addProperty(LogAttributes.RUM_APPLICATION_ID, rumContext.applicationId)
5859
event.addProperty(LogAttributes.RUM_SESSION_ID, rumContext.sessionId)
5960
}
6061
return event
6162
}
6263

64+
private fun addUserInfo(event: JsonObject, datadogContext: DatadogContext) {
65+
event.add(USR_KEY_NAME, datadogContext.userInfo.toJson())
66+
}
67+
6368
private fun correctDate(event: JsonObject, datadogContext: DatadogContext) {
6469
try {
6570
event.get(DATE_KEY_NAME)?.asLong?.let {
@@ -160,6 +165,7 @@ internal class WebViewLogEventConsumer(
160165
const val DATE_KEY_NAME = "date"
161166
const val USER_LOG_EVENT_TYPE = "log"
162167
const val INTERNAL_LOG_EVENT_TYPE = "internal_log"
168+
const val USR_KEY_NAME = "usr"
163169
const val JSON_PARSING_ERROR_MESSAGE = "The bundled web log event could not be deserialized"
164170
val LOG_EVENT_TYPES = setOf(USER_LOG_EVENT_TYPE)
165171
internal const val DEFAULT_SAMPLE_RATE = 100f

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,13 @@ internal class WebViewRumEventConsumer(
6565
try {
6666
val timeOffset = event.get(VIEW_KEY_NAME)?.asJsonObject?.get(VIEW_ID_KEY_NAME)
6767
?.asString?.let { offsetProvider.getOffset(it, datadogContext) } ?: 0L
68-
return webViewRumEventMapper.mapEvent(event, rumContext, timeOffset, sessionReplayEnabled)
68+
return webViewRumEventMapper.mapEvent(
69+
event,
70+
rumContext,
71+
timeOffset,
72+
sessionReplayEnabled,
73+
datadogContext.userInfo
74+
)
6975
} catch (e: ClassCastException) {
7076
sdkCore.internalLogger.log(
7177
InternalLogger.Level.ERROR,

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.datadog.android.webview.internal.rum
88

9+
import com.datadog.android.api.context.UserInfo
910
import com.datadog.android.webview.internal.rum.domain.NativeRumViewsCache
1011
import com.datadog.android.webview.internal.rum.domain.RumContext
1112
import com.google.gson.JsonObject
@@ -23,7 +24,8 @@ internal class WebViewRumEventMapper(
2324
event: JsonObject,
2425
rumContext: RumContext?,
2526
timeOffset: Long,
26-
sessionReplayEnabled: Boolean
27+
sessionReplayEnabled: Boolean,
28+
userInfo: UserInfo
2729
): JsonObject {
2830
val containerObject = JsonObject().apply {
2931
addProperty(SOURCE_KEY_NAME, SOURCE_VALUE)
@@ -64,6 +66,8 @@ internal class WebViewRumEventMapper(
6466
event.add(SESSION_KEY_NAME, session)
6567
}
6668

69+
event.add(USR_KEY_NAME, userInfo.toJson())
70+
6771
return event
6872
}
6973

@@ -80,5 +84,6 @@ internal class WebViewRumEventMapper(
8084
internal const val CONTAINER_KEY_NAME = "container"
8185
internal const val SOURCE_KEY_NAME = "source"
8286
internal const val SOURCE_VALUE = "android"
87+
internal const val USR_KEY_NAME = "usr"
8388
}
8489
}

features/dd-sdk-android-webview/src/test/kotlin/com/datadog/android/webview/WebViewTrackingTest.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.webkit.WebSettings
1010
import android.webkit.WebView
1111
import com.datadog.android.api.InternalLogger
1212
import com.datadog.android.api.context.DatadogContext
13+
import com.datadog.android.api.context.UserInfo
1314
import com.datadog.android.api.feature.EventWriteScope
1415
import com.datadog.android.api.feature.Feature
1516
import com.datadog.android.api.feature.FeatureScope
@@ -625,12 +626,14 @@ internal class WebViewTrackingTest {
625626
val fakeWebEvent = bundleWebEvent(fakeBundledEvent, fakeRumEventType)
626627
val fakeApplicationId = forge.getForgery<UUID>().toString()
627628
val fakeSessionId = forge.getForgery<UUID>().toString()
629+
val fakeUserInfo = forge.getForgery<UserInfo>()
628630
val mockWebViewRumFeature = mock<FeatureScope>()
629631
val mockWebViewLogsFeature = mock<FeatureScope>()
630632
val expectedEvent = fakeBundledEvent.deepCopy().apply {
631633
add("container", JsonObject().apply { addProperty("source", "android") })
632634
add("application", JsonObject().apply { addProperty("id", fakeApplicationId) })
633635
add("session", JsonObject().apply { addProperty("id", fakeSessionId) })
636+
add("usr", fakeUserInfo.toJson())
634637
}
635638

636639
whenever(
@@ -653,6 +656,7 @@ internal class WebViewTrackingTest {
653656
)
654657
val mockDatadogContext = mock<DatadogContext>()
655658
whenever(mockDatadogContext.featuresContext) doReturn fakeFeaturesContext
659+
whenever(mockDatadogContext.userInfo) doReturn fakeUserInfo
656660
val mockEventBatchWriter = mock<EventBatchWriter>()
657661
val mockEventWriteScope = mock<EventWriteScope>()
658662
whenever(mockEventWriteScope.invoke(any())) doAnswer {

features/dd-sdk-android-webview/src/test/kotlin/com/datadog/android/webview/internal/log/WebViewLogEventConsumerTest.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ internal class WebViewLogEventConsumerTest {
140140
verify(mockUserLogsWriter).write(eq(mockEventBatchWriter), capture(), eq(EventType.DEFAULT))
141141
assertThat(firstValue).hasField(WebViewLogEventConsumer.DATE_KEY_NAME, expectedDate)
142142
assertThat(firstValue.ddTags).containsExactlyInAnyOrderElementsOf(expectedTags)
143+
assertUserInfo(firstValue)
143144
}
144145
}
145146

@@ -237,6 +238,7 @@ internal class WebViewLogEventConsumerTest {
237238
LogAttributes.RUM_SESSION_ID,
238239
fakeRumContext.sessionId
239240
)
241+
assertUserInfo(firstValue)
240242
}
241243
}
242244

@@ -353,6 +355,12 @@ internal class WebViewLogEventConsumerTest {
353355
private val JsonObject.ddTags: List<String>
354356
get() = get(WebViewLogEventConsumer.DDTAGS_KEY_NAME)?.asString?.split(",").orEmpty()
355357

358+
private fun assertUserInfo(event: JsonObject) {
359+
val usr = event.getAsJsonObject(WebViewLogEventConsumer.USR_KEY_NAME)
360+
val expectedUsr = fakeDatadogContext.userInfo.toJson().asJsonObject
361+
assertThat(usr).usingRecursiveComparison().isEqualTo(expectedUsr)
362+
}
363+
356364
// endregion
357365

358366
companion object {

features/dd-sdk-android-webview/src/test/kotlin/com/datadog/android/webview/internal/rum/WebViewRumEventConsumerTest.kt

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,8 @@ internal class WebViewRumEventConsumerTest {
196196
fakeViewEventAsJson,
197197
fakeRumContext,
198198
fakeServerTimeOffsetInMillis,
199-
fakeSessionReplayEnabled
199+
fakeSessionReplayEnabled,
200+
fakeDatadogContext.userInfo
200201
)
201202
).thenReturn(fakeMappedViewEvent)
202203

@@ -222,7 +223,8 @@ internal class WebViewRumEventConsumerTest {
222223
fakeViewEventAsJson,
223224
fakeRumContext,
224225
fakeServerTimeOffsetInMillis,
225-
fakeSessionReplayEnabled
226+
fakeSessionReplayEnabled,
227+
fakeDatadogContext.userInfo
226228
)
227229
).thenReturn(fakeMappedViewEvent)
228230

@@ -244,7 +246,8 @@ internal class WebViewRumEventConsumerTest {
244246
fakeViewEventAsJson,
245247
null,
246248
fakeServerTimeOffsetInMillis,
247-
fakeSessionReplayEnabled
249+
fakeSessionReplayEnabled,
250+
fakeDatadogContext.userInfo
248251
)
249252
).thenReturn(fakeMappedViewEvent)
250253

@@ -273,7 +276,8 @@ internal class WebViewRumEventConsumerTest {
273276
fakeActionEventAsJson,
274277
fakeRumContext,
275278
fakeServerTimeOffsetInMillis,
276-
fakeSessionReplayEnabled
279+
fakeSessionReplayEnabled,
280+
fakeDatadogContext.userInfo
277281
)
278282
).thenReturn(fakeMappedActionEvent)
279283

@@ -298,7 +302,8 @@ internal class WebViewRumEventConsumerTest {
298302
fakeActionEventAsJson,
299303
fakeRumContext,
300304
fakeServerTimeOffsetInMillis,
301-
fakeSessionReplayEnabled
305+
fakeSessionReplayEnabled,
306+
fakeDatadogContext.userInfo
302307
)
303308
).thenReturn(fakeMappedActionEvent)
304309

@@ -320,7 +325,8 @@ internal class WebViewRumEventConsumerTest {
320325
fakeActionEventAsJson,
321326
null,
322327
fakeServerTimeOffsetInMillis,
323-
fakeSessionReplayEnabled
328+
fakeSessionReplayEnabled,
329+
fakeDatadogContext.userInfo
324330
)
325331
).thenReturn(fakeMappedActionEvent)
326332

@@ -349,7 +355,8 @@ internal class WebViewRumEventConsumerTest {
349355
fakeResourceEventAsJson,
350356
fakeRumContext,
351357
fakeServerTimeOffsetInMillis,
352-
fakeSessionReplayEnabled
358+
fakeSessionReplayEnabled,
359+
fakeDatadogContext.userInfo
353360
)
354361
).thenReturn(fakeMappedResourceEvent)
355362

@@ -374,7 +381,8 @@ internal class WebViewRumEventConsumerTest {
374381
fakeResourceEventAsJson,
375382
fakeRumContext,
376383
fakeServerTimeOffsetInMillis,
377-
fakeSessionReplayEnabled
384+
fakeSessionReplayEnabled,
385+
fakeDatadogContext.userInfo
378386
)
379387
).thenReturn(fakeMappedResourceEvent)
380388

@@ -396,7 +404,8 @@ internal class WebViewRumEventConsumerTest {
396404
fakeResourceEventAsJson,
397405
null,
398406
fakeServerTimeOffsetInMillis,
399-
fakeSessionReplayEnabled
407+
fakeSessionReplayEnabled,
408+
fakeDatadogContext.userInfo
400409
)
401410
).thenReturn(fakeMappedResourceEvent)
402411

@@ -425,7 +434,8 @@ internal class WebViewRumEventConsumerTest {
425434
fakeErrorEventAsJson,
426435
fakeRumContext,
427436
fakeServerTimeOffsetInMillis,
428-
fakeSessionReplayEnabled
437+
fakeSessionReplayEnabled,
438+
fakeDatadogContext.userInfo
429439
)
430440
).thenReturn(fakeMappedErrorEvent)
431441

@@ -450,7 +460,8 @@ internal class WebViewRumEventConsumerTest {
450460
fakeErrorEventAsJson,
451461
fakeRumContext,
452462
fakeServerTimeOffsetInMillis,
453-
fakeSessionReplayEnabled
463+
fakeSessionReplayEnabled,
464+
fakeDatadogContext.userInfo
454465
)
455466
).thenReturn(fakeMappedErrorEvent)
456467

@@ -472,7 +483,8 @@ internal class WebViewRumEventConsumerTest {
472483
fakeErrorEventAsJson,
473484
null,
474485
fakeServerTimeOffsetInMillis,
475-
fakeSessionReplayEnabled
486+
fakeSessionReplayEnabled,
487+
fakeDatadogContext.userInfo
476488
)
477489
).thenReturn(fakeMappedErrorEvent)
478490

@@ -501,7 +513,8 @@ internal class WebViewRumEventConsumerTest {
501513
fakeLongTaskEventAsJson,
502514
fakeRumContext,
503515
fakeServerTimeOffsetInMillis,
504-
fakeSessionReplayEnabled
516+
fakeSessionReplayEnabled,
517+
fakeDatadogContext.userInfo
505518
)
506519
).thenReturn(fakeMappedLongTaskEvent)
507520

@@ -526,7 +539,8 @@ internal class WebViewRumEventConsumerTest {
526539
fakeLongTaskEventAsJson,
527540
fakeRumContext,
528541
fakeServerTimeOffsetInMillis,
529-
fakeSessionReplayEnabled
542+
fakeSessionReplayEnabled,
543+
fakeDatadogContext.userInfo
530544
)
531545
)
532546
.thenReturn(fakeMappedLongTaskEvent)
@@ -549,7 +563,8 @@ internal class WebViewRumEventConsumerTest {
549563
fakeLongTaskEventAsJson,
550564
null,
551565
fakeServerTimeOffsetInMillis,
552-
fakeSessionReplayEnabled
566+
fakeSessionReplayEnabled,
567+
fakeDatadogContext.userInfo
553568
)
554569
).thenReturn(fakeMappedLongTaskEvent)
555570

@@ -577,7 +592,8 @@ internal class WebViewRumEventConsumerTest {
577592
fakeRumEvent,
578593
fakeRumContext,
579594
fakeServerTimeOffsetInMillis,
580-
fakeSessionReplayEnabled
595+
fakeSessionReplayEnabled,
596+
fakeDatadogContext.userInfo
581597
)
582598
).thenThrow(fakeException)
583599

@@ -598,7 +614,8 @@ internal class WebViewRumEventConsumerTest {
598614
fakeRumEvent,
599615
fakeRumContext,
600616
fakeServerTimeOffsetInMillis,
601-
fakeSessionReplayEnabled
617+
fakeSessionReplayEnabled,
618+
fakeDatadogContext.userInfo
602619
)
603620
).thenThrow(fakeException)
604621

@@ -625,7 +642,8 @@ internal class WebViewRumEventConsumerTest {
625642
fakeRumEvent,
626643
fakeRumContext,
627644
0,
628-
fakeSessionReplayEnabled
645+
fakeSessionReplayEnabled,
646+
fakeDatadogContext.userInfo
629647
)
630648
).thenReturn(fakeMappedRumEvent)
631649

@@ -648,7 +666,8 @@ internal class WebViewRumEventConsumerTest {
648666
fakeRumEvent,
649667
fakeRumContext,
650668
0,
651-
fakeSessionReplayEnabled
669+
fakeSessionReplayEnabled,
670+
fakeDatadogContext.userInfo
652671
)
653672
).thenReturn(fakeMappedRumEvent)
654673

@@ -671,7 +690,8 @@ internal class WebViewRumEventConsumerTest {
671690
fakeRumEvent,
672691
fakeRumContext,
673692
0,
674-
fakeSessionReplayEnabled
693+
fakeSessionReplayEnabled,
694+
fakeDatadogContext.userInfo
675695
)
676696
).thenReturn(fakeMappedRumEvent)
677697

0 commit comments

Comments
 (0)