Skip to content

Commit 35ea66d

Browse files
committed
RUM-9899: fix tag extractor + tracer interceptor
1 parent b0d71cd commit 35ea66d

File tree

7 files changed

+80
-45
lines changed

7 files changed

+80
-45
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
package com.datadog.android.internal.utils
7+
8+
/**
9+
* Handy function aimed to improve readability with casting logic
10+
* E.g:
11+
* ```kotlin
12+
* val writer1 = (
13+
* featuredSdkCore.getFeature(Feature.TRACING_FEATURE_NAME)
14+
* ?.unwrap<Feature>() as? com.datadog.android.trace.InternalCoreWriterProvider
15+
* )
16+
* ?.getCoreTracerWriter()
17+
* ```
18+
* now could be written as:
19+
* ```kotlin
20+
val writer = featuredSdkCore.getFeature(Feature.TRACING_FEATURE_NAME)
21+
?.unwrap<Feature>()
22+
?.tryCastTo<com.datadog.android.trace.InternalCoreWriterProvider>()
23+
?.getCoreTracerWriter()
24+
* ```
25+
*/
26+
inline fun <reified R> Any.tryCastTo(): R? {
27+
return this as R
28+
}

features/dd-sdk-android-trace-internal/src/main/java/com/datadog/trace/common/writer/NoOpWriter.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,14 @@
1010

1111
import java.util.List;
1212

13-
public class NoOpWriter implements Writer{
13+
public class NoOpWriter implements Writer {
1414

1515
@Override
1616
public void write(List<DDSpan> trace) {
17-
1817
}
1918

2019
@Override
2120
public void start() {
22-
2321
}
2422

2523
@Override
@@ -29,11 +27,9 @@ public boolean flush() {
2927

3028
@Override
3129
public void close() {
32-
3330
}
3431

3532
@Override
3633
public void incrementDropCounts(int spanCount) {
37-
3834
}
3935
}

features/dd-sdk-android-trace-internal/src/main/java/com/datadog/trace/core/propagation/HttpCodec.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import static com.datadog.trace.api.TracePropagationStyle.TRACECONTEXT;
44

5+
import androidx.annotation.Nullable;
6+
7+
import com.datadog.android.trace.internal.compat.function.Supplier;
58
import com.datadog.trace.api.Config;
69
import com.datadog.trace.api.DD128bTraceId;
710
import com.datadog.trace.api.DD64bTraceId;
@@ -24,7 +27,6 @@
2427
import java.util.List;
2528
import java.util.Map;
2629
import java.util.Set;
27-
import com.datadog.android.trace.internal.compat.function.Supplier;
2830

2931
public class HttpCodec {
3032

@@ -66,6 +68,7 @@ public interface Extractor {
6668
* @return {@code null} for failed context extraction, a {@link TagContext} instance for partial
6769
* context extraction or an {@link ExtractedContext} for complete context extraction.
6870
*/
71+
@Nullable
6972
<C> TagContext extract(final C carrier, final AgentPropagation.ContextVisitor<C> getter);
7073

7174
/**
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,47 @@
11
package com.datadog.trace.core.propagation;
22

3+
import androidx.annotation.NonNull;
4+
import androidx.annotation.Nullable;
5+
6+
import com.datadog.android.trace.internal.compat.function.Supplier;
37
import com.datadog.trace.api.TraceConfig;
48
import com.datadog.trace.bootstrap.instrumentation.api.AgentPropagation;
59
import com.datadog.trace.bootstrap.instrumentation.api.TagContext;
610

7-
import com.datadog.android.trace.internal.compat.function.Supplier;
8-
911
public class TagContextExtractor implements HttpCodec.Extractor {
1012

1113
private final Supplier<TraceConfig> traceConfigSupplier;
1214
private final ThreadLocal<ContextInterpreter> ctxInterpreter;
15+
private final ContextInterpreter.Factory factory;
1316

1417
public TagContextExtractor(
1518
final Supplier<TraceConfig> traceConfigSupplier, final ContextInterpreter.Factory factory) {
19+
this.factory = factory;
1620
this.traceConfigSupplier = traceConfigSupplier;
1721
this.ctxInterpreter = new ThreadLocal<>();
18-
this.ctxInterpreter.set(factory.create());
1922
}
2023

2124
@Override
25+
public void cleanup() {
26+
ctxInterpreter.remove();
27+
}
28+
29+
@Override
30+
@Nullable
2231
public <C> TagContext extract(final C carrier, final AgentPropagation.ContextVisitor<C> getter) {
23-
ContextInterpreter interpreter = this.ctxInterpreter.get().reset(traceConfigSupplier.get());
32+
ContextInterpreter interpreter = resolveContextInterpreter().reset(traceConfigSupplier.get());
2433
getter.forEachKey(carrier, interpreter);
2534
return interpreter.build();
2635
}
2736

28-
@Override
29-
public void cleanup() {
30-
ctxInterpreter.remove();
37+
@NonNull
38+
private ContextInterpreter resolveContextInterpreter() {
39+
ContextInterpreter contextInterpreter = ctxInterpreter.get();
40+
if (contextInterpreter == null) {
41+
contextInterpreter = factory.create();
42+
ctxInterpreter.set(contextInterpreter);
43+
}
44+
45+
return contextInterpreter;
3146
}
3247
}

features/dd-sdk-android-trace-otel/src/main/kotlin/com/datadog/android/trace/opentelemetry/internal/NoOpCoreTracerWriter.kt

Lines changed: 0 additions & 27 deletions
This file was deleted.

features/dd-sdk-android-trace-otel/src/test/kotlin/com/datadog/android/trace/opentelemetry/OtelTracerBuilderProviderTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import com.datadog.android.api.feature.FeatureSdkCore
1414
import com.datadog.android.log.LogAttributes
1515
import com.datadog.android.trace.InternalCoreWriterProvider
1616
import com.datadog.android.trace.TracingHeaderType
17-
import com.datadog.android.trace.opentelemetry.internal.NoOpCoreTracerWriter
1817
import com.datadog.android.trace.opentelemetry.utils.verifyLog
1918
import com.datadog.android.utils.forge.Configurator
2019
import com.datadog.opentelemetry.trace.OtelSpan
@@ -28,6 +27,7 @@ import com.datadog.trace.api.sampling.PrioritySampling
2827
import com.datadog.trace.bootstrap.instrumentation.api.AgentScopeManager
2928
import com.datadog.trace.bootstrap.instrumentation.api.AgentTracer
3029
import com.datadog.trace.bootstrap.instrumentation.api.ScopeSource
30+
import com.datadog.trace.common.writer.NoOpWriter
3131
import com.datadog.trace.common.writer.Writer
3232
import com.datadog.trace.core.CoreTracer
3333
import com.datadog.trace.core.DDSpan
@@ -181,7 +181,7 @@ internal class OtelTracerBuilderProviderTest {
181181
assertThat(tracer).isNotNull
182182
val coreTracer: CoreTracer = tracer.getFieldValue("coreTracer")
183183
val writer: Writer = coreTracer.getFieldValue("writer")
184-
assertThat(writer).isInstanceOf(NoOpCoreTracerWriter::class.java)
184+
assertThat(writer).isInstanceOf(NoOpWriter::class.java)
185185
}
186186

187187
@Test

integrations/dd-sdk-android-okhttp/src/main/kotlin/com/datadog/android/okhttp/trace/TracingInterceptor.kt

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.datadog.android.core.internal.net.DefaultFirstPartyHostHeaderTypeReso
1919
import com.datadog.android.core.sampling.Sampler
2020
import com.datadog.android.internal.telemetry.TracingHeaderTypesSet
2121
import com.datadog.android.internal.utils.loggableStackTrace
22+
import com.datadog.android.internal.utils.tryCastTo
2223
import com.datadog.android.okhttp.TraceContext
2324
import com.datadog.android.okhttp.TraceContextInjection
2425
import com.datadog.android.okhttp.internal.otel.toAgentSpanContext
@@ -33,6 +34,7 @@ import com.datadog.trace.api.sampling.SamplingMechanism
3334
import com.datadog.trace.bootstrap.instrumentation.api.AgentSpan
3435
import com.datadog.trace.bootstrap.instrumentation.api.Tags
3536
import com.datadog.trace.common.sampling.AllSampler
37+
import com.datadog.trace.common.writer.NoOpWriter
3638
import com.datadog.trace.core.CoreTracer
3739
import com.datadog.trace.core.DDSpan
3840
import com.datadog.trace.core.propagation.ExtractedContext
@@ -385,7 +387,7 @@ internal constructor(
385387
val tagContext = request.tag(Span::class.java)?.context()
386388
?: request.tag(TraceContext::class.java)?.toAgentSpanContext()
387389

388-
val headerContext: AgentSpan.Context.Extracted = tracer.propagate().extract(request) { carrier, classifier ->
390+
val headerContext: AgentSpan.Context.Extracted? = tracer.propagate().extract(request) { carrier, classifier ->
389391
val headers = carrier.headers.toMultimap()
390392
.map { it.key to it.value.joinToString(";") }
391393
.toMap()
@@ -847,17 +849,35 @@ internal constructor(
847849
internal const val OKHTTP_INTERCEPTOR_HEADER_TYPES = "okhttp_interceptor_header_types"
848850

849851
private const val AGENT_PSR_ATTRIBUTE = "_dd.agent_psr"
852+
private const val WRITER_PROVIDER_INTERFACE_NOT_IMPLEMENTED_ERROR_MESSAGE =
853+
"The Tracing feature is not implementing the InternalCoreWriterProvider interface." +
854+
" No tracing data will be sent."
850855

851856
private val DEFAULT_LOCAL_TRACER_FACTORY: (SdkCore, Set<TracingHeaderType>) -> Tracer =
852857
{ sdkCore, tracingHeaderTypes: Set<TracingHeaderType> ->
853-
val propagationStyles = tracingHeaderTypes.joinToString(",")
854-
CoreTracer.CoreTracerBuilder((sdkCore as FeatureSdkCore).internalLogger)
858+
val featuredSdkCore = sdkCore as FeatureSdkCore
859+
val writer = featuredSdkCore.getFeature(Feature.TRACING_FEATURE_NAME)
860+
?.unwrap<Feature>()
861+
?.tryCastTo<com.datadog.android.trace.InternalCoreWriterProvider>()
862+
?.getCoreTracerWriter()
863+
?: run {
864+
sdkCore.internalLogger.log(
865+
InternalLogger.Level.ERROR,
866+
InternalLogger.Target.MAINTAINER,
867+
{ WRITER_PROVIDER_INTERFACE_NOT_IMPLEMENTED_ERROR_MESSAGE }
868+
)
869+
NoOpWriter()
870+
}
871+
872+
CoreTracer.CoreTracerBuilder(featuredSdkCore.internalLogger)
855873
.withProperties(
856874
Properties().apply {
875+
val propagationStyles = tracingHeaderTypes.joinToString(",")
857876
setProperty(TracerConfig.PROPAGATION_STYLE_EXTRACT, propagationStyles)
858877
setProperty(TracerConfig.PROPAGATION_STYLE_INJECT, propagationStyles)
859878
}
860879
)
880+
.writer(writer)
861881
.sampler(AllSampler())
862882
.build()
863883
}

0 commit comments

Comments
 (0)