Skip to content

Commit b78b347

Browse files
Merge pull request #3648 from DataDog/tvaleev/feature/RUM-16627
RUM-16627: Mixing in DdTags for web view event. Co-authored-by: satween <timur.valeev@datadoghq.com>
2 parents 2fcaa92 + 66fee5e commit b78b347

19 files changed

Lines changed: 645 additions & 175 deletions

File tree

dd-sdk-android-core/api/apiSurface

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,11 @@ fun java.util.concurrent.ScheduledExecutorService.scheduleSafe(String, Long, jav
345345
fun java.util.concurrent.ExecutorService.submitSafe(String, com.datadog.android.api.InternalLogger, Runnable): java.util.concurrent.Future<*>?
346346
fun <T> java.util.concurrent.ExecutorService.submitSafe(String, com.datadog.android.api.InternalLogger, java.util.concurrent.Callable<T>): java.util.concurrent.Future<T>?
347347
fun <T> java.util.concurrent.Future<T>?.getSafe(String, com.datadog.android.api.InternalLogger): T?
348+
object com.datadog.android.core.internal.utils.DdTagsUtils
349+
fun toDdTagsString(com.datadog.android.api.context.DatadogContext): String
350+
fun toDdTagsString(Map<String, String>): String
351+
fun toDdTagsMap(com.datadog.android.api.context.DatadogContext): Map<String, String>
352+
fun toDdTagsMap(String?): Map<String, String>?
348353
object com.datadog.android.core.internal.utils.JsonSerializer
349354
fun toJsonElement(Any?): com.google.gson.JsonElement
350355
fun Map<String, Any?>.safeMapValuesToJson(com.datadog.android.api.InternalLogger): Map<String, com.google.gson.JsonElement>

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,14 @@ public final class com/datadog/android/core/internal/utils/ConcurrencyExtKt {
901901
public static final fun submitSafe (Ljava/util/concurrent/ExecutorService;Ljava/lang/String;Lcom/datadog/android/api/InternalLogger;Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;
902902
}
903903

904+
public final class com/datadog/android/core/internal/utils/DdTagsUtils {
905+
public static final field INSTANCE Lcom/datadog/android/core/internal/utils/DdTagsUtils;
906+
public final fun toDdTagsMap (Lcom/datadog/android/api/context/DatadogContext;)Ljava/util/Map;
907+
public final fun toDdTagsMap (Ljava/lang/String;)Ljava/util/Map;
908+
public final fun toDdTagsString (Lcom/datadog/android/api/context/DatadogContext;)Ljava/lang/String;
909+
public final fun toDdTagsString (Ljava/util/Map;)Ljava/lang/String;
910+
}
911+
904912
public final class com/datadog/android/core/internal/utils/JsonSerializer {
905913
public static final field INSTANCE Lcom/datadog/android/core/internal/utils/JsonSerializer;
906914
public final fun safeMapValuesToJson (Ljava/util/Map;Lcom/datadog/android/api/InternalLogger;)Ljava/util/Map;
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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.core.internal.utils
8+
9+
import com.datadog.android.api.context.DatadogContext
10+
import com.datadog.android.lint.InternalApi
11+
12+
/**
13+
* Utilities for building and parsing Datadog tags strings and maps.
14+
*/
15+
@Suppress("PackageNameVisibility")
16+
object DdTagsUtils {
17+
18+
internal const val TAG_SERVICE = "service"
19+
internal const val TAG_VERSION = "version"
20+
internal const val TAG_SDK_VERSION = "sdk_version"
21+
internal const val TAG_ENV = "env"
22+
internal const val TAG_VARIANT = "variant"
23+
24+
private const val TAGS_SEPARATOR = ","
25+
private const val KEY_VALUE_SEPARATOR = ":"
26+
27+
/**
28+
* Builds a Datadog tags string from a [DatadogContext].
29+
*/
30+
@InternalApi
31+
fun toDdTagsString(ddContext: DatadogContext): String = buildString {
32+
append(TAG_SERVICE).append(KEY_VALUE_SEPARATOR).append(ddContext.service).append(TAGS_SEPARATOR)
33+
append(TAG_VERSION).append(KEY_VALUE_SEPARATOR).append(ddContext.version).append(TAGS_SEPARATOR)
34+
append(TAG_SDK_VERSION).append(KEY_VALUE_SEPARATOR).append(ddContext.sdkVersion).append(TAGS_SEPARATOR)
35+
append(TAG_ENV).append(KEY_VALUE_SEPARATOR).append(ddContext.env)
36+
if (ddContext.variant.isNotEmpty()) {
37+
append(TAGS_SEPARATOR).append(TAG_VARIANT).append(KEY_VALUE_SEPARATOR).append(ddContext.variant)
38+
}
39+
}
40+
41+
/**
42+
* Builds a Datadog tags string from a map of tag key-value pairs.
43+
*/
44+
@InternalApi
45+
fun toDdTagsString(tags: Map<String, String>): String = tags.entries.joinToString(TAGS_SEPARATOR) {
46+
"${it.key}${KEY_VALUE_SEPARATOR}${it.value}"
47+
}
48+
49+
/**
50+
* Builds a Datadog tags map directly from a [DatadogContext].
51+
*/
52+
@Suppress("UnsafeThirdPartyFunctionCall")
53+
@InternalApi
54+
fun toDdTagsMap(ddContext: DatadogContext): Map<String, String> = LinkedHashMap<String, String>().apply {
55+
put(TAG_SERVICE, ddContext.service)
56+
put(TAG_VERSION, ddContext.version)
57+
put(TAG_SDK_VERSION, ddContext.sdkVersion)
58+
put(TAG_ENV, ddContext.env)
59+
60+
if (ddContext.variant.isNotEmpty()) {
61+
put(TAG_VARIANT, ddContext.variant)
62+
}
63+
}
64+
65+
/**
66+
* Parses a Datadog tags string into a [Map].
67+
*/
68+
@Suppress("UnsafeThirdPartyFunctionCall")
69+
@InternalApi
70+
fun toDdTagsMap(tagsString: String?): Map<String, String>? = LinkedHashMap<String, String>().also { tagsMap ->
71+
val tags = tagsString?.split(TAGS_SEPARATOR)
72+
if (tags.isNullOrEmpty()) return null
73+
for (tag in tags) {
74+
val keyValue = tag.split(KEY_VALUE_SEPARATOR, limit = 2)
75+
.takeIf { it.size == 2 && it[0].isNotEmpty() && it[1].isNotEmpty() }
76+
?: continue
77+
78+
tagsMap[keyValue[0]] = keyValue[1]
79+
}
80+
if (tagsMap.isEmpty()) return null
81+
}
82+
}

0 commit comments

Comments
 (0)