Skip to content

Commit 110fa18

Browse files
committed
RUM-10279: Add Account Information in Logs
1 parent 3ecfbd2 commit 110fa18

File tree

8 files changed

+160
-9
lines changed

8 files changed

+160
-9
lines changed

features/dd-sdk-android-logs/api/apiSurface

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ data class com.datadog.android.log.LogsConfiguration
3535
fun setEventMapper(com.datadog.android.event.EventMapper<com.datadog.android.log.model.LogEvent>): Builder
3636
fun build(): LogsConfiguration
3737
data class com.datadog.android.log.model.LogEvent
38-
constructor(Status, kotlin.String, kotlin.String, kotlin.String, Logger, Dd, Usr? = null, Network? = null, Error? = null, kotlin.String? = null, kotlin.String, kotlin.collections.MutableMap<kotlin.String, kotlin.Any?> = mutableMapOf())
38+
constructor(Status, kotlin.String, kotlin.String, kotlin.String, Logger, Dd, Usr? = null, Account? = null, Network? = null, Error? = null, kotlin.String? = null, kotlin.String, kotlin.collections.MutableMap<kotlin.String, kotlin.Any?> = mutableMapOf())
3939
fun toJson(): com.google.gson.JsonElement
4040
companion object
4141
fun fromJson(kotlin.String): LogEvent
@@ -58,6 +58,12 @@ data class com.datadog.android.log.model.LogEvent
5858
companion object
5959
fun fromJson(kotlin.String): Usr
6060
fun fromJsonObject(com.google.gson.JsonObject): Usr
61+
data class Account
62+
constructor(kotlin.String? = null, kotlin.String? = null, kotlin.collections.MutableMap<kotlin.String, kotlin.Any?> = mutableMapOf())
63+
fun toJson(): com.google.gson.JsonElement
64+
companion object
65+
fun fromJson(kotlin.String): Account
66+
fun fromJsonObject(com.google.gson.JsonObject): Account
6167
data class Network
6268
constructor(Client)
6369
fun toJson(): com.google.gson.JsonElement

features/dd-sdk-android-logs/api/dd-sdk-android-logs.api

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,25 +86,27 @@ public final class com/datadog/android/log/LogsConfiguration$Builder {
8686

8787
public final class com/datadog/android/log/model/LogEvent {
8888
public static final field Companion Lcom/datadog/android/log/model/LogEvent$Companion;
89-
public fun <init> (Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
90-
public synthetic fun <init> (Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
89+
public fun <init> (Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Account;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
90+
public synthetic fun <init> (Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Account;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
9191
public final fun component1 ()Lcom/datadog/android/log/model/LogEvent$Status;
92-
public final fun component10 ()Ljava/lang/String;
92+
public final fun component10 ()Lcom/datadog/android/log/model/LogEvent$Error;
9393
public final fun component11 ()Ljava/lang/String;
94-
public final fun component12 ()Ljava/util/Map;
94+
public final fun component12 ()Ljava/lang/String;
95+
public final fun component13 ()Ljava/util/Map;
9596
public final fun component2 ()Ljava/lang/String;
9697
public final fun component3 ()Ljava/lang/String;
9798
public final fun component4 ()Ljava/lang/String;
9899
public final fun component5 ()Lcom/datadog/android/log/model/LogEvent$Logger;
99100
public final fun component6 ()Lcom/datadog/android/log/model/LogEvent$Dd;
100101
public final fun component7 ()Lcom/datadog/android/log/model/LogEvent$Usr;
101-
public final fun component8 ()Lcom/datadog/android/log/model/LogEvent$Network;
102-
public final fun component9 ()Lcom/datadog/android/log/model/LogEvent$Error;
103-
public final fun copy (Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Lcom/datadog/android/log/model/LogEvent;
104-
public static synthetic fun copy$default (Lcom/datadog/android/log/model/LogEvent;Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/datadog/android/log/model/LogEvent;
102+
public final fun component8 ()Lcom/datadog/android/log/model/LogEvent$Account;
103+
public final fun component9 ()Lcom/datadog/android/log/model/LogEvent$Network;
104+
public final fun copy (Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Account;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Lcom/datadog/android/log/model/LogEvent;
105+
public static synthetic fun copy$default (Lcom/datadog/android/log/model/LogEvent;Lcom/datadog/android/log/model/LogEvent$Status;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/datadog/android/log/model/LogEvent$Logger;Lcom/datadog/android/log/model/LogEvent$Dd;Lcom/datadog/android/log/model/LogEvent$Usr;Lcom/datadog/android/log/model/LogEvent$Account;Lcom/datadog/android/log/model/LogEvent$Network;Lcom/datadog/android/log/model/LogEvent$Error;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/datadog/android/log/model/LogEvent;
105106
public fun equals (Ljava/lang/Object;)Z
106107
public static final fun fromJson (Ljava/lang/String;)Lcom/datadog/android/log/model/LogEvent;
107108
public static final fun fromJsonObject (Lcom/google/gson/JsonObject;)Lcom/datadog/android/log/model/LogEvent;
109+
public final fun getAccount ()Lcom/datadog/android/log/model/LogEvent$Account;
108110
public final fun getAdditionalProperties ()Ljava/util/Map;
109111
public final fun getBuildId ()Ljava/lang/String;
110112
public final fun getDate ()Ljava/lang/String;
@@ -125,6 +127,32 @@ public final class com/datadog/android/log/model/LogEvent {
125127
public fun toString ()Ljava/lang/String;
126128
}
127129

130+
public final class com/datadog/android/log/model/LogEvent$Account {
131+
public static final field Companion Lcom/datadog/android/log/model/LogEvent$Account$Companion;
132+
public fun <init> ()V
133+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
134+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
135+
public final fun component1 ()Ljava/lang/String;
136+
public final fun component2 ()Ljava/lang/String;
137+
public final fun component3 ()Ljava/util/Map;
138+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Lcom/datadog/android/log/model/LogEvent$Account;
139+
public static synthetic fun copy$default (Lcom/datadog/android/log/model/LogEvent$Account;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/datadog/android/log/model/LogEvent$Account;
140+
public fun equals (Ljava/lang/Object;)Z
141+
public static final fun fromJson (Ljava/lang/String;)Lcom/datadog/android/log/model/LogEvent$Account;
142+
public static final fun fromJsonObject (Lcom/google/gson/JsonObject;)Lcom/datadog/android/log/model/LogEvent$Account;
143+
public final fun getAdditionalProperties ()Ljava/util/Map;
144+
public final fun getId ()Ljava/lang/String;
145+
public final fun getName ()Ljava/lang/String;
146+
public fun hashCode ()I
147+
public final fun toJson ()Lcom/google/gson/JsonElement;
148+
public fun toString ()Ljava/lang/String;
149+
}
150+
151+
public final class com/datadog/android/log/model/LogEvent$Account$Companion {
152+
public final fun fromJson (Ljava/lang/String;)Lcom/datadog/android/log/model/LogEvent$Account;
153+
public final fun fromJsonObject (Lcom/google/gson/JsonObject;)Lcom/datadog/android/log/model/LogEvent$Account;
154+
}
155+
128156
public final class com/datadog/android/log/model/LogEvent$Client {
129157
public static final field Companion Lcom/datadog/android/log/model/LogEvent$Client$Companion;
130158
public fun <init> (Lcom/datadog/android/log/model/LogEvent$SimCarrier;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V

features/dd-sdk-android-logs/src/main/json/log/log-schema.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,26 @@
110110
},
111111
"readOnly": true
112112
},
113+
"account": {
114+
"type": "object",
115+
"description": "Account properties",
116+
"properties": {
117+
"id": {
118+
"type": "string",
119+
"description": "Identifier of the account",
120+
"readOnly": true
121+
},
122+
"name": {
123+
"type": "string",
124+
"description": "Name of the account",
125+
"readOnly": true
126+
}
127+
},
128+
"additionalProperties": {
129+
"type": "object"
130+
},
131+
"readOnly": true
132+
},
113133
"network": {
114134
"type": "object",
115135
"description": "The network information in the moment the log was created",

features/dd-sdk-android-logs/src/main/kotlin/com/datadog/android/log/internal/domain/DatadogLogGenerator.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.datadog.android.log.internal.domain
88

9+
import com.datadog.android.api.context.AccountInfo
910
import com.datadog.android.api.context.DatadogContext
1011
import com.datadog.android.api.context.NetworkInfo
1112
import com.datadog.android.api.context.UserInfo
@@ -41,6 +42,7 @@ internal class DatadogLogGenerator(
4142
bundleWithTraces: Boolean,
4243
bundleWithRum: Boolean,
4344
userInfo: UserInfo?,
45+
accountInfo: AccountInfo?,
4446
networkInfo: NetworkInfo?,
4547
threads: List<ThreadDump>
4648
): LogEvent {
@@ -77,6 +79,7 @@ internal class DatadogLogGenerator(
7779
bundleWithTraces,
7880
bundleWithRum,
7981
userInfo,
82+
accountInfo,
8083
networkInfo
8184
)
8285
}
@@ -97,6 +100,7 @@ internal class DatadogLogGenerator(
97100
bundleWithTraces: Boolean,
98101
bundleWithRum: Boolean,
99102
userInfo: UserInfo?,
103+
accountInfo: AccountInfo?,
100104
networkInfo: NetworkInfo?
101105
): LogEvent {
102106
val mutableAttributes = attributes.toMutableMap()
@@ -127,6 +131,7 @@ internal class DatadogLogGenerator(
127131
bundleWithTraces,
128132
bundleWithRum,
129133
userInfo,
134+
accountInfo,
130135
networkInfo
131136
)
132137
}
@@ -148,6 +153,7 @@ internal class DatadogLogGenerator(
148153
bundleWithTraces: Boolean,
149154
bundleWithRum: Boolean,
150155
userInfo: UserInfo?,
156+
accountInfo: AccountInfo?,
151157
networkInfo: NetworkInfo?
152158
): LogEvent {
153159
val resolvedTimestamp = timestamp + datadogContext.time.serverTimeOffsetMs
@@ -164,6 +170,7 @@ internal class DatadogLogGenerator(
164170
}
165171
val combinedTags = resolveTags(datadogContext, tags)
166172
val usr = resolveUserInfo(datadogContext, userInfo)
173+
val account = resolveAccountInfo(datadogContext, accountInfo)
167174
val network = if (networkInfo != null || attachNetworkInfo) {
168175
resolveNetworkInfo(datadogContext, networkInfo)
169176
} else {
@@ -190,6 +197,7 @@ internal class DatadogLogGenerator(
190197
)
191198
),
192199
usr = usr,
200+
account = account,
193201
network = network,
194202
ddtags = combinedTags.joinToString(separator = ","),
195203
additionalProperties = combinedAttributes
@@ -251,6 +259,19 @@ internal class DatadogLogGenerator(
251259
}
252260
}
253261

262+
private fun resolveAccountInfo(
263+
datadogContext: DatadogContext,
264+
accountInfo: AccountInfo?
265+
): LogEvent.Account? {
266+
return (accountInfo ?: datadogContext.accountInfo)?.let {
267+
LogEvent.Account(
268+
id = it.id,
269+
name = it.name,
270+
additionalProperties = it.extraInfo.toMutableMap()
271+
)
272+
}
273+
}
274+
254275
private fun resolveTags(
255276
datadogContext: DatadogContext,
256277
tags: Set<String>

features/dd-sdk-android-logs/src/main/kotlin/com/datadog/android/log/internal/domain/LogGenerator.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.datadog.android.log.internal.domain
88

9+
import com.datadog.android.api.context.AccountInfo
910
import com.datadog.android.api.context.DatadogContext
1011
import com.datadog.android.api.context.NetworkInfo
1112
import com.datadog.android.api.context.UserInfo
@@ -31,6 +32,7 @@ internal interface LogGenerator {
3132
bundleWithTraces: Boolean = true,
3233
bundleWithRum: Boolean = true,
3334
userInfo: UserInfo? = null,
35+
accountInfo: AccountInfo? = null,
3436
networkInfo: NetworkInfo? = null,
3537
threads: List<ThreadDump> = emptyList()
3638
): LogEvent?
@@ -52,6 +54,7 @@ internal interface LogGenerator {
5254
bundleWithTraces: Boolean = true,
5355
bundleWithRum: Boolean = true,
5456
userInfo: UserInfo? = null,
57+
accountInfo: AccountInfo? = null,
5558
networkInfo: NetworkInfo? = null
5659
): LogEvent?
5760
}

features/dd-sdk-android-logs/src/test/kotlin/com/datadog/android/log/assertj/LogEventAssert.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.datadog.android.log.assertj
88

9+
import com.datadog.android.api.context.AccountInfo
910
import com.datadog.android.api.context.NetworkInfo
1011
import com.datadog.android.api.context.UserInfo
1112
import com.datadog.android.log.internal.domain.DatadogLogGenerator
@@ -223,6 +224,27 @@ internal class LogEventAssert(actual: LogEvent) :
223224
return this
224225
}
225226

227+
fun hasAccountInfo(accountInfo: AccountInfo?): LogEventAssert {
228+
assertThat(actual.account?.name)
229+
.overridingErrorMessage(
230+
"Expected LogEvent to have account name: " +
231+
"${accountInfo?.name} but " +
232+
"instead was: ${actual.account?.name}"
233+
)
234+
.isEqualTo(accountInfo?.name)
235+
assertThat(actual.account?.id)
236+
.overridingErrorMessage(
237+
"Expected LogEvent to have account id: " +
238+
"${accountInfo?.id} but " +
239+
"instead was: ${actual.account?.id}"
240+
)
241+
.isEqualTo(accountInfo?.id)
242+
assertThat(actual.account?.additionalProperties)
243+
.hasSameSizeAs(accountInfo?.extraInfo)
244+
.containsAllEntriesOf(accountInfo?.extraInfo)
245+
return this
246+
}
247+
226248
fun doesNotHaveUserInfo(): LogEventAssert {
227249
assertThat(actual.usr)
228250
.overridingErrorMessage(

features/dd-sdk-android-logs/src/test/kotlin/com/datadog/android/log/internal/domain/DatadogLogGeneratorTest.kt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package com.datadog.android.log.internal.domain
88

9+
import com.datadog.android.api.context.AccountInfo
910
import com.datadog.android.api.context.DatadogContext
1011
import com.datadog.android.api.context.NetworkInfo
1112
import com.datadog.android.api.context.UserInfo
@@ -604,6 +605,49 @@ internal class DatadogLogGeneratorTest {
604605
assertThat(log).hasUserInfo(fakeDatadogContext.userInfo)
605606
}
606607

608+
@Test
609+
fun `M use custom accountInfo W creating the Log { accountInfo provided }`(
610+
@Forgery fakeCustomAccountInfo: AccountInfo
611+
) {
612+
// WHEN
613+
val log = testedLogGenerator.generateLog(
614+
fakeLevel,
615+
fakeLogMessage,
616+
fakeThrowable,
617+
fakeAttributes,
618+
fakeTags,
619+
fakeTimestamp,
620+
fakeThreadName,
621+
fakeDatadogContext,
622+
attachNetworkInfo = true,
623+
fakeLoggerName,
624+
accountInfo = fakeCustomAccountInfo
625+
)
626+
627+
// THEN
628+
assertThat(log).hasAccountInfo(fakeCustomAccountInfo)
629+
}
630+
631+
@Test
632+
fun `M add the accountInfo W creating the Log`() {
633+
// WHEN
634+
val log = testedLogGenerator.generateLog(
635+
fakeLevel,
636+
fakeLogMessage,
637+
fakeThrowable,
638+
fakeAttributes,
639+
fakeTags,
640+
fakeTimestamp,
641+
fakeThreadName,
642+
fakeDatadogContext,
643+
attachNetworkInfo = true,
644+
fakeLoggerName
645+
)
646+
647+
// THEN
648+
assertThat(log).hasAccountInfo(fakeDatadogContext.accountInfo)
649+
}
650+
607651
@Test
608652
fun `M add the networkInfo W creating the Log`() {
609653
// WHEN

features/dd-sdk-android-logs/src/test/kotlin/com/datadog/android/log/internal/logger/DatadogLogHandlerTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ internal class DatadogLogHandlerTest {
254254
.hasDateAround(now)
255255
.hasNetworkInfo(fakeDatadogContext.networkInfo)
256256
.hasUserInfo(fakeDatadogContext.userInfo)
257+
.hasAccountInfo(fakeDatadogContext.accountInfo)
257258
.hasBuildId(fakeDatadogContext.appBuildId)
258259
.hasExactlyAttributes(
259260
fakeAttributes + mapOf(
@@ -311,6 +312,7 @@ internal class DatadogLogHandlerTest {
311312
.hasDateAround(now)
312313
.hasNetworkInfo(fakeDatadogContext.networkInfo)
313314
.hasUserInfo(fakeDatadogContext.userInfo)
315+
.hasAccountInfo(fakeDatadogContext.accountInfo)
314316
.hasBuildId(fakeDatadogContext.appBuildId)
315317
.hasExactlyAttributes(
316318
fakeAttributes + mapOf(
@@ -547,6 +549,7 @@ internal class DatadogLogHandlerTest {
547549
.hasDate((customTimestamp + serverTimeOffsetMs).toIsoFormattedTimestamp())
548550
.hasNetworkInfo(fakeDatadogContext.networkInfo)
549551
.hasUserInfo(fakeDatadogContext.userInfo)
552+
.hasAccountInfo(fakeDatadogContext.accountInfo)
550553
.hasBuildId(fakeDatadogContext.appBuildId)
551554
.hasExactlyAttributes(
552555
fakeAttributes + mapOf(
@@ -600,6 +603,7 @@ internal class DatadogLogHandlerTest {
600603
.hasDateAround(now)
601604
.hasNetworkInfo(fakeDatadogContext.networkInfo)
602605
.hasUserInfo(fakeDatadogContext.userInfo)
606+
.hasAccountInfo(fakeDatadogContext.accountInfo)
603607
.hasBuildId(fakeDatadogContext.appBuildId)
604608
.hasExactlyAttributes(
605609
fakeAttributes + mapOf(
@@ -651,6 +655,7 @@ internal class DatadogLogHandlerTest {
651655
.hasDateAround(now)
652656
.doesNotHaveNetworkInfo()
653657
.hasUserInfo(fakeDatadogContext.userInfo)
658+
.hasAccountInfo(fakeDatadogContext.accountInfo)
654659
.hasBuildId(fakeDatadogContext.appBuildId)
655660
.hasExactlyAttributes(
656661
fakeAttributes + mapOf(
@@ -711,6 +716,7 @@ internal class DatadogLogHandlerTest {
711716
.hasDateAround(now)
712717
.doesNotHaveNetworkInfo()
713718
.hasUserInfo(fakeDatadogContext.userInfo)
719+
.hasAccountInfo(fakeDatadogContext.accountInfo)
714720
.hasBuildId(fakeDatadogContext.appBuildId)
715721
.hasExactlyAttributes(emptyMap())
716722
.hasExactlyTags(
@@ -1001,6 +1007,7 @@ internal class DatadogLogHandlerTest {
10011007
.hasDateAround(now)
10021008
.hasNetworkInfo(fakeDatadogContext.networkInfo)
10031009
.hasUserInfo(fakeDatadogContext.userInfo)
1010+
.hasAccountInfo(fakeDatadogContext.accountInfo)
10041011
.hasBuildId(fakeDatadogContext.appBuildId)
10051012
.hasExactlyAttributes(
10061013
fakeAttributes + mapOf(

0 commit comments

Comments
 (0)