Skip to content

Commit 9862507

Browse files
committed
RUM-9899: fix tag extractor + tracer interceptor
1 parent 4a77e9a commit 9862507

File tree

7 files changed

+80
-44
lines changed

7 files changed

+80
-44
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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.datadog.trace.api.sampling.PrioritySampling
3030
import com.datadog.trace.bootstrap.instrumentation.api.AgentScopeManager
3131
import com.datadog.trace.bootstrap.instrumentation.api.AgentTracer
3232
import com.datadog.trace.bootstrap.instrumentation.api.ScopeSource
33+
import com.datadog.trace.common.writer.NoOpWriter
3334
import com.datadog.trace.common.writer.Writer
3435
import com.datadog.trace.core.CoreTracer
3536
import com.datadog.trace.core.DDSpan
@@ -181,7 +182,7 @@ internal class OtelTracerBuilderProviderTest {
181182
assertThat(tracer).isNotNull
182183
val coreTracer: CoreTracer = tracer.getFieldValue("coreTracer")
183184
val writer: Writer = coreTracer.getFieldValue("writer")
184-
assertThat(writer).isInstanceOf(NoOpCoreTracerWriter::class.java)
185+
assertThat(writer).isInstanceOf(NoOpWriter::class.java)
185186
}
186187

187188
@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
@@ -386,7 +388,7 @@ internal constructor(
386388
val tagContext = request.tag(Span::class.java)?.context()
387389
?: request.tag(TraceContext::class.java)?.toAgentSpanContext()
388390

389-
val headerContext: AgentSpan.Context.Extracted = tracer.propagate().extract(request) { carrier, classifier ->
391+
val headerContext: AgentSpan.Context.Extracted? = tracer.propagate().extract(request) { carrier, classifier ->
390392
val headers = carrier.headers.toMultimap()
391393
.map { it.key to it.value.joinToString(";") }
392394
.toMap()
@@ -848,17 +850,35 @@ internal constructor(
848850
internal const val OKHTTP_INTERCEPTOR_HEADER_TYPES = "okhttp_interceptor_header_types"
849851

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

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

0 commit comments

Comments
 (0)