Skip to content

Commit a8e351c

Browse files
committed
RUM-10277: Add account information into RUM events
1 parent 54341cd commit a8e351c

File tree

20 files changed

+369
-7
lines changed

20 files changed

+369
-7
lines changed

dd-sdk-android-core/api/apiSurface

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ interface com.datadog.android.api.SdkCore
6464
fun addAccountExtraInfo(Map<String, Any?> = emptyMap())
6565
fun clearAccountInfo()
6666
data class com.datadog.android.api.context.AccountInfo
67-
constructor(String? = null, String? = null, Map<String, Any?> = emptyMap())
67+
constructor(String, String? = null, Map<String, Any?> = emptyMap())
6868
data class com.datadog.android.api.context.DatadogContext
6969
constructor(com.datadog.android.DatadogSite, String, String, String, String, String, String, String, TimeInfo, ProcessInfo, NetworkInfo, DeviceInfo, UserInfo, AccountInfo?, com.datadog.android.privacy.TrackingConsent, String?, Map<String, Map<String, Any?>>)
7070
data class com.datadog.android.api.context.DeviceInfo

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ public final class com/datadog/android/api/SdkCore$DefaultImpls {
150150
}
151151

152152
public final class com/datadog/android/api/context/AccountInfo {
153-
public fun <init> ()V
154153
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
155154
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
156155
public final fun component1 ()Ljava/lang/String;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ package com.datadog.android.api.context
1313
* @property extraInfo a dictionary of extra information to the current account.
1414
*/
1515
data class AccountInfo(
16-
val id: String? = null,
16+
val id: String,
1717
val name: String? = null,
1818
val extraInfo: Map<String, Any?> = emptyMap()
1919
)

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/account/DatadogAccountInfoProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ internal class DatadogAccountInfoProvider(
1717
private var internalAccountInfo: AccountInfo? = null
1818

1919
override fun setAccountInfo(
20-
id: String?,
20+
id: String,
2121
name: String?,
2222
extraInfo: Map<String, Any?>
2323
) {

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/account/MutableAccountInfoProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import com.datadog.tools.annotation.NoOpImplementation
1212
internal interface MutableAccountInfoProvider : AccountInfoProvider {
1313

1414
fun setAccountInfo(
15-
id: String?,
15+
id: String,
1616
name: String?,
1717
extraInfo: Map<String, Any?>
1818
)

dd-sdk-android-core/src/testFixtures/kotlin/com/datadog/android/tests/elmyr/AccountInfoForgeryFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class AccountInfoForgeryFactory : ForgeryFactory<AccountInfo> {
1414

1515
override fun getForgery(forge: Forge): AccountInfo {
1616
return AccountInfo(
17-
id = forge.aNullable { anHexadecimalString() },
17+
id = forge.anHexadecimalString(),
1818
name = forge.aNullable { forge.aStringMatching("[A-Z][a-z]+ [A-Z]\\. [A-Z][a-z]+") },
1919
extraInfo = forge.exhaustiveAttributes(
2020
excludedKeys = setOf(

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ internal class DatadogLateCrashReporter(
187187
val user = viewEvent.usr
188188
val hasUserInfo = user?.id != null || user?.name != null ||
189189
user?.email != null || additionalUserProperties.isNotEmpty()
190+
val account = viewEvent.account
190191
val deviceInfo = datadogContext.deviceInfo
191192

192193
return ErrorEvent(
@@ -222,6 +223,13 @@ internal class DatadogLateCrashReporter(
222223
additionalUserProperties
223224
)
224225
},
226+
account = account?.let {
227+
ErrorEvent.Account(
228+
id = it.id,
229+
name = it.name,
230+
additionalProperties = it.additionalProperties
231+
)
232+
},
225233
connectivity = connectivity,
226234
os = ErrorEvent.Os(
227235
name = deviceInfo.osName,

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ internal class RumEventSerializer(
7878
.safeMapValuesToJson(internalLogger)
7979
.toMutableMap()
8080
)
81+
val sanitizedAccount = model.account?.copy(
82+
additionalProperties = validateAccountAttributes(model.account.additionalProperties)
83+
.safeMapValuesToJson(internalLogger)
84+
.toMutableMap()
85+
)
8186
val sanitizedContext = model.context?.copy(
8287
additionalProperties = validateContextAttributes(model.context.additionalProperties)
8388
.safeMapValuesToJson(internalLogger)
@@ -92,6 +97,7 @@ internal class RumEventSerializer(
9297
)
9398
val sanitizedModel = model.copy(
9499
usr = sanitizedUser,
100+
account = sanitizedAccount,
95101
context = sanitizedContext,
96102
view = sanitizedView
97103
)
@@ -105,13 +111,19 @@ internal class RumEventSerializer(
105111
.safeMapValuesToJson(internalLogger)
106112
.toMutableMap()
107113
)
114+
val sanitizedAccount = model.account?.copy(
115+
additionalProperties = validateAccountAttributes(model.account.additionalProperties)
116+
.safeMapValuesToJson(internalLogger)
117+
.toMutableMap()
118+
)
108119
val sanitizedContext = model.context?.copy(
109120
additionalProperties = validateContextAttributes(model.context.additionalProperties)
110121
.safeMapValuesToJson(internalLogger)
111122
.toMutableMap()
112123
)
113124
val sanitizedModel = model.copy(
114125
usr = sanitizedUser,
126+
account = sanitizedAccount,
115127
context = sanitizedContext
116128
)
117129
return extractKnownAttributes(sanitizedModel.toJson().asJsonObject).toString()
@@ -123,13 +135,19 @@ internal class RumEventSerializer(
123135
.safeMapValuesToJson(internalLogger)
124136
.toMutableMap()
125137
)
138+
val sanitizedAccount = model.account?.copy(
139+
additionalProperties = validateAccountAttributes(model.account.additionalProperties)
140+
.safeMapValuesToJson(internalLogger)
141+
.toMutableMap()
142+
)
126143
val sanitizedContext = model.context?.copy(
127144
additionalProperties = validateContextAttributes(model.context.additionalProperties)
128145
.safeMapValuesToJson(internalLogger)
129146
.toMutableMap()
130147
)
131148
val sanitizedModel = model.copy(
132149
usr = sanitizedUser,
150+
account = sanitizedAccount,
133151
context = sanitizedContext
134152
)
135153
return extractKnownAttributes(sanitizedModel.toJson().asJsonObject).toString()
@@ -141,13 +159,19 @@ internal class RumEventSerializer(
141159
.safeMapValuesToJson(internalLogger)
142160
.toMutableMap()
143161
)
162+
val sanitizedAccount = model.account?.copy(
163+
additionalProperties = validateAccountAttributes(model.account.additionalProperties)
164+
.safeMapValuesToJson(internalLogger)
165+
.toMutableMap()
166+
)
144167
val sanitizedContext = model.context?.copy(
145168
additionalProperties = validateContextAttributes(model.context.additionalProperties)
146169
.safeMapValuesToJson(internalLogger)
147170
.toMutableMap()
148171
)
149172
val sanitizedModel = model.copy(
150173
usr = sanitizedUser,
174+
account = sanitizedAccount,
151175
context = sanitizedContext
152176
)
153177
return extractKnownAttributes(sanitizedModel.toJson().asJsonObject).toString()
@@ -159,13 +183,19 @@ internal class RumEventSerializer(
159183
.safeMapValuesToJson(internalLogger)
160184
.toMutableMap()
161185
)
186+
val sanitizedAccount = model.account?.copy(
187+
additionalProperties = validateAccountAttributes(model.account.additionalProperties)
188+
.safeMapValuesToJson(internalLogger)
189+
.toMutableMap()
190+
)
162191
val sanitizedContext = model.context?.copy(
163192
additionalProperties = validateContextAttributes(model.context.additionalProperties)
164193
.safeMapValuesToJson(internalLogger)
165194
.toMutableMap()
166195
)
167196
val sanitizedModel = model.copy(
168197
usr = sanitizedUser,
198+
account = sanitizedAccount,
169199
context = sanitizedContext
170200
)
171201
return extractKnownAttributes(sanitizedModel.toJson().asJsonObject).toString()
@@ -181,6 +211,15 @@ internal class RumEventSerializer(
181211
)
182212
}
183213

214+
private fun validateAccountAttributes(attributes: Map<String, Any?>): MutableMap<String, Any?> {
215+
return dataConstraints.validateAttributes(
216+
attributes,
217+
keyPrefix = ACCOUNT_ATTRIBUTE_PREFIX,
218+
attributesGroupName = ACCOUNT_EXTRA_GROUP_VERBOSE_NAME,
219+
reservedKeys = ignoredAttributes
220+
)
221+
}
222+
184223
private fun validateUserAttributes(attributes: Map<String, Any?>): MutableMap<String, Any?> {
185224
return dataConstraints.validateAttributes(
186225
attributes,
@@ -240,6 +279,8 @@ internal class RumEventSerializer(
240279

241280
internal const val GLOBAL_ATTRIBUTE_PREFIX: String = "context"
242281
internal const val USER_ATTRIBUTE_PREFIX: String = "usr"
282+
internal const val ACCOUNT_ATTRIBUTE_PREFIX: String = "account"
243283
internal const val USER_EXTRA_GROUP_VERBOSE_NAME = "user extra information"
284+
internal const val ACCOUNT_EXTRA_GROUP_VERBOSE_NAME = "account extra information"
244285
}
245286
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,13 @@ internal class RumActionScope(
291291
} else {
292292
null
293293
},
294+
account = datadogContext.accountInfo?.let {
295+
ActionEvent.Account(
296+
id = it.id,
297+
name = it.name,
298+
additionalProperties = it.extraInfo.toMutableMap()
299+
)
300+
},
294301
os = ActionEvent.Os(
295302
name = datadogContext.deviceInfo.osName,
296303
version = datadogContext.deviceInfo.osVersion,

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,13 @@ internal class RumResourceScope(
258258
} else {
259259
null
260260
},
261+
account = datadogContext.accountInfo?.let {
262+
ResourceEvent.Account(
263+
id = it.id,
264+
name = it.name,
265+
additionalProperties = it.extraInfo.toMutableMap()
266+
)
267+
},
261268
connectivity = networkInfo.toResourceConnectivity(),
262269
application = ResourceEvent.Application(rumContext.applicationId),
263270
session = ResourceEvent.ResourceEventSession(
@@ -407,6 +414,13 @@ internal class RumResourceScope(
407414
} else {
408415
null
409416
},
417+
account = datadogContext.accountInfo?.let {
418+
ErrorEvent.Account(
419+
id = it.id,
420+
name = it.name,
421+
additionalProperties = it.extraInfo.toMutableMap()
422+
)
423+
},
410424
connectivity = networkInfo.toErrorConnectivity(),
411425
application = ErrorEvent.Application(rumContext.applicationId),
412426
session = ErrorEvent.ErrorEventSession(

0 commit comments

Comments
 (0)