Skip to content

Commit 0130ada

Browse files
committed
Adding migration guide for SDK v3
1 parent 1f08058 commit 0130ada

38 files changed

+2069
-271
lines changed

MIGRATION.MD

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,185 @@
1+
# Migration from 2.x to 3.0
2+
3+
The main changes introduced in SDK 3.0 compared to 2.x are:
4+
5+
1. The `OpenTracing` dependency was removed because it is obsolete.
6+
7+
8+
We replaced the `OpenTracing` classes with internal one. However we strongly encourage you to use the OTel version as the new tracing API standard.
9+
10+
11+
### Trace product changes
12+
13+
#### Migrating tracing from `OpenTracing` to `OpenTelemetry` (recommended)
14+
15+
> [!WARNING]
16+
> Note that the `OpenTelemetry` specification library [requires](https://github.com/open-telemetry/opentelemetry-java?tab=readme-ov-file#requirements) desugaring to be enabled for with projects that have a `minSdk` < 26. If this requirement cannot be met in your project see the following section.
17+
18+
19+
1. Add the `OpenTelemetry` dependency to your `build.gradle.kts`:
20+
21+
```kotlin
22+
implementation(project("com.datadoghq:dd-sdk-android-trace-otel:x.x.x"))
23+
```
24+
25+
2. Replace the `OpenTracing` configuration:
26+
```kotlin
27+
GlobalTracer.registerIfAbsent(
28+
AndroidTracer.Builder()
29+
.setService(BuildConfig.APPLICATION_ID)
30+
.build()
31+
)
32+
```
33+
34+
with the `OpenTelemetry` configuration:
35+
```kotlin
36+
GlobalOpenTelemetry.set(object : OpenTelemetry {
37+
private val tracerProvider = OtelTracerProvider.Builder()
38+
.setService(BuildConfig.APPLICATION_ID)
39+
.build()
40+
41+
override fun getTracerProvider(): TracerProvider {
42+
return tracerProvider
43+
}
44+
45+
override fun getPropagators(): ContextPropagators {
46+
return ContextPropagators.noop()
47+
}
48+
})
49+
```
50+
51+
> [!NOTE]
52+
> You can use the default configuration to make it even shorter in case if don't provide any additional parameters:
53+
```kotlin
54+
GlobalOpenTelemetry.set(
55+
DatadogOpenTelemetry(BuildConfig.APPLICATION_ID)
56+
)
57+
```
58+
59+
To access the tracer object for manual (custom) tracing, use `io.opentelemetry.api.GlobalOpenTelemetry.get()` instead of `io.opentracing.util.GlobalTracer.get()`.
60+
For example:
61+
```kotlin
62+
val tracer: Tracer = GlobalOpenTelemetry
63+
.get()
64+
.getTracer("SampleApplicationTracer")
65+
66+
val span = tracer
67+
.spanBuilder("Executing operation")
68+
.startSpan()
69+
70+
// Code that should be instrumented
71+
72+
span.end()
73+
```
74+
75+
Refer to the official `OpenTelemetry` [documentation](https://opentelemetry.io/docs/) for more details.
76+
77+
#### Migrating tracing from `OpenTracing` to `DatadogTracing` (transition period)
78+
79+
> [!WARNING]
80+
> This option has been added for compatibility and to simplify the transition from `OpenTracing` to `OpenTelemetry`, but it may not be available in future major releases. We recommend using `OpenTelemetry` as the standard for tracing tasks. However, if it is not possible to enable desugaring in your project for some reason, you can use this method.
81+
82+
1. Add the `DatadogTracing` dependency to your `build.gradle.kts`:
83+
84+
```kotlin
85+
implementation(project("com.datadoghq:dd-sdk-android-trace-otel:x.x.x"))
86+
```
87+
88+
89+
2.Replace the `OpenTracing` configuration:
90+
```kotlin
91+
GlobalTracer.registerIfAbsent(
92+
AndroidTracer.Builder()
93+
.setService(BuildConfig.APPLICATION_ID)
94+
.build()
95+
)
96+
```
97+
98+
with the `DatadogTracing` configuration:
99+
```kotlin
100+
GlobalDatadogTracer.registerIfAbsent(
101+
DatadogTracing.newTracerBuilder()
102+
.build()
103+
)
104+
```
105+
106+
107+
For manual (custom) tracing use `com.datadog.android.trace.GlobalDatadogTracer.get()` instead of `io.opentracing.util.GlobalTracer.get()` to access the tracer object.
108+
For example:
109+
```kotlin
110+
val tracer = GlobalDatadogTracer.get()
111+
112+
val span = tracer
113+
.buildSpan(operationName)
114+
.start()
115+
116+
// Code that should be instrumented
117+
118+
span.finish()
119+
```
120+
Refer to the Datadog [documentation](https://docs.datadoghq.com/tracing/trace_collection/automatic_instrumentation/dd_libraries/android?tab=kotlin) for more details.
121+
122+
API changes:
123+
124+
|`2.x`|`3.0` `OpenTelemetry`|`3.0` `DatadogTracing`|
125+
|---|---|---|
126+
|`io.opentracing.util.GlobalTracer`|`io.opentelemetry.api.GlobalOpenTelemetry`|`com.datadog.android.trace.GlobalDatadogTracer`|
127+
|`com.datadog.android.trace.AndroidTracer`|`io.opentelemetry.api.trace.Tracer`|`com.datadog.android.trace.api.tracer.DatadogTracer`|
128+
|`io.opentracing.Span`|`io.opentelemetry.api.trace.Span`|`com.datadog.android.trace.api.span.DatadogSpan`|
129+
|`io.opentracing.Scope`|`io.opentelemetry.context.Scope`|`com.datadog.android.trace.api.scope.DatadogScope`|
130+
|`io.opentracing.SpanContext`|`io.opentelemetry.api.trace.SpanContext`|`com.datadog.android.trace.api.span.DatadogSpanContext`|
131+
132+
Replacement hints:
133+
134+
|`2.x`|`3.0` `OpenTelemetry`|`3.0` `DatadogTracing`|
135+
|---|---|---|
136+
|`AndroidTracer.Builder().build()`||`DatadogTracing.newTracerBuilder().build()`|
137+
|`AndroidTracer#setPartialFlushThreshold(Int)`|`OtelTracerProvider#setPartialFlushThreshold()`|`DatadogTracerBuilder#withPartialFlushMinSpans()`|
138+
|`io.opentracing.SpanContext#toTraceId()`|`io.opentelemetry.api.trace.SpanContext#getTraceId()`|`DatadogSpanContext.traceId.toString()`|
139+
|`io.opentracing.Span#setError()`|`io.opentelemetry.api.trace#recordException()`|`DatadogSpan#addThrowable()`|
140+
141+
### OkHttp instrumentation changes
142+
143+
The OkHttp instrumentation (`com.datadoghq:dd-sdk-android-okhttp:x.x.x`) doesn't require desugaring support. However few migration actions may be necessary.
144+
145+
146+
API changes:
147+
148+
|`2.x`|`3.0`|
149+
|--|--|
150+
|`TracingInterceptor(String, List<String>, TracedRequestListener,Sampler<Span>)`| Use `TracingInterceptor.Builder()` instead.|
151+
|`TracingInterceptor(String?,Map<String, Set<TracingHeaderType>>, TracedRequestListener, Sampler<Span>)`| Use `TracingInterceptor.Builder()` instead.|
152+
|`TracingInterceptor(String?,TracedRequestListener,Sampler<Span>)`|Use `TracingInterceptor.Builder()` instead.|
153+
|`DatadogInterceptor(String?, Map<String, Set<TracingHeaderType>>,TracedRequestListener, RumResourceAttributesProvider, Sampler<Span>)`|Use `DatadogInterceptor.Builder()` instead. |
154+
|`DatadogInterceptor(String?,List<String>,TracedRequestListener,RumResourceAttributesProvider,Sampler<Span>)`|Use `DatadogInterceptor.Builder()` instead.|
155+
| `DatadogInterceptor(String?,TracedRequestListener,RumResourceAttributesProvider,Sampler<Span>) ` | Use `DatadogInterceptor.Builder()` instead. |
156+
157+
158+
### Core product changes
159+
160+
API changes:
161+
162+
|`2.x`| `3.0` |
163+
|--|------------------------------------------------------------------|
164+
|`Datadog#setUserInfo(String?, ...)`| User info ID is now mandatory `Datadog.setUserInfo(String, ...)` |
165+
166+
167+
### RUM product changes
168+
169+
API changes:
170+
171+
|`2.x`| `3.0` |
172+
|--|-------------------------------------------------------------------------------------|
173+
|`DatadogRumMonitor#startResource(String, String, String,Map<String, Any?>)`| Use `startResource` method which takes `RumHttpMethod` as `method` parameter instead |
174+
|`com.datadog.android.rum.GlobalRum`|`GlobalRum` object was renamed to `com.datadog.android.rum.GlobalRumMonitor` |
175+
|`com.datadog.android.rum.RumMonitor#addAction()`| Parameter `attributes: Map<String, Any?>` is now optional |
176+
|`com.datadog.android.rum.RumMonitor#startAction()`| Parameter `attributes: Map<String, Any?>` is now optional |
177+
|`com.datadog.android.rum.RumMonitor#stopResource()`| Parameter `attributes: Map<String, Any?>` is now optional |
178+
|`com.datadog.android.rum.RumMonitor#addError()`| Parameter `attributes: Map<String, Any?>` is now optional |
179+
|`com.datadog.android.rum.RumMonitor#addErrorWithStacktrace()`| Parameter `attributes: Map<String, Any?>` is now optional |
180+
|`com.datadog.android.rum.internal.monitor.AdvancedNetworkRumMonitor#stopResource()`| Parameter `attributes: Map<String, Any?>` is now optional |
181+
|`com.datadog.android.rum.internal.monitor.AdvancedNetworkRumMonitor#stopResource()`| Parameter `attributes: Map<String, Any?>` is now optional |
182+
1183
# Migration from 1.x to 2.0
2184

3185
The main changes introduced in SDK 2.0 compared to 1.x are:

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

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

5252
namespace = "com.datadog.android.rum"
53-
54-
testFixtures {
55-
enable = true
56-
}
5753
}
5854

5955
dependencies {
@@ -91,22 +87,6 @@ dependencies {
9187
testImplementation(testFixtures(project(":dd-sdk-android-internal")))
9288
testImplementation(testFixtures(project(":features:dd-sdk-android-trace")))
9389
unmock(libs.robolectric)
94-
95-
// Test Fixtures
96-
testFixturesImplementation(testFixtures(project(":dd-sdk-android-core")))
97-
testFixturesImplementation(testFixtures(project(":dd-sdk-android-internal")))
98-
testFixturesImplementation(project(":tools:unit")) {
99-
attributes {
100-
attribute(
101-
com.android.build.api.attributes.ProductFlavorAttr.of("platform"),
102-
objects.named("jvm")
103-
)
104-
}
105-
}
106-
testFixturesImplementation(libs.kotlin)
107-
testFixturesImplementation(libs.bundles.jUnit5)
108-
testFixturesImplementation(libs.okHttp)
109-
testFixturesImplementation(libs.bundles.testTools)
11090
}
11191

11292
unMock {

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ 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
2928
import com.datadog.android.rum.model.ErrorEvent
3029
import com.datadog.android.rum.model.ViewEvent
3130
import com.google.gson.JsonObject
@@ -273,8 +272,7 @@ internal class DatadogLateCrashReporter(
273272
},
274273
timeSinceAppStart = timeSinceAppStartMs
275274
),
276-
version = viewEvent.version,
277-
ddtags = buildDDTagsString(datadogContext)
275+
version = viewEvent.version
278276
)
279277
}
280278

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import com.datadog.android.rum.internal.domain.RumContext
1818
import com.datadog.android.rum.internal.domain.Time
1919
import com.datadog.android.rum.internal.monitor.StorageEvent
2020
import com.datadog.android.rum.internal.toAction
21-
import com.datadog.android.rum.internal.utils.buildDDTagsString
2221
import com.datadog.android.rum.internal.utils.hasUserData
2322
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
2423
import com.datadog.android.rum.model.ActionEvent
@@ -351,8 +350,7 @@ internal class RumActionScope(
351350
),
352351
connectivity = networkInfo.toActionConnectivity(),
353352
service = datadogContext.service,
354-
version = datadogContext.version,
355-
ddtags = buildDDTagsString(datadogContext)
353+
version = datadogContext.version
356354
)
357355
}
358356
.apply {

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import com.datadog.android.rum.internal.metric.networksettled.NetworkSettledMetr
2828
import com.datadog.android.rum.internal.monitor.StorageEvent
2929
import com.datadog.android.rum.internal.toError
3030
import com.datadog.android.rum.internal.toResource
31-
import com.datadog.android.rum.internal.utils.buildDDTagsString
3231
import com.datadog.android.rum.internal.utils.hasUserData
3332
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
3433
import com.datadog.android.rum.model.ErrorEvent
@@ -338,8 +337,7 @@ internal class RumResourceScope(
338337
configuration = ResourceEvent.Configuration(sessionSampleRate = sampleRate)
339338
),
340339
service = datadogContext.service,
341-
version = datadogContext.version,
342-
ddtags = buildDDTagsString(datadogContext)
340+
version = datadogContext.version
343341
)
344342
}
345343
.onError {
@@ -493,8 +491,7 @@ internal class RumResourceScope(
493491
configuration = ErrorEvent.Configuration(sessionSampleRate = sampleRate)
494492
),
495493
service = datadogContext.service,
496-
version = datadogContext.version,
497-
ddtags = buildDDTagsString(datadogContext)
494+
version = datadogContext.version
498495
)
499496
}
500497
.onError {

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import com.datadog.android.rum.internal.toAction
4545
import com.datadog.android.rum.internal.toError
4646
import com.datadog.android.rum.internal.toLongTask
4747
import com.datadog.android.rum.internal.toView
48-
import com.datadog.android.rum.internal.utils.buildDDTagsString
4948
import com.datadog.android.rum.internal.utils.hasUserData
5049
import com.datadog.android.rum.internal.utils.newRumEventWriteOperation
5150
import com.datadog.android.rum.internal.vitals.VitalInfo
@@ -629,8 +628,7 @@ internal open class RumViewScope(
629628
configuration = ErrorEvent.Configuration(sessionSampleRate = sampleRate)
630629
),
631630
service = datadogContext.service,
632-
version = datadogContext.version,
633-
ddtags = buildDDTagsString(datadogContext)
631+
version = datadogContext.version
634632
)
635633
}
636634
.apply {
@@ -1172,8 +1170,7 @@ internal open class RumViewScope(
11721170
),
11731171
connectivity = datadogContext.networkInfo.toViewConnectivity(),
11741172
service = datadogContext.service,
1175-
version = datadogContext.version,
1176-
ddtags = buildDDTagsString(datadogContext)
1173+
version = datadogContext.version
11771174
).apply {
11781175
sessionEndedMetricDispatcher.onViewTracked(sessionId, this)
11791176
}
@@ -1333,8 +1330,7 @@ internal open class RumViewScope(
13331330
),
13341331
connectivity = datadogContext.networkInfo.toActionConnectivity(),
13351332
service = datadogContext.service,
1336-
version = datadogContext.version,
1337-
ddtags = buildDDTagsString(datadogContext)
1333+
version = datadogContext.version
13381334
)
13391335
}
13401336
.apply {
@@ -1454,8 +1450,7 @@ internal open class RumViewScope(
14541450
configuration = LongTaskEvent.Configuration(sessionSampleRate = sampleRate)
14551451
),
14561452
service = datadogContext.service,
1457-
version = datadogContext.version,
1458-
ddtags = buildDDTagsString(datadogContext)
1453+
version = datadogContext.version
14591454
)
14601455
}
14611456
.apply {

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ 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
1718
import com.datadog.android.rum.internal.domain.event.RumViewEventFilter
1819
import java.security.DigestException
1920
import java.security.MessageDigest
@@ -55,14 +56,18 @@ internal class RumRequestFactory(
5556
}
5657

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

61-
val tags = buildTags(executionContext)
62-
if (tags.isNotEmpty()) {
63-
put(RequestFactory.QUERY_PARAM_TAGS, tags)
64-
}
65-
}
70+
)
6671

6772
val intakeUrl = customEndpointUrl ?: (context.site.intakeEndpoint + "/api/v2/rum")
6873
val queryParameters = queryParams.map { "${it.key}=${it.value}" }.joinToString("&", prefix = "?")
@@ -87,11 +92,24 @@ internal class RumRequestFactory(
8792
}
8893

8994
private fun buildTags(
95+
serviceName: String,
96+
version: String,
97+
sdkVersion: String,
98+
env: String,
99+
variant: String,
90100
executionContext: RequestExecutionContext
91101
) = buildString {
102+
append("${RumAttributes.SERVICE_NAME}:$serviceName").append(",")
103+
.append("${RumAttributes.APPLICATION_VERSION}:$version").append(",")
104+
.append("${RumAttributes.SDK_VERSION}:$sdkVersion").append(",")
105+
.append("${RumAttributes.ENV}:$env")
106+
107+
if (variant.isNotEmpty()) {
108+
append(",").append("${RumAttributes.VARIANT}:$variant")
109+
}
92110
if (executionContext.previousResponseCode != null) {
93111
// we had a previous failure
94-
append("${RETRY_COUNT_KEY}:${executionContext.attemptNumber}")
112+
append(",").append("${RETRY_COUNT_KEY}:${executionContext.attemptNumber}")
95113
append(",").append("${LAST_FAILURE_STATUS_KEY}:${executionContext.previousResponseCode}")
96114
}
97115
}

0 commit comments

Comments
 (0)